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;
}
SpringBoot 调用微信接口生成无限量小程序带参二维码
长春小霸王2026-07-04 11:09