Browse Source

提交生成企微外部群二维码

hxl13994548489 6 months ago
parent
commit
28f0520f1a

+ 2 - 1
linkwe-service/src/main/java/com/linkwechat/service/IWeGroupFissionService.java

@@ -8,6 +8,7 @@ import com.linkwechat.domain.weGroupFission.dto.WeGroupFissionDetailDto;
 import com.linkwechat.domain.weGroupFission.dto.WeGroupFissionDto;
 import com.linkwechat.domain.weGroupFission.entity.WeGroupFission;
 import com.linkwechat.domain.weGroupFission.vo.*;
+import me.chanjar.weixin.common.error.WxErrorException;
 
 
 import java.util.List;
@@ -102,5 +103,5 @@ public interface IWeGroupFissionService extends IService<WeGroupFission> {
      *  @Date: 2026/2/11 17:25
      *  @Description: 获取群裂变二维码链接
      */
-    String getChartQrCodeByChatId(String chatId, String activityId);
+    String getChartQrCodeByChatId(String chatId, String activityId) throws WxErrorException;
 }

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

@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
 import com.google.gson.JsonParser;
 import com.linkwechat.common.core.domain.AjaxResult;
@@ -536,6 +537,27 @@ public class WeGroupFissionServiceImpl extends ServiceImpl<WeGroupFissionMapper,
         }
         return list;
     }
+    /**
+     * 手动实现生成外部群二维码(适配 4.1.0 版本源码)
+     * @param chatId 外部群ID
+     * @param expireSeconds 有效期(1800~86400秒),默认86400
+     * @return 二维码URL(直接返回接口原始JSON,可按需封装)
+     * @throws WxErrorException 微信接口异常
+     */
+    public  String generateGroupQrcode(String chatId, Integer expireSeconds) throws WxErrorException {
+        // 1. 构建请求参数
+        JsonObject json = new JsonObject();
+        json.addProperty("chat_id", chatId);
+        // 有效期可选,不传默认24小时
+        if (expireSeconds != null && expireSeconds >= 1800 && expireSeconds <= 86400) {
+            json.addProperty("expire_seconds", expireSeconds);
+        }
+
+        // 2. 调用企业微信官方接口(核心:手动拼接URL并请求)
+        String url = wxCpService.getWxCpConfigStorage().getApiUrl("/cgi-bin/externalcontact/groupchat/get_join_qrcode");
+        String responseContent = wxCpService.post(url, json.toString());
+        return responseContent;
+    }
     /**
      *  @version
      *  @author: hxl
@@ -545,46 +567,41 @@ public class WeGroupFissionServiceImpl extends ServiceImpl<WeGroupFissionMapper,
     @Override
     public String getChartQrCodeByChatId(String chatId, String activityId) {
         WeGroupFissionQrCodeRecord weGroupFissionQrCodeRecord =  weGroupFissionQrCodeRecordService.findEntityByActivityIdAndChatId(activityId,chatId);
-        WxCpExternalContactService service = wxCpService.getExternalContactService();
-        WxCpContactWayInfo contactWayInfo = new WxCpContactWayInfo();
-        WxCpContactWayInfo.ContactWay contactWay = new WxCpContactWayInfo.ContactWay();
-        // 类型:MULTI(2) 表示群聊(SINGLE(1)是单人)
-        contactWay.setType(WxCpContactWayInfo.TYPE.MULTI);
-        // 场景:QRCODE(2) 对应接口的「链接入群」场景
-        contactWay.setScene(WxCpContactWayInfo.SCENE.QRCODE);
-        // 自定义状态值(关联你的裂变记录ID)
-        contactWay.setState(weGroupFissionQrCodeRecord.getId().toString());
-        // 跳过验证:用户扫码直接入群
-        contactWay.setSkipVerify(Boolean.TRUE);
-        contactWayInfo.setContactWay(contactWay);
-        String baseJson = contactWayInfo.toJson();
-        JsonObject jsonObject = JsonParser.parseString(baseJson).getAsJsonObject();
-        JsonObject contactWayJson = jsonObject.getAsJsonObject("contact_way");
-        DistDto distDto = querySingleChatDetail(chatId);
-        String roomBaseName = distDto.getName();
-        // 群聊基础名称
-        contactWayJson.addProperty("room_base_name", roomBaseName);
-        // 固定传0
-        contactWayJson.addProperty("room_base_id", 0);
-        // 关闭自动建群(用已有群)
-        contactWayJson.addProperty("auto_create_room", 0);
-        // 群聊ID列表
-        List<String> chatIdList = new ArrayList<>();
-        chatIdList.add(chatId);
-        contactWayJson.add("chat_id_list", JsonParser.parseString(com.alibaba.fastjson.JSON.toJSONString(chatIdList)).getAsJsonArray());
-        //添加部门权限为5 暂定为开发部 不能为空
-        JsonArray partyArray = new JsonArray();
-        partyArray.add(5);
-        contactWayJson.add("party", partyArray);
-        String finalJson = jsonObject.toString();
+        JsonObject json = new JsonObject();
+        // 必传:外部群ID列表
+        JsonArray chatIdArray = new JsonArray();
+        chatIdArray.add(chatId);
+        json.add("chat_id_list", chatIdArray);
+        //场景。1 - 群的小程序插件 2 - 群的二维码插件
+        json.addProperty("scene", 2);
+        //当群满了后,是否自动新建群。0-否;1-是。 默认为1
+        json.addProperty("auto_create_room", 0);
+        // 核心参数:state(自定义透传,≤30字符)
+        json.addProperty("state", weGroupFissionQrCodeRecord.getId());
+        // 2. 拼接原生接口地址并调用(核心:使用你指定的add_join_way接口)
+        String apiUrl = "/cgi-bin/externalcontact/groupchat/add_join_way";
+        String fullUrl = wxCpService.getWxCpConfigStorage().getApiUrl(apiUrl);
         try{
-            WxCpContactWayResult result = service.addContactWay(WxCpContactWayInfo.fromJson(finalJson));
-            WxCpContactWayInfo contactWayCode = service.getContactWay(result.getConfigId());
-            String qrCode = contactWayCode.getContactWay().getQrCode();
+            String response  = wxCpService.post(fullUrl, json.toString());
+            JsonObject jsonObject = JsonParser.parseString(response).getAsJsonObject();
+            if (jsonObject.get("errcode").getAsInt() != 0) {
+                throw new RuntimeException("生成二维码失败:" + jsonObject.get("errmsg").getAsString());
+            }
+            String configId = jsonObject.get("config_id").getAsString();
+            JsonObject getJoinWayJson = new JsonObject();
+            getJoinWayJson.addProperty("config_id", configId);
+            String getJoinWayUrl = wxCpService.getWxCpConfigStorage().getApiUrl("/cgi-bin/externalcontact/groupchat/get_join_way");
+            String getJoinWayResponse = wxCpService.post(getJoinWayUrl, getJoinWayJson.toString());
+            JsonObject getJoinWayJsonObject = JsonParser.parseString(getJoinWayResponse).getAsJsonObject();
+            if (getJoinWayJsonObject.get("errcode").getAsInt() != 0) {
+                throw new RuntimeException("查询二维码失败:" + getJoinWayJsonObject.get("errmsg").getAsString());
+            }
+            JsonObject joinWay = getJoinWayJsonObject.getAsJsonObject("join_way");
+            String qrCode =  joinWay.get("qr_code").getAsString();
             return qrCode;
         }catch (Exception e){
+            throw new RuntimeException("生成二维码失败");
         }
-        return null;
     }
     /**
      *  @version