JAVA生成微信小程序码

话不多说,先上官方文档

https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/qrcode-link/qr-code/getUnlimitedQRCode.html

两个圆码一个方码,喜欢哪个码用哪个码。注意:第一个和第三个生成数量有限制,只能生成100000个,根据业务需求进行选择,本文选择第二种方式进行演示。

获取Token

官方文档第一步都是获取Token,照着来

public Object getWXToken() {
        //先从redis里拿token
        Object accessToken = redisTemplate.opsForValue().get(这里用appId作为key);
        //如果没有才请求获取token
        if (null == accessToken){
            // 拼接code发起请求到微信认证服务器获取token
            String tokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET"
                    .replace("APPID", "小程序appid")
                    .replace("APPSECRET", "小程序SECRET"));
            String tokenObjStr = HttpUtils.sendGet(tokenUrl);
            JSONObject tokenObj = JSONObject.parseObject(tokenObjStr);
            //获取token
            accessToken = tokenObj.getString("access_token");
            String expiresIn = tokenObj.get("expires_in").toString();
            if (null != accessToken) {
                redisTemplate.opsForValue().set(tenant.getAppId(),accessToken, Long.parseLong(expiresIn), TimeUnit.SECONDS);
                return accessToken;
            }else {
                throw new RuntimeException("小程序参数不正确");
            }
        }
        return accessToken;
    }

其HttpUtils.sendGet(tokenUrl);是一个发送http请求的方法,这里是使用的若依的类和方法

这里是获取token的官方说明:https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_access_token.html

获取小程序码

//获取小程序码
        String codeUrl = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=ACCESS_TOKEN"
                .replace("ACCESS_TOKEN", "上面获取的token值");
        Map<String, Object> map = new HashMap<>();
        map.put("scene", "小程序码里面的参数值");
        map.put("page", "扫码跳转的页面路径");
        byte[] wxCodeBytes = HttpUtils.sendPost2Byte(codeUrl, map);
        //然后做图片上传,我这里的项目是使用若依的上传,将byte数组转为MutipartFile就可以了,如果需要可以去生成预览图那里复制该类

    /**
     * 向指定 URL 发送POST方法的请求,并将返回数据转为byte[]
     *
     * @param url 发送请求的 URL
     * @param data 请求参数,请求参数是Map<String,Object>的形式。
     * @return 所代表远程资源的响应结果
     */
    public static byte[] sendPost2Byte(String url, Map<String,Object> data) {
        byte[] bytes = null;
        try {
            CloseableHttpResponse response = null;
            try {
                ObjectMapper objectMapper = new ObjectMapper();
                HttpPost httpPost = new HttpPost(url);
                httpPost.setHeader(HTTP.CONTENT_TYPE, "application/json");
                httpPost.setEntity(new StringEntity(objectMapper.writeValueAsString(data),
                        ContentType.create("text/json", "UTF-8")));
                response = HttpClients.createDefault().execute(httpPost);
                if (response.getStatusLine().getStatusCode() == 200) {
                    HttpEntity entity = response.getEntity();
                    if (entity != null) {
                        //这里不一定需要转为byte,根据你的项目自己选择
                        bytes = readStream(entity.getContent());
                    }
                }
            } finally {
                if (response != null) {
                    response.close();
                }
            }
        } catch (Exception e) {
            log.error("调用HttpUtils.sendPostRequest Exception, url=" + url + ",map=" + data, e);
        }
        return bytes;
    }

    /**
     * 得到图片字节流 数组大小
     * */
    public static byte[] readStream(InputStream inStream) throws Exception{
        ByteArrayOutputStream outStream = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int len = -1;
        while((len = inStream.read(buffer)) != -1){
            outStream.write(buffer, 0, len);
        }
        outStream.close();
        inStream.close();
        return outStream.toByteArray();
    }

小程序码上传到服务器后,浏览器打开图片地址就可以了。

忘了说一下,微信返回的是二进制,打印出来是乱码的,所以我这里直接就拿返回结果做图片上传了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值