本文共 4476 字,大约阅读时间需要 14 分钟。
因为现在做的小程序,想要分享小程序中的页面给微信好友,那就可以使用二维码,很方便。
而且通过后台接口可以获取小程序任意页面的小程序码
扫描该小程序码可以直接进入小程序对应的页面,所有生成的小程序码永久有效
POST方法https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=ACCESS_TOKEN
import org.springframework.http.HttpEntity;import org.springframework.http.HttpMethod;import org.springframework.http.ResponseEntity;import org.springframework.util.LinkedMultiValueMap;import org.springframework.util.MultiValueMap;import org.springframework.web.client.RestTemplate;import java.io.*;import java.util.HashMap;import java.util.Map;public class QRCodeHelp { //生成活动二维码 public void createActQRCode() { String access_token = "你获取到的access_token" ; String path = "pages/index/huodong/huodong";//你小程序中页面的路径 RestTemplate rest = new RestTemplate(); InputStream inputStream = null; OutputStream outputStream = null; try { String url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?" + "access_token="+access_token; Mapparam = new HashMap<>(); param.put("scene", 参数值); param.put("page", path); param.put("width", 430); param.put("auto_color", false); Map 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); param.put("is_hyaline",false); MultiValueMap headers = new LinkedMultiValueMap<>(); HttpEntity requestEntity = new HttpEntity(param, headers); ResponseEntity entity = rest.exchange(url, HttpMethod.POST, requestEntity, byte[].class, new Object[0]); byte[] result = entity.getBody(); inputStream = new ByteArrayInputStream(result); //我将图片存储到了服务器中的ActQRImage文件夹下 File file = new File("/root/application/ActQRImage/1.png"); if (!file.exists()){ file.createNewFile(); } outputStream = new FileOutputStream(file); outputStream.write(result); outputStream.flush(); } catch (Exception e) { System.out.println("调用小程序生成微信永久小程序码URL接口异常"+e); } finally { if(inputStream != null){ try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } if(outputStream != null){ try { outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } }}
scene参数存放与获取:
后台生成了二维码之后,前端小程序也要进行操作来获取到scene中存放的参数。
1.如果只需要传一个参数 可以直接scene=参数值 例如:scene=123
onLoad:function(options){ if(options.scene){ // options 中的 scene 需要使用 decodeURIComponent 才能获取到生成二维码时传入的 scene var scene = decodeURIComponent(options.scene) }}2.如果两个及两个以上的参数 可以是scene = "id/"+id+"*userId/"+userId; 例如:scene=id/1*userId/2
这里自定义了scene的参数格式,以 / 代替 = ,以 * 代替 & 。
因为如果用正常的格式(例如:id=1&userId=2)会导致参数识别一部分,因为小程序在识别二维码页面参数时,拿到的参数列表是这样的scene=id=1&userId=2,这样就会导致只能识别id,id后的等号后面的参数全都无效了。所以这里用特 殊字符代替常规字符,然后获取之后再用js去解析,从而拿到参数列表。
onLoad:function getOptions(options){ // options 中的 scene 需要使用 decodeURIComponent 才能获取到生成二维码时传入的 scene var scene = decodeURIComponent(options.scene); var obj = {}; for (var i = 0; i < scene.split('*').length;i++){ var arr = scene.split('*')[i].split('/'); obj[arr[0]] = arr[1]; } return obj}
属性 | 类型 | 默认值 | 必填 | 说明 |
---|---|---|---|---|
access_token | string | 是 | 接口调用凭证(获取方式见另一博客) | |
scene | string | 是 | 最大32个可见字符,只支持数字,大小写英文以及部分特殊字符:!#$&'()*+,/:;=?@-._~ ,其它字符请自行编码为合法字符(因不支持% ,中文无法使用 urlencode 处理,请使用其他编码方式) | |
page | string | 主页 | 否 | 必须是已经发布的小程序存在的页面(否则报错),例如 pages/index/index , 根路径前不要填加 / ,不能携带参数(参数请放在scene字段里),如果不填写这个字段,默认跳主页面 |
width | number | 430 | 否 | 二维码的宽度,单位 px,最小 280px,最大 1280px |
auto_color | boolean | false | 否 | 自动配置线条颜色,如果颜色依然是黑色,则说明不建议配置主色调,默认 false |
line_color | Object | {"r":0,"g":0,"b":0} | 否 | auto_color 为 false 时生效,使用 rgb 设置颜色 例如 {"r":"xxx","g":"xxx","b":"xxx"} 十进制表示 |
is_hyaline | boolean | false | 否 | 是否需要透明底色,为 true 时,生成透明底色的小程序 |
如果调用成功,会直接返回图片二进制内容,如果请求失败,会返回 JSON 格式的数据。
返回的图片 Buffer
JSON
属性 | 类型 | 说明 |
---|---|---|
errcode | number | 错误码 |
errmsg | string | 错误信息 |
errcode 的合法值
值 | 说明 | |
---|---|---|
45009 | 调用分钟频率受限(目前5000次/分钟,会调整),如需大量小程序码,建议预生成。 | |
41030 | 所传page页面不存在,或者小程序没有发布 |
转载地址:http://hnzci.baihongyu.com/