QiWe开放平台提供了后台直登功能,登录成功后获取相关参数,快速Apifox在线测试,所有登录功能都是基于QiWe平台API自定义开发。
核心逻辑
要实现"应用主动推送"到外部群,必须满足三个前置条件:
-
获取 ChatID :不能用群名,必须通过
customer_group/list获取外部群 ID。 -
应用权限:应用必须在"客户联系"配置中,且拥有该群所属成员的管理权限。
-
接口选择 :使用
cgi-bin/appchat/send接口。
一、 Java 实现:利用 RestTemplate 构建
Java 开发建议封装一个 WeChatClient,处理 AccessToken 的刷新逻辑。
java
// 核心发送方法
public String sendToExternalGroup(String chatId, String textContent) {
String url = "https://qyapi.weixin.qq.com/cgi-bin/appchat/send?access_token=" + getAccessToken();
Map<String, Object> body = Map.of(
"chatid", chatId,
"msgtype", "text",
"text", Map.of("content", textContent)
);
return restTemplate.postForObject(url, body, String.class);
}
二、 Go 实现:高性能并发推送
Go 适合处理大规模群消息下发,注意使用 context 控制请求超时。
java
func SendToGroup(chatId, content, token string) ([]byte, error) {
endpoint := fmt.Sprintf("https://qyapi.weixin.qq.com/cgi-bin/appchat/send?access_token=%s", token)
payload := map[string]interface{}{
"chatid": chatId,
"msgtype": "text",
"text": map[string]string{"content": content},
}
jsonBuf, _ := json.Marshal(payload)
resp, err := http.Post(endpoint, "application/json", bytes.NewBuffer(jsonBuf))
if err != nil {
return nil, err
}
defer resp.Body.Close()
return ioutil.ReadAll(resp.Body)
}
三、 Python 实现:极简脚本模式
适合做报警通知或轻量化运维工具。
java
import requests
def push_message(token, chat_id, text):
url = f"https://qyapi.weixin.qq.com/cgi-bin/appchat/send?access_token={token}"
data = {
"chatid": chat_id,
"msgtype": "text",
"text": {"content": text}
}
res = requests.post(url, json=data)
return res.json()
💡 深度避坑指南(干货总结)
-
ChatID 误区 :外部群的
chat_id与普通内部群格式不同。如果是通过群机器人获取的Webhook地址里的key,是不能直接套用在应用 API 里的。 -
IP 白名单 :即便代码逻辑正确,如果发送服务器的 IP 没有配置在企业微信后台的可信 IP 段中,会返回
60020错误。 -
频率熔断:外部群对 API 推送极其敏感。如果短时间内向大量外部群推送相同内容,应用可能会被限制发消息权限。建议在代码层实现队列(Queue)平滑消费。
-
安全限制 :发送外部群消息时,如果涉及图片或文件,需要先调用
media/upload换取media_id,且该素材也有有效期。
总结:
API 发送相比机器人更灵活,但门槛在于权限管理。开发前务必确认你的应用是否在"客户联系"的业务负责人范围内,否则会一直报 81013 无权限错误。