转载

微信小程序码生成及可能存在的坑

小程序二维码的生成有三个不同的接口,针对不同的场景需求

下文介绍的是第二种,也是用的最多的一种:适用于需要的码数量极多,或仅临时使用的业务场景

接口地址: 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。如在上文的代码中,需要对调用接口后返回的内容进行判断!

原文  https://segmentfault.com/a/1190000019956640
正文到此结束
Loading...