QiWe开放平台提供了后台直登功能,登录成功后获取相关参数,快速Apifox在线测试,所有登录功能都是基于QiWe平台API自定义开发。
核心逻辑:企微外部群发送的两种路径
在开始写代码前,必须明确企业微信发送消息到"外部群"的两种主流方式,因为它们的 API 权限完全不同:
-
应用消息(最常用): 通过自建应用,调用
externalcontact/send_by_groupchat接口。这需要群主开启了应用权限。 -
群机器人(最简单): 如果你只是想往自己管理的群里发通知,直接在群设置里添加"机器人",获取
webhook地址即可。
本篇重点介绍第一种:通过自建应用主动推送。
1. Python 实现:简洁直观
Python 非常适合快速验证逻辑。我们使用 requests 库。
python
import requests
import json
def send_external_group_msg(access_token, chat_id, content):
url = f"https://qyapi.weixin.qq.com/cgi-bin/externalcontact/send_by_groupchat?access_token={access_token}"
payload = {
"chat_id": chat_id,
"msgtype": "text",
"text": {
"content": content
}
}
response = requests.post(url, data=json.dumps(payload))
return response.json()
# 调用示例
# res = send_external_group_msg("YOUR_TOKEN", "EXTERNAL_CHAT_ID", "Hello from Python!")
2. Go 实现:高并发与工程化
Go 语言由于其原生支持并发,适合在大规模推送场景下使用。
Go
package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
)
type MsgBody struct {
ChatID string `json:"chat_id"`
MsgType string `json:"msgtype"`
Text struct {
Content string `json:"content"`
} `json:"text"`
}
func SendMsg(accessToken string, chatId string, content string) {
url := fmt.Sprintf("https://qyapi.weixin.qq.com/cgi-bin/externalcontact/send_by_groupchat?access_token=%s", accessToken)
body := MsgBody{
ChatID: chatId,
MsgType: "text",
}
body.Text.Content = content
jsonData, _ := json.Marshal(body)
resp, err := http.Post(url, "application/json", bytes.NewBuffer(jsonData))
if err != nil {
fmt.Println("发送失败:", err)
return
}
defer resp.Body.Close()
fmt.Println("发送成功")
}
3. Java 实现:企业级集成
Java 开发者通常会配合 RestTemplate 或 OkHttp。这里展示基于普通 HTTP 处理的逻辑。
java
public class WecomService {
private static final String API_URL = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/send_by_groupchat?access_token=";
public void sendMessage(String accessToken, String chatId, String content) {
// 构建请求体(推荐使用 Jackson 或 Gson)
Map<String, Object> text = new HashMap<>();
text.put("content", content);
Map<String, Object> body = new HashMap<>();
body.put("chat_id", chatId);
body.put("msgtype", "text");
body.put("text", text);
// 使用你熟悉的 Http 客户端发送 Post 请求
// String response = HttpUtils.post(API_URL + accessToken, JSON.toJSONString(body));
}
}
关键避坑指南
1. chat_id 从哪来?
外部群的 chat_id 不是群名,也不是随便生成的。你需要先通过 externalcontact/groupchat/list 接口获取客户群列表,从而拿到对应的 chat_id。
2. 权限问题(最重要)
-
自建应用权限: 必须在企业微信后台,将该应用的可信域名、IP 白名单配置好。
-
配置群: 只有当应用在外部群的"可使用范围"内,且该群属于企业微信的"客户群"范畴时,API 才会生效。
3. Token 缓存机制
千万不要每次发消息都去调用 get_token 接口!access_token 有 2 小时有效期,建议存入 Redis 并设置过期时间,否则会触发频率限制。
总结
-
Python 适合做运维脚本或简单的消息通知。
-
Go 适合需要处理大量群消息推送的后端微服务。
-
Java 适合集成在大型 ERP 或 CRM 系统中。