【微信小程序】微信小程序的接口调入 获取太阳码 根据返回值的类型进行接收,微信接口可能直接返回图片,也可能返回一个错误信息的json,同时兼容处理这两种情况

目录

    • 事件起因
    • 环境和工具
    • 操作过程
    • 解决办法
    • 遇到的一点问题
    • 结束语

事件起因

在开发一个关于微信小程序的过程中,有一个这样的需求,要求生成微信小程序的太阳码,然而这个东西的请求方式我们是这样的:我作为后端服务去请求这个太阳码的二维码,然后将获取到的太阳码二维码的图片返回给小程序端进行接收,然后小程序端进行一个展示

原本以为他们小程序端直接去请求那个图片就行了,但是最后商讨下来还是由我们后端去请求这个太阳码,然后返回给前端去展示
过程中就遇到一些数据请求和转换的问题,就先在这儿记录一下,以便后来者踩坑

环境和工具

java jdk1.8

操作过程

先是接口层,最后完成的版本是这样:

    @PostMapping("/getSunQRCode")@ApiOperation(value = "生成太阳码-获取小程序不限制的QR码", notes = "生成太阳码-获取小程序不限制的QR码")public Result<SunQRCodeVo> getUnlimitedQRCode(@RequestBody UnlimitedQRCodeDTO unlimitedQRCodeDTO, HttpServletResponse response) throws IOException {return newUserService.getUnlimitedQRCode(unlimitedQRCodeDTO);}

大致解释j就是一个post请求,然后这个请求返回的是一个封装后的实体的Result,然后内部的实体是一个字符串(之所以是字符串,是因为最后图片以base64编码的格式返回给前端的,不然就得以流的形式返回

然后就是具体的实现层的操作,大致操作如下:

通过微信的接口请求太阳码 ----》将拿到的太阳码转换为对应的图片格式(微信那边默认返回的是jpeg格式,因为前端的要求,需要转换为png的格式,然后再转换为对应的base64的字符串,然后再返回给前端) ----》转换为base64的格式,封装实体返回给前端。

解决办法

最后的一个实现层的代码版本(这个代码有个优势:就是可以根据微信接口的返回内容,如果请求正确,微信的这个接口它会直接返回buffer的图片,但如果请求有问题,它的返回内容又是一个json,所以这种情况可以根据返回的内容去判断,然后再具体去考虑如何接收

import org.springframework.web.client.RestTemplate;@Service("NewUserService")
public class NewUserServiceImpl extends BaseServiceImpl<NewUserDao, NewUserDO, BaseDTO> implements NewUserService {private static RestTemplate restTemplate;public static RestTemplate getRestTemplate() {if (null == restTemplate) {synchronized (RestTemplate.class) {if (null == restTemplate) {restTemplate = new RestTemplate();}}}return restTemplate;}/*** 获取微信小程序的小程序码*/@Overridepublic Result<SunQRCodeVo> getUnlimitedQRCode(UnlimitedQRCodeDTO unlimitedQRCodeDTO) throws IOException {Result<SunQRCodeVo> result = new Result<>();//先根据配置的appid等信息获取到tokenString accessToken = this.getAccessToken().getAccess_token();String url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + accessToken;//        byte[] qrCodeVo = getRestTemplate().postForObject(url, paramMap, byte[].class,
//                ContentType.APPLICATION_JSON);CloseableHttpClient client = HttpClients.createDefault();HttpPost request = new HttpPost(url);request.setHeader("Content-Type", "application/json");// 将json参数作为请求体发送JSONObject jsonParam = new JSONObject();jsonParam.put("scene",unlimitedQRCodeDTO.getScene());jsonParam.put("env_version",unlimitedQRCodeDTO.getEnv_version());jsonParam.put("page",unlimitedQRCodeDTO.getPage());jsonParam.put("width",unlimitedQRCodeDTO.getWidth()==null?"280":unlimitedQRCodeDTO.getWidth());StringEntity entity = new StringEntity(jsonParam.toString(), ContentType.APPLICATION_JSON);request.setEntity(entity);CloseableHttpResponse response = client.execute(request);// 获取响应头中的Content-Type字段Header contentTypeHeader = response.getFirstHeader("Content-Type");if (contentTypeHeader != null && contentTypeHeader.getValue().contains("image/jpeg")) {// 如果返回值是jpeg类型,以输入流的形式读取InputStream is = response.getEntity().getContent();//字节数组的输出流,用户辅助图片在流之间的格式转换ByteArrayOutputStream outputStream = new ByteArrayOutputStream();//将请求获取到的输入流 使用ImageIO转换为bufferedImage后以png的格式写入输出流,然后将输出流转换为字节数组,后面将字节数组转换为base64编码的字符串BufferedImage image = ImageIO.read(is);ImageIO.write(image, "png", outputStream);byte[] pngBytes = outputStream.toByteArray();outputStream.close();/* 该段注释代码 作用是byte[] buffer = new byte[1024];int length;while ((length = is.read(buffer)) != -1) {outputStream.write(buffer, 0, length);}byte[] data = outputStream.toByteArray();*///关闭创建的输入流inputStreamis.close();SunQRCodeVo sunQRCodeVo = new SunQRCodeVo();
//            sunQRCodeVo.setData(data);// 二进制数据字节数组 转base64编码的字符串sunQRCodeVo.setBase64buffer(Base64.getEncoder().encodeToString(pngBytes));sunQRCodeVo.setErrcode(0);result.setResult(sunQRCodeVo);return result;} else {// 如果返回值是json类型,则解析json数据BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));String line;StringBuilder sb = new StringBuilder();while ((line = reader.readLine()) != null) {sb.append(line);}reader.close();String json = sb.toString();JSONObject obj = new JSONObject(json);SunQRCodeVo sunQRCodeVo = new SunQRCodeVo();sunQRCodeVo.setErrcode(obj.getInt("errcode"));sunQRCodeVo.setErrmsg(obj.getString("errmsg"));return result.error500(obj.getString("errmsg"));}}//访问微信的服务器找到指定的小程序,获取登录public AccessTokenVo getAccessToken() {String url ="https://api.weixin.qq.com/cgi-bin/token?grant_type=" + GRANT_TYPE + "&appid=" + APPID + "&secret=" + SECRET;return getRestTemplate().getForObject(url, AccessTokenVo.class);}}

原本只贴了一个实现的方法,后面发现可能那个RestTemplate可能看不懂,就又给这个方法的import的包和在该实现层的具体实现给附加上了,上面代码中还有几个实体结构也在下面:

用于获取AccessTokenVo 的实体类:

@Data
public class AccessTokenVo {private String access_token;private Integer expires_in;/*** @description:* -1.系统繁忙,此时请开发者稍候再试* 0.请求成功* 40001.AppSecret 错误或者 AppSecret 不属于这个小程序,请开发者确认 AppSecret 的正确性* 40002.请确保 grant_type 字段值为 client_credential* 40013.不合法的 AppID,请开发者检查 AppID 的正确性,避免异常字符,注意大小写* @param: @param null* @return:* @author: liuanmin* @date: 2022/4/29*/private Integer errcode;private String errmsg;
}

用于封装返回请求的SunQRCode实体:

@Data
public class SunQRCodeVo {/*** 二进制流*/private byte[] data;/*** 图片二进制流转base64编码的字符串*/private String base64buffer;/*** 小程序返回的错误码*/private Integer errcode;/*** 小程序返回的错误信息*/private String errmsg;
}

遇到的一点问题

上面有一小段我注释里的代码,是之前遇到的一点问题,但是经过排查后发现的问题所在如下:

拿到请求的内容后我使用new一个字节数组的大小刚好与返回获取的流一样的大小去读取这个InputStream,结果读出来只有一部分,没有读取完,如下
在对这部分进行验证时:
在这里插入图片描述
inputstream的大小:
在这里插入图片描述
通过available方法获取到的大小只有8010,当前是win11系统
在这里插入图片描述
关于这个获取到的大小的问题,问了一下"万能"的chatgpt
在这里插入图片描述

顺便说一下,这段时间以来使用chatgpt的一个感受:
能用,确实也挺智能,在数据库的管理和代码的提示上能提供不小的帮助,但也有一些小毛病,比如说 突然崩了,有时候对话它逻辑跟不上,有时候反应慢,有时候不能根据前面指定内容进行继续回答,还有就是回答内容过长时会断,让它继续输出时,中间会缺失部分内容;还有部分问题太细太专业,它也回答不了。
你描述得越准确,它的回答就越符合你的期望,将你的背景,使用情况描述得越清楚,就越贴近你想要的结果。

结束语

若是对你有所帮助的话,希望能获得你的 点赞、评论、收藏,这将是对我很大的鼓励!!! 这对我真的很重要!!!
蟹蟹٩(‘ω’)و

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/9194.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何设计开放平台接口与集成chatgpt

如何设计开放平台接口与集成chatgpt 文章目录 如何设计开放平台接口与集成chatgpt前言一、Token机制生成方式有哪些session存在的问题JWT如何解决session存在的问题 二、AppId、AppSecretAppId机制签名机制 三 码上实现客户端注意 源码地址配置 前言 前一段时间&#xff0c;突…

ChatGPT研究(二)——ChatGPT助力跨模态AI生成应用

✏️写作&#xff1a;个人博客&#xff0c;InfoQ&#xff0c;掘金&#xff0c;知乎&#xff0c;CSDN &#x1f4e7;公众号&#xff1a;进击的Matrix &#x1f6ab;特别声明&#xff1a;创作不易&#xff0c;未经授权不得转载或抄袭&#xff0c;如需转载可联系小编授权。 前言 …

《花雕学AI》12:从ChatGPT的出现看人类与人工智能的互补关系与未来发展

马云说道&#xff0c;ChatGPT这一类技术已经对教育带来挑战&#xff0c;但是ChatGPT这一类技术只是AI时代的开始。 谷歌CEO桑德尔皮猜曾说&#xff1a;“人工智能是我们人类正在从事的最为深刻的研究方向之一&#xff0c;甚至要比火与电还更加深刻。” 360周鸿祎认为&#xf…

论文谷歌翻译:SinGAN(代码开源)

论文地址&#xff1a;https://arxiv.org/abs/1905.01164 代码地址&#xff1a;http://webee.technion.ac.il/people/tomermic/SinGAN/SinGAN.htm 摘要 提出了 SinGAN&#xff0c;这是一个可以从单张自然图像学习的非条件性生成式模型。模型可以捕捉给定图像中各个小块内的内在…

最好最常用的国外邮箱推荐!注册非常简单!

大家都知道&#xff0c;接送和发送电子邮件是我们日常不可避免的&#xff0c;不管是个人也好&#xff0c;企业也好&#xff0c;都需要邮箱来处理一些东西。 当然现在的通讯比较发达&#xff0c;打电话、短信、QQ或者微信都可以进行交流沟通&#xff0c;也可以发送些简单的文件…

编译器技术的演进与变革

在过去的数十年里&#xff0c;摩尔定律一直支配着半导体行业的发展路线&#xff0c;随着晶体管尺寸的不断变小单个芯片上集成的晶体管数量越来越多。 最新的 NVIDIA A100 GPU 单个芯片集成了 540 亿个晶体管&#xff0c;而嵌入式系统级芯片&#xff08;System on Chip&#xff…

2023年美赛A题赛后总结

文章目录 心路历程1. 选题2. 初次建模3. 数据收集4. 二次建模5. 算法实现以及优化6.全英论文撰写 总结 心路历程 2023年美赛是在2月17号早上6点到2月21号早上8点这期间举行的&#xff0c;美赛开赛前一天我们三个人还在考期末考&#xff0c;甚至美赛刚开始前两天有位队友每天还…

概率统计极简入门:通俗理解微积分/期望方差/正态分布前世今生(23修订版)

原标题&#xff1a;数据挖掘中所需的概率论与数理统计知识(12年首次发布&#xff0c;23年重编公式且反复改进) 修订背景 本文初稿发布于12年年底&#xff0c;十年后的22年底/23年初ChatGPT大火&#xff0c;在写ChatGPT通俗笔记的过程中&#xff0c;发现ChatGPT背后技术涉及到了…

ChatGPT 插件(八个插件,个个优秀)

webpilot——联网搜索图片、视频、文档、人脉等 1. 有哪些免费的高清无版权的图片网站&#xff0c;请从这些网站里找一些图片给我&#xff0c;图片搜索关键词为:Shanghai aerial&#xff0c;把图片的url链接发我&#xff1b; 2. 有哪些免费的GIF图片网站&#xff0c;请从这些网…

从ChatGPT看AI未来趋势和挑战 | 万字长文

ChatGPT 持续成为大家关注的焦点&#xff0c;开启通用人工智能(AGI)之门。北京交通大学桑基韬教授和于剑教授撰写的《从ChatGPT看AI未来趋势和挑战》&#xff0c;详述了ChatGPT 的“能”与“不能”&#xff0c;AI中什么是“真”以及AI的未来趋势&#xff0c;非常值得关注&#…

高等数学(第七版)同济大学 习题1-1 个人解答

高等数学&#xff08;第七版&#xff09;同济大学 习题1-1 函数作图软件&#xff1a;Mathematica 部分图片采用ChatGPT生成 1. 求下列函数的自然定义域 \begin{aligned}&1. 求下列函数的自然定义域&&&&&&&&&&&&&&am…

大佬太快了 !这本ChatGPT、AI绘画的书籍免费赠送给大家 !

a15a 著&#xff0c;贾雪丽&#xff0c;0xAres&#xff0c;张炯 编 电子工业出版社-博文视点 2023-04-01 ISBN: 9787121353932 定价: 79.00 元 新书推荐 &#x1f31f;今日福利 &#xff5c;关于本书&#xff5c; 《一本书读懂AIGC&#xff1a;ChatGPT、AI绘画、智能文明与生产…

ChatGPT生成 SD 和 Midjourney 的提示(prompt)

探索Midjourney之旅&#xff0c;学习绘画与AI&#xff0c;一同成长。加入「阿杰与AI」公众号&#xff0c;参与内容社群建设。 1.Midjourney 新手快速起步指南2.Prompts-提示指令3.Explore Prompting-提示指令的探索4.Blend-叠加5.Midjourney Discord的使用手册6.Versions-版本…

人工智能前沿——6款AI绘画生成工具

>>>深度学习Tricks&#xff0c;第一时间送达<<< 目录 一、【前言】 二、【6款AI绘画生成工具】 1.DeepAI 2.NightCafe 3.Deep Dream Generator 4.StarryAI 5.Fotor 6.Pixso 一、【前言】 AI不仅影响商业和医疗保健等行业&#xff0c;还在创意产业中…

AI绘画工具+ChatGPT,新时代的倚天剑屠龙刀

当下&#xff0c;人工智能正对各个领域产生深远影响。其中&#xff0c;AI绘画工具和ChatGPT影响更为广泛。 AI绘画工具可以根据文本描述自动生成图像&#xff0c;属于计算机视觉和生成模型的结合。譬如&#xff0c;输入“一只白色的鸟&#xff0c;站在枯枝上&#xff0c;背景是…

使用ChatGPT为Stable Diffusion生成画面的关键词

在使用SD进行绘图的时候常常苦于某个换面想不到关键词,可以通过ChatGPT模板批量生成关键词。 先来看下演示效果。 案例结果 这个例子是根据古诗《陋室铭》编写的关键词描述。 仿照例子,并不局限于我给你的单词,给出一套详细描述“山不在高,有仙则名。”的prompt,注意…

如何让ChatGPT生成Midjourney提示词

​关注文章下方公众号&#xff0c;即可免费获取AIGC最新学习资料 导读&#xff1a;最近AI绘画非常的火&#xff0c;今天我们看ChatGPT如何生成Midjourney提示词&#xff0c;让AI教AI做事。 本文字数&#xff1a;900&#xff0c;阅读时长大约&#xff1a;3分钟 正如 Midjourney…

ChatGPT 为 Midjourney 或 DALL-E 等 AI 艺术生成提示

人工智能为创意产业开辟了一个充满可能性的全新世界。人工智能最令人兴奋的应用之一是生成独特的原创艺术作品。Midjourney 和 DALL-E 是人工智能生成艺术的两个突出例子&#xff0c;它们已经引起了艺术家和艺术爱好者的关注。在本文中&#xff0c;将探索如何使用 ChatGPT 为 A…

【文献阅读】“ChatGPT: Jack of all trades, master of none”

【文献阅读】“ChatGPT: Jack of all trades, master of none” 摘要背景问题任务介绍研究方法ChatGPT对话示例衡量指标 量化分析ChatGPT “博而不精”任务难易程度与ChatGPT 的表现随机上下文小样本个性化对话上下文对生成结果的影响是否用测试数据集来微调对性能表现的影响 质…

QQ邮箱验证码登录(移动端邮箱验证登录)

获取邮箱授权码 登录邮箱------->点击设置------->点击账户&#xff0c;下拉------->找到POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务------->按照步骤开启POP3/SMTP服务 ------->获取授权码 2.在pom.xml中添加依赖&#xff1a; <!--mail--><depend…