小程序二维码的生成有三个不同的接口,针对不同的场景需求
下文介绍的是第二种,也是用的最多的一种:适用于需要的码数量极多,或仅临时使用的业务场景
接口地址: 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。如在上文的代码中,需要对调用接口后返回的内容进行判断!