当前位置:   article > 正文

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

java获取小程序码转base64

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

首先,奉上微信官方文档:获取小程序码 - 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、小程序码和小程序二维码有什么区别?

请看下图:

图1 小程序码
图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;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
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();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
3、 前端取到小程序码的字符串,用展示在页面:

前端代码:

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

真实html代码效果

生成的小程序码
<img alt="小程序码" src="data:image/jpeg;base64,/9j/4AAQSkZJRg...">
  • 1
  • 2
4、页面html访问的效果:

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/779660
推荐阅读
相关标签
  

闽ICP备14008679号