|
|
@@ -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
|