微信小程序03: 获取不限制的小程序二维码

全文目录,一步到位

  • 1.前言简介
    • 1.1 专栏传送门
      • 1.1.1 上文小总结
      • 1.1.2 上文传送门
  • 2. 获取不限制二维码操作
    • 2.1 准备工作
      • 2.1.1 请先复制00篇的统一封装代码
      • 2.1.2 修改配置文件中的参数
    • 2.2 具体代码使用与注释如下
      • 2.2.1 业务代码如下
      • 2.2.2 代码解释(一)[无需复制]
      • 2.2.3 创建Base64类
    • 2.3 运行并检查结果
      • 2.3.1 controller代码
      • 2.3.2 二维码请求对象dto代码
    • 2.4 异常总结与解决(相对全面)
      • 2.4.0 直接测试后发现问题
      • 2.4.1 (核心排查)使用微信官方接口测试查看问题
        • 导入curl数据方法(如图所示)
        • curl: 抓包数据如下(导入即可)
      • 2.4.2 解决方案
        • 异常一: (异常码41030)导入curl后, 报这个错误
        • 异常二: (异常码41030)无效的page参数(`很坑`)
        • 异常三: (异常码40169)scene过长无法生成
        • 异常N(`跳过`): 网络波动等访问超时/异常
      • 2.4.3 正确结果(微信扫码测试一下)
      • 2.4.4 接口请求测试
        • 特殊: 如果只能显示出一半
  • 3. 文章的总结与预告
    • 3.1 本文总结
    • 3.2 下文预告


1.前言简介

本篇细节很多, 我会在文章最后统一总结

1.1 专栏传送门

=> 小程序相关操作专栏 <=

1.1.1 上文小总结

上文主要是大多数微信小程序的整体封装, 代码共用, 而本篇只需要关心业务本身即可, 使用前请先复制上文的代码后使用(请看1.1.2文章传送门)

1.1.2 上文传送门

微信小程序00: 公共封装配置(核心篇)

2. 获取不限制二维码操作

2.1 准备工作

2.1.1 请先复制00篇的统一封装代码

这里强调一下

请先复制核心篇: ===> 微信小程序-00 小程序统一封装类
请先阅读上一篇: ===> 微信小程序01: springboot获取accessToken方式

2.1.2 修改配置文件中的参数

例如appid等, 均在
在这里插入图片描述

2.2 具体代码使用与注释如下

2.2.1 业务代码如下

AjaxResult统一返回值对象 随意写
第二步的userService代表您的业务, 随意写
记得@Autowired一下

    /*** 获取注册二维码** @param wxCodeUnlimitedReqDTO 请求对象* @return AjaxResult*/@SneakyThrowspublic AjaxResult getRegisterQrcode(WxCodeUnlimitedReqDTO wxCodeUnlimitedReqDTO) {//1.获取access_tokenString accessToken = wechatServiceUtils.getRedisCacheAccessToken();//2. 处理scene值String scene = userService.getUserRelationScene(wxCodeUnlimitedReqDTO);//3. 获取微信不限制二维码的input输入流InputStream inputStream = wechatServiceUtils.getUnlimitedWxQrCode(wxCodeUnlimitedReqDTO.setScene(scene), accessToken);//3. byte的nio流直接转换为base64String base64Str = Base64.changeInputIOToBase64A(inputStream);Map<String, String> map = new HashMap<>();map.put("imgBase64", "data:image/png;base64," + base64Str);map.put("scene", scene);//4. 返回结果return AjaxResult.success("操作成功!", map);}

2.2.2 代码解释(一)[无需复制]

wechatServiceUtils.getUnlimitedWxQrCode() 统一封装 获取不限制二维码操作
其中使用了restTemplate远程调用微信官方接口
通过ByteArrayInputStream直接将byte转换为InputStream

  • 这块还是有其他写法的 (import org.springframework.core.io.Resource;)
  • 这个能看到整个接口的返回信息 报错信息等 二选一即可
//方案二:(需要替换WechatServiceUtils类中对应方法)
ResponseEntity<Resource> responseEntity = restTemplate.exchange(wechatConfigProperties.getWxACodeUnLimitUrl(accessToken), HttpMethod.POST, new HttpEntity<>(params, headers), Resource.class);
log.info("==> 微信二维码返回参数: {} <==", responseEntity);
// 从响应体中获取输入流
InputStream inputStream = Objects.requireNonNull(responseEntity.getBody()).getInputStream();

微信文档位置: => 微信小程序获取不限制二维码 <=

 	/*** 生成小程序带参数二维码*/@SneakyThrowspublic InputStream getUnlimitedWxQrCode(WxCodeUnlimitedReqDTO wxCodeUnlimitedReqDTO, String accessToken) {Map<String, Object> params = new HashMap<>();params.put("scene", wxCodeUnlimitedReqDTO.getScene());params.put("page", wxCodeUnlimitedReqDTO.getPage());params.put("path", wxCodeUnlimitedReqDTO.getPage());params.put("env_version", wxCodeUnlimitedReqDTO.getEnvVersion());params.put("width", wxCodeUnlimitedReqDTO.getWidth());params.put("auto_color", wxCodeUnlimitedReqDTO.getAutoColor());//自动配置线条颜色ResponseEntity<byte[]> response = restTemplate.postForEntity(wechatConfigProperties.getWxACodeUnLimitUrl(accessToken), JSON.toJSONString(params), byte[].class);System.out.println(JSON.toJSONString(params));byte[] buffer = response.getBody();assert buffer != null;return new ByteArrayInputStream(buffer);}/*** 远程调用 restTemplate方法 post请求*/public <T> T sendPostRestTemplate(String url, Map<String, Object> body, Class<T> responseType) {return restTemplate.exchange(url, HttpMethod.POST, new HttpEntity<>(body, null), responseType).getBody();}

2.2.3 创建Base64类

里面有几个方法 选一个即可 changeInputIOToBase64A()

 /*** 方法一: IO: 转换输入流->Base64* @param in* @return*/public static String changeInputIOToBase64A(InputStream in) {// 将图片文件转化为字节数组字符串,并对其进行Base64编码处理byte[] data = null;String encode = null; // 返回Base64编码过的字节数组字符串// 对字节数组Base64编码org.apache.commons.codec.binary.Base64 encoder = new org.apache.commons.codec.binary.Base64();try {// 读取图片字节数组data = new byte[in.available()];in.read(data);encode = encoder.encodeToString(data);} catch (IOException e) {e.printStackTrace();} finally {try {in.close();} catch (IOException e) {e.printStackTrace();}}return encode;}/*** 方法二: IO: 转换输入流->Base64*/public static String changeInputIOToBase64B(InputStream inputStream) {byte[] data = null;try (ByteArrayOutputStream swapStream = new ByteArrayOutputStream()) {byte[] buff = new byte[100];int rc = 0;while ((rc = inputStream.read(buff, 0, 100)) > 0) {swapStream.write(buff, 0, rc);}data = swapStream.toByteArray();} catch (IOException e) {e.printStackTrace();} finally {if (inputStream != null) {try {inputStream.close();} catch (IOException e) {e.printStackTrace();}}}return java.util.Base64.getEncoder().encodeToString(data);}/*** 关流功能** @param inputStream 输入流* @throws IOException 异常*/public static void closeInputStream(InputStream inputStream) throws IOException {try {if (inputStream != null) {inputStream.close();}} catch (IOException e) {e.printStackTrace();}}

2.3 运行并检查结果

2.3.1 controller代码

模拟-获取注册二维码

   /*** 获取注册二维码*/@PostMapping("/getQrcode")public AjaxResult getQrcode(@RequestBody WxCodeUnlimitedReqDTO wxCodeUnlimitedReqDTO) {log.info("===> 获取注册二维码 <===");log.info(JSONObject.toJSONString(wxCodeUnlimitedReqDTO));return loginService.getQrcode(wxCodeUnlimitedReqDTO);}

2.3.2 二维码请求对象dto代码

微信生成不限制小程序二维码请求dto


import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;/*** 微信生成不限制小程序二维码请求dto* @author pzy* @version 0.1.0* @description: TODO*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class WxCodeUnlimitedReqDTO {/*** 最大32个可见字符,只支持数字,* 大小写英文以及部分特殊字符:!#$&'()*+,/:;=?@-._~,* 其它字符请自行编码为合法字符(因不支持%,中文无法使用 urlencode 处理,请使用其他编码方式)*/private String scene;/*** 页面 page,例如 pages/index/index*/private String page;/*** 检查 page 是否存在,为 true 时 page 必须是已经发布的小程序存在的页面*/private Boolean checkPath = Boolean.FALSE;/*** 要打开的小程序版本。正式版为 release,体验版为 trial,开发版为 develop*/private String envVersion = "release";/*** 二维码的宽度,单位 px,最小 280px,最大 1280px*/private Integer width;/*** 自动配置线条颜色*/private Boolean autoColor = Boolean.FALSE;/*** 注册的用户角色*/private Integer registerUserRole;/*** (平台业务员1)帮助注册的公司id*/private Long registerCompanyId;}

2.4 异常总结与解决(相对全面)

2.4.0 直接测试后发现问题

base64很短 访问后是这样的 如图所示
先看2.4.1(很重要) 不行在排查代码
在这里插入图片描述

2.4.1 (核心排查)使用微信官方接口测试查看问题

直接使用postman/apipost等 进行测试访问
如果返回的base64能在浏览器展示出来 则代码出现问题
反之 则您的 accessToken/path路径存在问题
curl(抓包数据)如下: 直接导入即可 修改accessToken和path

导入curl数据方法(如图所示)

在这里插入图片描述

curl: 抓包数据如下(导入即可)
curl --request POST \--url 'https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=77_TUdWM60vBoa3FofIKUQ8piUkH4Jd555A4Mknt19tKVyEPNUJ2bOyAHVGc_7iXiJs7ElXXjhs9IrOSD2JI1E5_Q3vWUXbRX0Z9YrDeLC9hEqSentISFSBRv9sbZgXMBjABAAP6' \--header 'content-type: application/json' \--data '{"width": 480,"auto_color": false,"page": "pages/index/index","scene": "762350390017339392","env_version": "trial"
}'

2.4.2 解决方案

场景: 用postman/apipost导入curl直接请求官方接口报错信息

异常一: (异常码41030)导入curl后, 报这个错误

则为: accessToken过期了 更换一个新的即可(如图所示)
文章传送门: => 微信小程序01: springboot获取accessToken方式
在这里插入图片描述

异常二: (异常码41030)无效的page参数(很坑)

特别注意: 这个page必须是正式版中存在的路径(pages/index/index是默认存在的)
其他路径需要上传并发布正式版后 并且验证路径真实存在后才可以使用
否则不可以生成二维码
如果默认的可以生成 其他路径均不可以生成 请联系前端打正式版并发布解决
在这里插入图片描述

异常三: (异常码40169)scene过长无法生成

微信文档中 不限制类型的scene有长度限制32位字符 超过则无法生成
在这里插入图片描述

异常N(跳过): 网络波动等访问超时/异常

换个网络试试, 代理关了等等(跳过)

2.4.3 正确结果(微信扫码测试一下)

其中 scene和env_version均可调整
在这里插入图片描述

2.4.4 接口请求测试

成功的参数复制到java接口参数json中进行代码测试
如果能正确展示base64 并且在网页中展示正常 则为成功(如图)
在这里插入图片描述

特殊: 如果只能显示出一半
  1. 调整width大小(一般没用)
  2. 调整base64方法
  3. 调整restTemplate方法

3. 文章的总结与预告

3.1 本文总结

  1. 使用00篇中的方法获取accessToken
  2. 获取不限制二维码
  3. 调整部分参数, 遇到问题 如 2.4中提到及解决方案
  4. base64转换
  5. restTemplate使用

3.2 下文预告

微信小程序04: 获取openId与unionId



@author: pingzhuyan
@description: ok
@year: 2024

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

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

相关文章

html--瀑布效果

<!doctype html> <html> <head> <meta charset"utf-8"> <title>瀑布效果</title><style> body {background: #222;color: white;overflow:hidden; }#container {box-shadow: inset 0 1px 0 #444, 0 -1px 0 #000;height: 1…

Sakura编辑器

1、sakura左右上下分屏不让联动设置

Java中Maven的依赖管理

依赖介绍 是指当前项目运行所需要的jar包&#xff0c;一个项目中可以引入多个依赖 配置 在pom.xml中编写<dependencies>标签 在<dependencies>中使用<dependency>引入标签 定义坐标的groupId、rtifactId、version 点击刷新按钮、引入新坐标 例如引入下…

从零开始:搭建PXE远程批量安装服务器

在大规模服务器部署时&#xff0c;面对成百上千台服务器&#xff0c;通过手动插入光盘或者USE驱动器来安装操作系统无比繁琐&#xff0c;让大量工程师在现场挨个安装系统也不切实际&#xff0c;PXE的出现使得网络远程批量自动安装和配置操作系统成为现实。 什么是PXE&#xff1…

nginx模型设计和进程讲解

一. Nginx进程模型解析 1. master主进程 和 worker工作进程 [rootlocalhost sbin]# ps -ef|grep nginx root 15411 1 0 21:08 ? 00:00:00 nginx: master process ./nginx nobody 15412 15411 0 21:08 ? 00:00:00 nginx: worker process root…

YzmCMS 7.0任意函数调用RCE 漏洞研究分析

YzmCMS是一款基于YZMPHP开发的一套轻量级开源内容管理系统,YzmCMS简洁、安全、开源、免费,可运行在Linux、Windows、MacOSX、Solaris等各种平台上,专注为公司企业、个人站长快速建站提供解决方案。 YzmCMS 某些接口调用了 db_pdo类的where方法 导致了远程命令执行漏洞&#xf…

上市公司财务困境模型​MertonDD、OScore、RLPM、ZScore四种模型​(1992-2022年)

01、数据介绍 上市公司财务困境模型是用于预测和评估上市公司是否可能陷入财务困境的一种模型。这个模型通常基于一系列的财务比率和其他相关变量&#xff0c;通过统计分析方法来构建。​ 数据名称&#xff1a;上市公司财务困境模型MertonDD、OScore、RLPM、ZScore五种模型 …

电脑提示mfc140u.dll文件丢失了?怎么快速修复mfc140u.dll文件

当你的电脑提示你的mfc140u.dll文件丢失了&#xff0c;那么就要小心了&#xff0c;可能你的某些程序出问题了&#xff01;这时候需要我们去进行相关的修复&#xff0c;只有修复了这个mfc140u.dll文件&#xff0c;才能正常的使用某些程序。下面一起来了解一下mfc140u.dll文件吧。…

download_file、download

download_file源码 def download_file(url: str, fname: str, chunk_size1024):"""Helper function to download a file from a given url"""resp requests.get(url, streamTrue)total int(resp.headers.get("content-length", 0))…

uni-app安卓本地打包个推图标配置

如果什么都不配置&#xff0c;默认的就是个推小鲸鱼图标 默认效果 配置成功效果 个推图标配置 新建目录 drawable-hdpi、drawable-ldpi、drawable-mdpi、drawable-xhdpi、drawable-xxhdpi、drawable-xxxhdpi 目录中存放图标 每个目录中存放对应大小的图标&#xff0c;大图…

Oracle到PostgreSQL的不停机数据库迁移

1970 年&#xff0c;数据库之父 Edgar Frank Codd 发表了“数据的关系模型”论文&#xff0c;该论文为往后的关系型数据库的发展奠定了基础。1979 年&#xff0c;基于关系模型理论的数据库产品 Oracle 2 首次亮相&#xff0c;并在过去的三四十年时间里&#xff0c;横扫全球数据…

什么是web3D?应用场景有哪些?如何实现web3D展示?

Web3D是一种将3D技术与网络技术完美结合的全新领域&#xff0c;它可以实现将数字化的3D模型直接在网络浏览器上运行&#xff0c;从而实现在线交互式的浏览和操作。 Web3D通过将多媒体技术、3D技术、信息网络技术、计算机技术等多种技术融合在一起&#xff0c;实现了它在网络上…

Hadoop3:HDFS的架构组成

一、官方文档 我这里学习的是Hadoop3.1.3版本&#xff0c;所以&#xff0c;查看的也是3.1.3版本的文档 Architecture模块最下面 二、HDFS架构介绍 HDFS架构的主要组成部分&#xff0c;是一下四个部分 1、NameNode(NN) 就是Master节点&#xff0c;它是集群管理者。 1、管…

word格式技巧

文章目录 论文格式技巧论文交叉引用怎么弄论文的页码怎么弄 论文格式技巧 论文交叉引用怎么弄 1.取消文献原有的编号 2.定义新编号 3.具体编号设置 4.在引用的地方插入&#xff0c;具体引用选项卡–>交叉引用–>选择后插入 2. 4. 论文的页码怎么弄 假设我们有这样一…

SpringBoot @DS注解 和 DynamicDataSource自定义实现多数据源的2种实现方式

前言 在实际的项目中&#xff0c;我们经常会遇到需要操作多个数据源的情况&#xff0c;SpringBoot为我们提供了多种实现多数据源的方式。本文将介绍两种常见的方式&#xff1a;使用DS注解实现多数据源的切换以及使用DynamicDataSource自定义实现多数据源的切换。 我们将分别介…

[SWPUCTF 2021 新生赛]PseudoProtocols、[SWPUCTF 2022 新生赛]ez_ez_php

[SWPUCTF 2021 新生赛]PseudoProtocols 打开环境&#xff0c;提示hint.php就在这里&#xff0c;且含有参数wllm 尝试利用PHP伪协议读取该文件 ?wllmphp://filter/convert.base64-encode/resourcehint.php//文件路径php://filter 读取源代码并进行base64编码输出。 有一些敏…

scikit-learn实现单因子线性回归模型

1.是什么&#xff1a; 针对机器学习提供了数据预处理&#xff0c;分类&#xff0c;回归等常见算法的框架 2.基于scikit-learn求解线性回归的问题&#xff1a; 2.1.求解a&#xff0c;b对新数据进行预测&#xff1a; 2.2评估模型表现&#xff08;y和y’的方差MSE&#xff09;…

Python轴承故障诊断 (18)基于CNN-TCN-Attention的创新诊断模型

往期精彩内容&#xff1a; Python-凯斯西储大学&#xff08;CWRU&#xff09;轴承数据解读与分类处理 Python轴承故障诊断 (一)短时傅里叶变换STFT Python轴承故障诊断 (二)连续小波变换CWT_pyts 小波变换 故障-CSDN博客 Python轴承故障诊断 (三)经验模态分解EMD_轴承诊断 …

【Linux系列】file命令

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

hadoop学习---基于Hive的数据仓库相关函数机制及其优化方案

Hive相关函数&#xff08;部分&#xff09;&#xff1a; if函数: 作用: 用于进行逻辑判断操作 语法: if(条件, true返回信息,false返回信息) 注意: if函数支持嵌套使用 select if(aa,’bbbb’,111) fromlxw_dual; bbbb select if(1<2,100,200) fromlxw_dual; 200nvl函数:…