一、微信邀请码生成:
一张二维码里面包含了一个Key值 就是这么简单
在测试生成二维码之前 请确保你的小程序已经通过微信审核并且上线
否则会报错 41030错误代码。生成的图片打不开 碎了
这个时候不要慌 将文件格式改为TXT可以查看错误信息 进行百度解决
二、上代码
开始前请参考博客微信笔记第一篇参数配置和对应工具类
@ApiOperation(value = "生成微信小程序码Url")
@ApiOperationSupport(ignoreParameters = {
"limit", "offset", "paramError" })
@PostMapping("getQrCode")
public BaseResponse<WxQrCodeResponse> getQrCode(@RequestBody WxQrCodeRequest request) {
return wxService.getQrCode(request);
}
Service:
private final WxMaService wxMaService;
/**
* 微信小程序邀请码生成
*
* @param request OpenID
* @return 邀请码Url
*/
@Override
public BaseResponse<WxQrCodeResponse> getQrCode(WxQrCodeRequest request) {
BaseResponse<WxQrCodeResponse> response = new BaseResponse<>();
// 校验入参
if (Objects.isNull(request) || request.isParamError()) {
log.info("[WxServiceImpl-getQrCode] 入参校验错误");
response.fail(ResponseEnum.PARAM_VALIDATE_ERROR);
return response;
}
String invitationUrl = "";
try {
//生成微信小程序邀请码
String sceneStr = "key=" + request.getOpenId();
String accessToken = wxMaService.getAccessToken();
invitationUrl = wxCodeService.getWxQrCode(sceneStr, accessToken);
} catch (WxErrorException e) {
log.error("[WxServiceImpl-getQrCode]生成微信小程序码失败{}", e.getMessage());
response.fail(ResponseEnum.WX_GET_QR_CODE_ERROR);
return response;
}
//保存用户邀请码信息
boolean flag = lambdaUpdate()
.eq(UserDmo::getOpenId, request.getOpenId())
.set(UserDmo::getInvitationUrl, fileUtil.addFileUrl(invitationUrl))
.update();
if (!flag) {
log.info("[WxServiceImpl-getQrCode] 生成微信邀请码入库失败");
response.fail(ResponseEnum.WX_GET_QR_CODE_ERROR);
return response;
}
//返回
WxQrCodeResponse vo = WxQrCodeResponse.builder().invitationUrl(invitationUrl).build();
response.setData(new ResultData<>(vo));
return response;
}
工具类:
/**
* 邀请码保存路径
*/
private static final String UPLOAD_MINI_CODE_PATH = PathConstant.getInstance().getPath("file/minicode");
/**
* 生成微信邀请二维码
*
* @param sceneStr 参数
* @param accessToken accessToken
* @return url
*/
public String getWxQrCode(String sceneStr, String accessToken) {
RestTemplate rest = new RestTemplate();
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);
Map<String, Object> line_color = new HashMap<>();
line_color.put("r", 0);
line_color.put("g", 0);
line_color.put("b", 0);
param.put("line_color", line_color);
String jsonString = JSONObject.toJSONString(param);
log.info("[WxService-getMiNiQr] jsonString: {}", jsonString);
MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
HttpEntity<String> requestEntity = new HttpEntity<>(jsonString, headers);
ResponseEntity<byte[]> entity =
rest.exchange(url, HttpMethod.POST, requestEntity, byte[].class);
byte[] result = entity.getBody();
InputStream inputStream = new ByteArrayInputStream(result);
String filePath = UPLOAD_MINI_CODE_PATH + DateUtil.formatDateTime(LocalDateTime.now(), DateEnum.DATE) + "/";
String fileName = filePath + UUIDUtil.generateUUID() + ".jpg";
log.info("[fileName]: {}", fileName);
MultipartFile file = null;
try {
file = new MockMultipartFile(fileName, "response.png", ContentType.APPLICATION_OCTET_STREAM.toString(),
inputStream);
} catch (IOException e) {
log.info("[WxService-inputStream to multipartFile fail] inputStream转换为multipartFile失败");
return null;
}
File dir = new File(filePath);
if (!dir.exists()) {
if (!dir.mkdir()) {
log.info("[WxService-fileUpload] 文件路径文件夹创建失败");
}
}
File localFile = new File(fileName);
try {
file.transferTo(localFile);
} catch (IOException e) {
log.error("[WxService-fileUpload] 文件上传异常" + e);
return null;
}
return systemConfig.getFileUrlPrefix() + FileUtil.getFileSuffix(fileName);
}
PS:关于这个systemConfig第一篇博客里面都有的大家可以去复制 也可以不用这个截取路径 直接返回绝对路径即可
最终效果:
总结:本地测试的话 会在你当前项目Class文件里面可以找到生成的图片