Parcourir la source

提交生成微信短链采用微信小程序的api,活动id参数太长改为id

hxl13994548489 il y a 6 mois
Parent
commit
0a572733a7

+ 33 - 32
linkwe-auth/src/main/java/com/linkwechat/web/controller/system/WeGroupFissionController.java

@@ -7,6 +7,8 @@ import com.linkwechat.common.core.domain.AjaxResult;
 import com.linkwechat.common.core.page.TableDataInfo;
 import com.linkwechat.common.utils.QrCodeGenerator;
 import com.linkwechat.common.utils.QrcodeUtils;
+import com.linkwechat.common.utils.createQrCode.CreateQRCodeByCodeVO;
+import com.linkwechat.common.utils.createQrCode.WxMiniProgramGetQRCodeByCommonUtil;
 import com.linkwechat.domain.weGroupFission.dto.DistDto;
 import com.linkwechat.domain.weGroupFission.dto.WeGroupFissionDetailDto;
 import com.linkwechat.domain.weGroupFission.dto.WeGroupFissionDto;
@@ -22,13 +24,16 @@ import lombok.extern.slf4j.Slf4j;
 import me.chanjar.weixin.common.error.WxErrorException;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.MediaType;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
 
+import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 import java.util.ArrayList;
 import java.util.List;
@@ -51,6 +56,18 @@ public class WeGroupFissionController extends BaseController {
    @Autowired
    private ISysUserService sysUserService;
 
+   @Resource
+   private WxMiniProgramGetQRCodeByCommonUtil wxMiniProgramGetQRCodeByCommonUtil;
+
+    //微信小程序的appid
+    @Value("${wechat.app_id}")
+    private String lifeWechatAppId;
+
+
+    //微信小程序的appid
+    @Value("${wechat.secret}")
+    private String lifeWechatSecret;
+
    /**
     *  @version
     *  @author: hxl
@@ -245,44 +262,28 @@ public class WeGroupFissionController extends BaseController {
      *  @Description: 获取短链二进制流
      */
     @PostMapping(value = "/getWechatGroupFissionUrlStream")
-    public ResponseEntity<byte[]> getWechatGroupFissionUrlStream(@RequestBody CreateWechatGroupFissionUrlVo createWechatGroupFissionUrlVo) {
+    public void getWechatGroupFissionUrlStream(@RequestBody CreateWechatGroupFissionUrlVo createWechatGroupFissionUrlVo,HttpServletResponse servletResponse){
         if(StringUtils.isBlank(createWechatGroupFissionUrlVo.getUrl())){
-            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("生成页面路径不能为空:".getBytes());
+            throw new RuntimeException("生成页面路径不能为空");
         }
         if(StringUtils.isBlank(createWechatGroupFissionUrlVo.getGroupFissionId())){
-            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("群裂变活动id不能为空:".getBytes());
+            throw new RuntimeException("群裂变活动id不能为空");
         }
         if(StringUtils.isBlank(createWechatGroupFissionUrlVo.getVersion())){
-            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("版本不能为空:".getBytes());
-        }
-        try {
-            String wechatUrl = weGroupFissionService.getWechatGroupFissionUrl(createWechatGroupFissionUrlVo);
-            log.info("生成二维码的微信链接:{}", wechatUrl);
-            byte[] qrcodeBytes = QrCodeGenerator.createQrCode(wechatUrl, "PNG", 300, 300);
-
-            HttpHeaders headers = new HttpHeaders();
-            headers.setContentType(MediaType.IMAGE_PNG);
-            headers.setContentLength(qrcodeBytes.length);
-            return new ResponseEntity<>(qrcodeBytes, headers, HttpStatus.OK);
-        } catch (Exception e) {
-            log.error("生成微信打卡二维码失败", e);
-            String errorMsg = "生成微信打卡二维码失败:" + e.getMessage();
-            return buildErrorResponse(errorMsg, HttpStatus.INTERNAL_SERVER_ERROR);
+            throw new RuntimeException("版本不能为空");
         }
-    }
-
-    /**
-     * 统一构建错误响应
-     */
-    private ResponseEntity<byte[]> buildErrorResponse(String errorMsg, HttpStatus status) {
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(MediaType.TEXT_PLAIN);
-        try {
-            // 明确指定UTF-8编码,避免中文乱码
-            return new ResponseEntity<>(errorMsg.getBytes("UTF-8"), headers, status);
-        } catch (Exception e) {
-            // 兜底:使用默认编码
-            return new ResponseEntity<>(errorMsg.getBytes(), headers, status);
+        CreateQRCodeByCodeVO createQRCode = new CreateQRCodeByCodeVO();
+        createQRCode.setKeyName("id");
+        createQRCode.setKeyValue(createWechatGroupFissionUrlVo.getGroupFissionId());
+        createQRCode.setSharePath(createWechatGroupFissionUrlVo.getUrl());
+        createQRCode.setEnv_version(createWechatGroupFissionUrlVo.getVersion());
+        createQRCode.setWidth(300); // 小程序码宽度
+        createQRCode.setAuto_color(false); // 不自动配色
+        createQRCode.setIs_hyaline(false); // 不透明
+        try{
+            wxMiniProgramGetQRCodeByCommonUtil.createQRCode(createQRCode,lifeWechatAppId,lifeWechatSecret,servletResponse);
+        }catch (Exception e){
+            throw new RuntimeException("生成二维码错误");
         }
     }
 }

+ 49 - 0
linkwe-common/src/main/java/com/linkwechat/common/utils/createQrCode/CreateQRCodeByCodeVO.java

@@ -0,0 +1,49 @@
+package com.linkwechat.common.utils.createQrCode;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+
+@Data
+@ApiModel(value = "生成小程序码参数")
+public class CreateQRCodeByCodeVO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @NotBlank(message = "keyName")
+    @ApiModelProperty(value = "keyName", required = true)
+    private String keyName;
+
+    @NotBlank(message = "keyValue")
+    @ApiModelProperty(value = "keyValue", required = true)
+    private String keyValue;
+
+    /**分享页面路径*/
+    @NotBlank(message = "分享页面路径不能为空")
+    @ApiModelProperty(value = "分享页面路径")
+    private String sharePath;
+
+
+    @ApiModelProperty(value = "二维码的宽度")
+    private Integer width;
+
+    @ApiModelProperty(value = "自动配置线条颜色")
+    private Boolean auto_color;
+
+
+    @ApiModelProperty(value = "码的颜色")
+    private Object line_color;
+
+
+    @ApiModelProperty(value = "是否需要透明底色")
+    private Boolean is_hyaline;
+
+
+    @ApiModelProperty(value = "要打开的小程序版本。正式版为 \"release\",体验版为 \"trial\",开发版为 \"develop\"。默认是正式版。\n")
+    private String env_version;
+
+
+}

+ 155 - 0
linkwe-common/src/main/java/com/linkwechat/common/utils/createQrCode/WxMiniProgramGetQRCodeByCommonUtil.java

@@ -0,0 +1,155 @@
+package com.linkwechat.common.utils.createQrCode;
+
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import okhttp3.*;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.concurrent.TimeUnit;
+
+
+@Component
+@Slf4j
+/**
+ * 本地生活生成小程序码
+ */
+public class WxMiniProgramGetQRCodeByCommonUtil {
+
+    //微信小程序的appid
+    @Value("${wechat.app_id}")
+    private String wechatAppId;
+
+
+    //微信小程序的appid
+    @Value("${wechat.secret}")
+    private String wechatSecret;
+    // 超时时间(秒)
+    private static final int TIMEOUT = 10;
+
+    // OkHttp客户端
+    private static final OkHttpClient client = new OkHttpClient.Builder()
+            .connectTimeout(TIMEOUT, TimeUnit.SECONDS)
+            .readTimeout(TIMEOUT, TimeUnit.SECONDS)
+            .writeTimeout(TIMEOUT, TimeUnit.SECONDS)
+            .build();
+
+
+    /**
+     * 获取access_token
+     */
+    public  String getAccessToken(String wechatAppId, String wechatSecret) throws IOException {
+        // 接口地址
+        String  url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential" +
+                   "&appid=" + wechatAppId +
+                   "&secret=" + wechatSecret;
+        // 发送GET请求
+        Request request = new Request.Builder().url(url).get().build();
+        Response response = client.newCall(request).execute();
+        String responseBody = response.body().string();
+
+        // 解析响应
+        JSONObject json = JSONObject.parseObject(responseBody);
+        if (json.containsKey("errcode") && json.getInteger("errcode") != 0) {
+            throw new RuntimeException("获取access_token失败:" + json.getString("errmsg"));
+        }
+        return json.getString("access_token");
+    }
+
+
+    /**
+     * 生成小程序码
+     */
+    public  void createQRCode(CreateQRCodeByCodeVO createQRCode, String wechatAppId, String wechatSecret, HttpServletResponse servletResponse) throws IOException {
+        log.info("进入生成方法:" + createQRCode.toString());
+        String accessToken =null;
+        // 1. 获取access_token
+        accessToken = getAccessToken(wechatAppId, wechatSecret);
+        // 2. 构建请求参数
+        JSONObject params = new JSONObject();
+        // 扫码进入的小程序页面路径
+        if(StringUtils.isNotBlank(createQRCode.getKeyName()) &&  StringUtils.isNotBlank(createQRCode.getKeyValue())   ){
+            params.put("scene", createQRCode.getKeyName()+"=" + createQRCode.getKeyValue());
+        }
+        if (StringUtils.isNotBlank(createQRCode.getSharePath())) {
+            params.put("page", createQRCode.getSharePath());
+        }
+        if (createQRCode.getWidth() != null && createQRCode.getWidth() > 0) {
+            params.put("width", createQRCode.getWidth());
+        }
+        if (createQRCode.getAuto_color() != null) {
+            params.put("auto_color", createQRCode.getAuto_color());
+        }
+        if (createQRCode.getLine_color() != null) {
+            params.put("line_color", createQRCode.getLine_color());
+        }
+        if (createQRCode.getIs_hyaline() != null) {
+            params.put("is_hyaline", createQRCode.getIs_hyaline());
+        }
+        //要打开的小程序版本。正式版为"release",体验版为"trial",开发版为"develop"
+        if (createQRCode.getEnv_version() != null) {
+            params.put("env_version", createQRCode.getEnv_version());
+        }
+        // 3. 发送POST请求
+        String url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + accessToken;
+        RequestBody requestBody = RequestBody.create(
+                params.toJSONString(),
+                MediaType.parse("application/json; charset=utf-8")
+        );
+        Request request = new Request.Builder().url(url).post(requestBody).build();
+        try (Response response = client.newCall(request).execute();) {
+            if (!response.isSuccessful()) {
+                // 处理错误,微信返回的是JSON格式的错误信息
+                String errorBody = response.body().string();
+                log.error("生成二维码失败: {}, 错误信息: {}", response.code(), errorBody);
+                throw new RuntimeException("生成二维码失败: " + errorBody);
+            }
+            forwardResponse(response, servletResponse);
+
+        } catch (IOException e) {
+            log.error("请求微信接口异常", e);
+            throw new RuntimeException("请求微信接口异常", e);
+        }
+
+
+    }
+
+    /**
+     * 转发OkHttp Response到HttpServletResponse
+     */
+
+    private  void forwardResponse(Response wechatResponse, HttpServletResponse servletResponse) {
+        // 设置状态码
+        servletResponse.setStatus(wechatResponse.code());
+
+        // 设置内容类型(如果微信响应中有)
+        if (wechatResponse.body() != null && wechatResponse.body().contentType() != null) {
+            servletResponse.setContentType(wechatResponse.body().contentType().toString());
+        }
+
+        // 写入响应体
+        try (InputStream inputStream = wechatResponse.body().byteStream();
+             OutputStream outputStream = servletResponse.getOutputStream()) {
+            byte[] buffer = new byte[4096];
+            int bytesRead;
+            while ((bytesRead = inputStream.read(buffer)) != -1) {
+                outputStream.write(buffer, 0, bytesRead);
+            }
+            log.info("生成小程序二维码成功",outputStream.toString());
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+
+        // 关闭微信响应
+        wechatResponse.close();
+    }
+}
+
+
+
+

+ 1 - 1
linkwe-service/src/main/java/com/linkwechat/service/impl/WeGroupFissionServiceImpl.java

@@ -421,7 +421,7 @@ public class WeGroupFissionServiceImpl extends ServiceImpl<WeGroupFissionMapper,
      */
     @Override
     public String getWechatGroupFissionUrl(CreateWechatGroupFissionUrlVo createWechatGroupFissionUrlVo) {
-        String queryParam = "groupFissionId="+createWechatGroupFissionUrlVo.getGroupFissionId()+"&source=poster";
+        String queryParam = "id="+createWechatGroupFissionUrlVo.getGroupFissionId()+"&source=poster";
         //添加分享人id
         if(StringUtils.isNotBlank(createWechatGroupFissionUrlVo.getShareUserId())){
             queryParam = queryParam + "&shareUserId="+createWechatGroupFissionUrlVo.getShareUserId();