SpringBoot 调用微信接口生成无限量小程序带参二维码

复制代码
private static final String QR_URL = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=";

@ResponseBody
@RequestMapping(value = "/API/GetMachineQrcodeImage", method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
public Map<String, Object> GetMachineQrcodeImage(@RequestBody JSONObject jsonParam) {
    Map<String, Object> map = new HashMap<>();
    try {
        String token = jsonParam.getString("token");
        boolean is_exist =  redisTemplate.hasKey(token);
        //redisTemplate.execute((RedisCallback<Boolean>) connection -> connection.exists(key.getBytes()))
        if(is_exist == false)
        {
            map.put("status","token_fail");
            return map;
        }else
        {
            redisTemplate.delete(token);
        }
        String appid = HelpUtils.appID;
        String secret = HelpUtils.secret;
        String short_code = jsonParam.getString("short_code");
        if(short_code.length()>32){
            System.err.println("scene超长");

        }
        String scene =  "short_code="+short_code;
        Map<String, Object> map1 = scanQRCodeHelp.getAccessToken(appid,secret);
        String url = QR_URL + map1.get("access_token");
        Map<String, Object> param = new HashMap<>();
        param.put("page", "pages/index/index"); // 小程序首页路径
        param.put("scene", scene);               // 扫码携带参数
        param.put("env_version", "trial"); // 体验版
        param.put("width", 430);
        // 接收二进制图片流
        byte[] qrBytes = restTemplate.postForObject(url, param, byte[].class);
        // 如果长度只有几十~两百多,必然是报错JSON
        if(qrBytes.length < 1000){
            String errMsg = new String(qrBytes, StandardCharsets.UTF_8);
            System.out.println("微信返回错误:" + errMsg);
        }
        List<SystemParameters> systemParametersList = systemParametersService.findSystemParametersByParamName("qr_code_physics_path");
        String qr_code_physics_path = systemParametersList.get(0).getParam_value();
        Thread.sleep(5);
        systemParametersList = systemParametersService.findSystemParametersByParamName("qr_code_web_path");
        String qr_code_web_path = systemParametersList.get(0).getParam_value();
        // 4. 构建保存目录,不存在则创建
        File dir = new File(qr_code_physics_path);
        if (!dir.exists()) {
            boolean mkdir = dir.mkdirs();
            if (!mkdir) {
                throw new IOException("目录创建失败:");
            }
        }

        // 5. 生成唯一文件名,避免覆盖:UUID+.png
        String fileName = short_code + ".png";
        File saveFile = new File(dir, fileName);

        // 6. 字节流写入本地文件
        try (FileOutputStream fos = new FileOutputStream(saveFile)) {
            fos.write(qrBytes);
            fos.flush();
        }
        map.put("status","success");
        return  map;
    } catch (Exception e) {
        logger.info(e.getMessage());
    }
    map.put("status","fail");
    return map;
}