Java 微信小程序笔记 三、 微信小程序邀请码生成

一、微信邀请码生成:
一张二维码里面包含了一个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文件里面可以找到生成的图片

おすすめ

転載: blog.csdn.net/weixin_48134878/article/details/120866596
おすすめ