小程序之-生成二维码

这两天在别人的小程序逛的时候发现,有一个生成小程序二维码的功能;想着可以在自己的个人小程序中加一个生成海报和二维码的功分享功能,然后通过某些参数进入;可以做一些有趣的小功能。

参考一下博客:https://www.jianshu.com/p/266545660eef

参考官网:https://developers.weixin.qq.com/miniprogram/dev/api/qrcode.html?search-key=%E4%BA%8C%E7%BB%B4%E7%A0%81

通过后台接口可以获取小程序任意页面的二维码,扫描该二维码可以直接进入小程序对应的页面。目前微信支持两种二维码,小程序码(左),小程序二维码(右),如下所

在这里插入图片描述
获取二维码有3种方式

获取小程序码

接口A: 适用于需要的码数量较少的业务场景 接口地址:

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

接口B:适用于需要的码数量极多的业务场景

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

获取小程序二维码

接口C:适用于需要的码数量较少的业务场景

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

错误码

45009:B接口调用分钟频率受限(目前5000次/分钟,会调整),如需大量小程序码,建议预生成。 45029:A接口和C接口生成码个数总和到达最大个数限制。 41030:B接口所传page页面不存在,或者小程序没有发布,请注意B接口没有path参数,传path参数虽然可以生成小程序码,但是只能跳主页面。

实践

我选择的是B接口,由于生成的二维码没有地方存放如七牛等云存储,平穷限制了我只能另找出路 想着将二进制转为base64字符串返回;

    public String getQrCodeBase64Str(@RequestBody QrCodeBInterfaceDTO qrCodeBInterfaceDTO) throws IOException {
        //验证当前token是否过期
        QrCodeCache qrCodeCache = QrCodeCache.getQrCodeCache();
        if (qrCodeCache.isExpire()) {
            Map<String, Object> accessTokenMap = restTemplate.postForObject(notepadProperties.getWeiXin().getAccessToken(), null, Map.class);
            log.info("qrCode方法获取accessToken结果:{}", accessTokenMap);
            qrCodeCache.setAccessToken(String.valueOf(accessTokenMap.get("access_token")));
            qrCodeCache.setCreateTime(new Date());
            if (!Objects.isNull(accessTokenMap.get("expires_in"))) {
                qrCodeCache.setExpire((Integer) accessTokenMap.get("expires_in"));
            } else {
                qrCodeCache.setExpire(MathConstant.ZERO);
            }
            log.info("QrCodeCache结果:{}", qrCodeCache);
        }

        boolean isExpire = qrCodeCache.isExpire();
        log.info("isExpire:{}", isExpire);
        StringBuilder stringBuilder = new StringBuilder();
        if (!isExpire) {
            String url = notepadProperties.getWeiXin().getQrCodeB() + "?access_token=" + qrCodeCache.getAccessToken();
            log.info("qrCode请求URL:{}", url);
            Map<String, Object> param = new HashMap<>();
            param.put("scene", qrCodeBInterfaceDTO.getScene());
            param.put("page", qrCodeBInterfaceDTO.getPage());
            param.put("width", qrCodeBInterfaceDTO.getWidth());
            param.put("auto_color", qrCodeBInterfaceDTO.isAutoColor());
            param.put("is_hyaline", qrCodeBInterfaceDTO.isHyaline());
            if (!Objects.isNull(qrCodeBInterfaceDTO.getLineColor())) {
                param.put("line_color", qrCodeBInterfaceDTO.getLineColor());
            }
            ResponseEntity<byte[]> entity = restTemplate.exchange(url, HttpMethod.POST, new HttpEntity(param), byte[].class);
            byte[] result = entity.getBody();
            if (Objects.isNull(result) || result.length == 0) {
                return stringBuilder.toString();
            }

            BASE64Encoder encoder = new BASE64Encoder();
            return stringBuilder.append("data:image/png;base64,").append(encoder.encode(result).replaceAll("\r\n|\r|\n", "")).toString();
        }
        return stringBuilder.toString();
    }

结果返回的base64字符串死活显示不出来,使用在线转换http://imgbase64.duoshitong.com/ 显示错误;
然后将base64进行解密写入磁盘也可以正常显示没有问题;我也很无赖开始怀疑是不是微信小程序不支持base64编码格式的图片展示;
然后通过http://imgbase64.duoshitong.com/ 在线将图片转换成base64编码贴到小程序发现没有问题,瞬间凌乱了 不科学啊!!!
吃了个饭回来看到服务器返回的base64编码中包含显示的\r\n的回车元素,猜想就是它了;
在这里插入图片描述
修改返回结果:

  return stringBuilder.append("data:image/png;base64,").append(encoder.encode(result).replaceAll("\r\n|\r|\n", "")).toString();

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值