「这是我参与2022首次更文挑战的第3天,活动详情查看:2022首次更文挑战」
前言
嗨大家好,随着近几年小程序在移动端的占有率越来越大,是不是的会接触到微信小程序开发的相关需求,本次将记录一次在某个项目中生成小程序二维码经历的风波,分享给大家,避免踩坑。
案例分析
需求
事情是这样的,在某次项目开发的过程中,需要用户可以展示自己的二维码,其他用户可以通过扫一扫扫描二维码之后,直接进入到小程序中,可以查看对方的某些信息。
分析
很简单的一个需求,在没有经历过微信小程序开发的开发者思路中直接想到是
- 方案一:直接将需要展示的信息生成二维码,其他用户扫描之后展示信息或者跳转到指定连接。
- 方案二:查询小程序是否有专们提供的接口,生成小程序码。
比较方案一:很多都是想到基于用户的某些信息,直接生成一个二维码,然后供其他用户进行扫描,然后展示基本的信息或者跳转到指定的urlH5页面中。但仔细读取需求会发现,生成的二维码,其他用户扫描之后,需要进入到小程序中,查询用户的某些特定信息。按普通的生成二维码的方式是无法实现的,那么只能调用微信小程序提供的接口生成相关的二维码信息。方案二:根据微信小程序开发者文档中描述的,调用指定的接口,获取小程序的二维码信息。通过比较之后,采用方案二执行更合理。
执行方案二
通过查阅开发者文档发现,小程序已经为我们提供了通过后台接口获取小程序任意页面的小程序码,并且其他用户扫描该小程序码可以直接进入小程序对应的页面,所有生成的小程序码永久有效,可放心使用。 我们推荐生成并使用小程序码,它具有更好的辨识度,且拥有展示“公众号关注组件”等高级能力。
并且提供了两个生成小程序码的接口为满足不同需求和场景,这里提供了两个接口,开发者可挑选适合自己的接口。
- 接口 A: 适用于需要的码数量较少的业务场景,生成小程序码,可接受 path 参数较长,生成个数受限,数量限制。
- 接口 B:适用于需要的码数量极多的业务场景,生成小程序码,可接受页面参数较短,生成个数不受限。
快速开始
熟悉接口
请求接口为:
https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=ACCESS_TOKEN
请求方式为:
post
请求参数
| 参数名称 | 参数类型 | 是否必填 | 参数描述 |
|---|---|---|---|
| scene | string | 是 | 参数信息 |
| page | string | 否 | 跳转指定小程序页面 |
| check_path | boolean | 否 | 检查page 是否存在 |
| env_version | string | 否 | 要打开的小程序版本 |
| width | number | 否 | 小程序码生成的大小px |
| auto_color | boolean | 否 | 自动配置线条颜色 |
| line_color | Object | 否 | 二维码线条颜色 |
| is_hyaline | boolean | 否 | 是否需要透明底色 |
返回值 如果成功则返回二维码的图片Buffer即基于base64的字符串码。 如果返回失败,则有具体的errcode
获取access_token
在我们获取二维码之前,首先需要获取的是小程序的 access_token。 access_token是小程序全局唯一后台接口调用凭据。所以我们先调用接口获取凭证信息。具体代码如下:
/**
* 小阿杰
* 公众号:Java全栈架构师
* */
@Value("${test.wx.appid}")
private String appId;
@Value("${test.wx.appSecret}")
private String appSecret;
String info = HttpUtil.get(WxUrlConfiguration.GET_WXTOKEN + "&appid=" + appId + "&secret=" + appSecret);
log.info("微信小程序获取二维码请求token接口,返回信息是:{}", info);
String accessToken = JacksonUtil.parseString(info, "access_token");
获取小程序码
上面已经获取access_token,下面就可以根据业务需求,获取小程序码了。思路如下:
- 1、创建RestTemplate,RestTemplate 是从 Spring3.0 开始支持的一个 HTTP 请求工具,支持POST、GET、等请求方式。
- 2、封装请求参数:Map<String, Object>,包含参数、路径、开发版本环境、是否校验路径、小程序码大小、小程序码颜色等
- 3、设置HttpEntity,HttpEntity表示http的request和resposne实体,它由消息头和消息体组成。
- 4、执行RestTemplate的exchange,获取请求结果。
- 5、将返回结果转为指定格式返回即可。
RestTemplate rest = new RestTemplate();
try {
String url = WxUrlConfiguration.GET_WXACODEUNLIMIT + accessToken;
Map<String, Object> param = new HashMap<>();
param.put("scene", sceneStr);
param.put("page", page);
param.put("width", Integer.parseInt(width));
param.put("auto_color", false);
param.put("env_version", envVersion);
Map<String, Object> line_color = new HashMap<>();
line_color.put("r", 0);
line_color.put("g", 0);
line_color.put("b", 0);
param.put("line_color", line_color);
log.info("调用生成小程序码请求参数是:{}" , param);
MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
HttpEntity requestEntity = new HttpEntity(param, headers);
ResponseEntity<byte[]> entity = rest.exchange(url, HttpMethod.POST, requestEntity, byte[].class, new Object[0]);
log.info("调用小程序码生成接口,返回结果:{}", entity.getBody());
byte[] result = entity.getBody();
String base64Str = Base64.getEncoder().encodeToString(result);
System.out.println(base64Str);
return base64Str;
} catch (Exception e) {
log.error("调用小程序码生成接口异常", e);
return null;
}
需要注意的是返回的字符串信息,需要展示位图片需要加图片头信息:data:image/jpg;base64 前缀,声明一下数据是图片数据信息,而且接口只能生成已发布的小程序的二维码,另外接口调用分钟频率受限(5000次/分钟),如需大量小程序码,建议预生成。
结语
好了,以上就是生成小程序二维码的过程,感谢您的阅读,希望您喜欢,如对您有帮助,欢迎点赞收藏。如有不足之处,欢迎评论指正。下次见。
作者介绍:【小阿杰】一个爱鼓捣的程序猿,JAVA开发者和爱好者。公众号【Java全栈架构师】维护者,欢迎关注阅读交流。