java获取微信小程序码和小程序二维码

一、小程序码和小程序二维码简介

首先,奉上微信官方文档:获取小程序码 - https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/qr-code.html

其实文档已经描述的很清楚,微信官方提供两种生成小程序码和一种生成小程序二维码的方式(三种方式对应的是三个不同的接口):

  1. 适用于需要的码数量较少的业务场景

    生成小程序码,可接受 path 参数较长,生成个数受限,请谨慎使用。接口路径:

    POST https://api.weixin.qq.com/wxa/getwxacode?access_token=ACCESS_TOKEN

  2. 适用于需要的码数量极多的业务场景

    生成小程序码,可接受页面参数较短,生成个数不受限。接口路径:

    POST https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=ACCESS_TOKEN

  3. 适用于需要的码数量较少的业务场景

    生成二维码,可接受 path 参数较长,生成个数受限。接口路径:

    POST https://api.weixin.qq.com/cgi-bin/wxaapp/createwxaqrcode?access_token=ACCESS_TOKEN

这里,需要先解释清楚几点疑惑:

1、小程序码和小程序二维码有什么区别?

请看下图:

java获取微信小程序码和小程序二维码_第1张图片图1 小程序码
java获取微信小程序码和小程序二维码_第2张图片图2 小程序二维码

2、接口1和接口3中的个数限制到底是多少?

微信官方描述:接口 1 加上接口 3,总共生成的码数量限制为 100,000,请谨慎使用

3、每个接口生成的码,可接受的页面参数具体有多少?

  • 接口1:参数名path表示扫码进入的小程序页面路径,最大长度 128 字节,不能为空
  • 接口2:参数名page必须是已经发布的小程序存在的页面(否则报错),例如 pages/index/index, 根路径前不要填加 /,不能携带参数(参数请放在scene字段里),如果不填写这个字段,默认跳主页面

    参数名scene表示扫码后的携带的业务参数,最大32个可见字符,只支持数字,大小写英文以及部分特殊字符:!#$&’()*+,/:;=?@-._~
  • 接口3:参数名path表示扫码进入的小程序页面路径,最大长度 128 字节,不能为空

二、常用小程序码开发流程及示例

首先,根据微信官方描述,可明白获取二维码的套路都一样,只不过不同的二维码的请求路径和参数有些区别而已,具体步骤大致分为以下几步(以下流程以微信提供的接口2作为示例,此接口使用最多):

1、 请求微信api,获取access_token

获取token的请求url:https://api.weixin.qq.com/cgi-bin/token

获取token的请求参数:

  • grant_type : client_credential
  • appid : 自己小程序的appId,注意:必须是已经发布的小程序!
  • secret : 自己小程序的secret,注意:必须是已经发布的小程序!

以下为获取token的示例代码**(请求微信url时,是https的post请求,此处忽略post请求的代码,网上到处都是0.0)**:

public static String getToken() {
    try {
        Map<String, String> map = new LinkedHashMap<String, String>();
        map.put("grant_type", "client_credential");
        map.put("appid", "自己的appId");// 改成自己的appid
        map.put("secret", "自己的secret"); //改成自己的secret
        String rt = sendPost("https://api.weixin.qq.com/cgi-bin/token", map);
        JSONObject json = JSONObject.fromObject(rt);
        if (json.getString("access_token") != null || json.getString("access_token") != "") {
            System.out.println("token:" + json.getString("access_token"));
            return json.getString("access_token");
        } else {
            return null;
        }
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

2、 根据生成的token和相关参数,请求微信api,生成小程序码

生成小程序码的请求url:https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=token

相关的请求参数(这里只标明常用的参数,其他参数可到微信官网查看):

  • scene : 微信扫码跳转目标页面时携带的参数
  • page : 扫码后跳转到小程序的目标路径,注意必须是已经发布的小程序存在的页面(否则报错)
  • width : 二维码的宽度,单位 px,最小 280px,最大 1280px
  • auto_color : 自动配置线条颜色,如果颜色依然是黑色,则说明不建议配置主色调,默认 false

以下为生成二维码的示例代码:

注意请求成功后,接收的返回值为返回的图片 Buffer,可根据具体情况处理,以下示例代码采用的是第二种方法

  1. 可将图片下载到本地,返回图片路径给前端
  2. 将图片Buffer用base64处理为流字符串返给前端页面
//sceneStr:链接到改小程序界面所要的参数
//accessToken:上一个方法中所生产的token
public static String getminiqrQr(String sceneStr, String accessToken) {
    RestTemplate rest = new RestTemplate();
    InputStream inputStream = null;
    OutputStream outputStream = null;
    try {
        String url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + accessToken;
        Map<String, Object> param = new HashMap<>();
        param.put("scene", sceneStr);
        param.put("page", "pages/index/index");
        param.put("width", 430);
        param.put("auto_color", false);
        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]);
        System.out.println("调用小程序生成微信永久小程序码URL接口返回结果:" + entity.getBody());
        byte[] result = entity.getBody();
        inputStream = new ByteArrayInputStream(result);

        String imageStr = EncryptUtil.base64Encode(inputStreamToByte(inputStream));
        System.out.println(imageStr);
        return imageStr;
    } catch (Exception e) {
        throw new RuntimeException("生成二维码异常!");
    } finally {
        if (inputStream != null) {
            try {
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (outputStream != null) {
            try {
                outputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

private static byte[] inputStreamToByte(InputStream inputStream) throws IOException{
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    int index = -1;
    while((index = inputStream.read()) != -1){
        baos.write(index);
    }
    return baos.toByteArray();
}

3、 前端取到小程序码的字符串,用展示在页面:

前端代码:

生成的小程序码
<img alt="小程序码" src="data:image/jpeg;base64,${后端返回来的流字符串}">

真实html代码效果

生成的小程序码
<img alt="小程序码" src="data:image/jpeg;base64,/9j/4AAQSkZJRg...">

4、页面html访问的效果:

java获取微信小程序码和小程序二维码_第3张图片

你可能感兴趣的:(java,springboot)