小程序二维码的生成有三个不同的接口,针对不同的场景需求
下文介绍的是第二种,也是用的最多的一种:适用于需要的码数量极多,或仅临时使用的业务场景
接口地址:https://api.weixin.qq.com/wxa...
注意:通过该接口生成的小程序码,永久有效,数量暂无限制。用户扫描该码进入小程序后,开发者需在对应页面获取的码中 scene 字段的值,再做处理逻辑。使用如下代码可以获取到二维码中的 scene 字段的值。调试阶段可以使用开发工具的条件编译自定义参数 scene=xxxx 进行模拟,开发工具模拟时的 scene 的参数值需要进行 urlencode
// 这是首页的 js
Page({
onLoad: function(options) {
// options 中的 scene 需要使用 decodeURIComponent 才能获取到生成二维码时传入的 scene
var scene = decodeURIComponent(options.scene)
}
})
如下内容为调用微信小程序二维码接口,生成小程序二维码图片的Java实现【构造post请求,调用微信接口】
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
//参数说明,QRCreateBean对象中传入自个需要的值。最主要的包括微信的accessToken以及小程序码要存储的内容
//要存储的内容放到了scene参数中,扫码后小程序要跳转的页面路径page参数对应
public static String createPoster(QRCreateBean qrCreateBean) throws Exception {
log.info("======生成微信小程序码开始=====");
String qrcodeName = "qr_" + qrCreateBean.getSerialNo();
long nowTime = System.currentTimeMillis();
//二维码图片
URL getCodeUrl = new URL("https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + qrCreateBean.getAccessToken());
HttpURLConnection httpURLConnection = (HttpURLConnection) getCodeUrl.openConnection();
httpURLConnection.setRequestMethod("POST");// 提交模式
httpURLConnection.setDoOutput(true);
httpURLConnection.setDoInput(true);
PrintWriter printWriter = new PrintWriter(httpURLConnection.getOutputStream());
JSONObject paramJson = new JSONObject();
//在上线之前测试的版本中,页面不能跳转,跳转页面的参数名定义为path,可在模拟器上进行测试
//paramJson.accumulate("scene", qrCreateBean.getSerialNo()).accumulate("path", "pages/goods/goods");
//上线后,跳转页面的参数需定义为page,否则会找不到跳转页面
paramJson.accumulate("scene", qrCreateBean.getSerialNo()).accumulate("page", "pages/goods/goods");
paramJson.put("auto_color", false);
JSONObject lineColor = new JSONObject();
lineColor.put("r", 0);
lineColor.put("g", 0);
lineColor.put("b", 0);
paramJson.put("line_color", lineColor);
printWriter.write(paramJson.toString());
printWriter.flush();
String contentType = httpURLConnection.getContentType();
if (contentType.contains("json")) {
log.info("调用微信小程序生成接口出错,token失效");
return "1";
} else {
BufferedInputStream bis = new BufferedInputStream(httpURLConnection.getInputStream());
//小程序码图片写出存储的路径
File file = new File("src\\main\\resources\\image\\" + qrcodeName + ".png");
OutputStream ost = new FileOutputStream(file);
int len;
byte[] arr = new byte[1024];
while ((len = bis.read(arr)) != -1) {
ost.write(arr, 0, len);
ost.flush();
}
ost.close();
log.info("========生成微信小程序码结束===========");
}
注意:
对于accessToken有一个坑
openId:是表示用户在你的当前应用中的唯一标示,比如小程序,微信公众号等,这些都算是一个应用,如果你有多个应用,同一个用户的openId可能并不相同
unionid:借用微信官方文档中的话来说,如果开发者拥有多个移动应用、网站应用、和公众帐号(包括小程序),可通过 UnionID 来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号(包括小程序),用户的 UnionID 是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,unionid是相同的
对于accessToken,微信程序码openId在同一时间用来掉用小程序码生成接口【使用appid以及secret调用生成(一个应用只有一个秘钥secret)】,只有一个有效,且有效期是5分钟。当有其他操作再获取accessToken时,之前的token会失效。所以每次在生成小程序二维码之前都要重新获取一下token。
如果用失效的accessToken去调用小程序码生成接口,返回内容为json格式的一个错误提示。若正常返回小程序码图片,返回内容的type为image/jepg。如在上文的代码中,需要对调用接口后返回的内容进行判断!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。