企业微信如何打通公司内部通讯系统简单易懂的对接方法与实际案例分享
为什么你总想打通它?
你有没有遇到过这种日子:
早上刚到公司,钉钉群里@你说有个紧急需求,你秒回。转头一看,企业微信工作群里领导又发了一份重要文件。下午,客户在企微发消息咨询,你手忙脚乱切换三个手机,生怕漏掉一个消息。
这就是大多数中小企业每天面临的真实困境。
内部通讯系统分散、信息孤岛、员工疲于奔命,这不是小事,这是实打实的效率杀手。
好消息是——企业微信早就提供了完善的对接方案,而且对接门槛比你想的还要低。
第一步:理解企业微信对接的核心机制
在动手之前,先搞懂几个关键概念。
企业微信提供对外开发的三大核心能力:
1. 应用消息推送
企业可以为自己的内部应用调用API,向员工发送消息。就像你给好友发微信一样,只不过这次是程序自动发送。
2. Webhook回调
企业微信可以配置回调地址,当发生特定事件(如收到客户消息、员工加入企业)时,会自动把数据推送到你的服务器。这是实现双向同步的关键。
3. 第三方应用接入
企业微信开放平台提供了丰富的API,支持获取通讯录、发送消息、管理日程等。
实际对接流程:以”内部消息同步”为例
假设你的公司有这样一个场景:
内部OA系统发了一条审批通知,你希望这条通知同时出现在企业微信里,员工可以直接在企微点击处理。
方案一:最简单的Webhook方案(无需开发)
如果你们只需要单向推送(把消息推到企业微信),企业微信提供了原生的”群机器人”功能。
操作步骤:
- 在企业微信群聊中,点击群设置
- 找到”群机器人”,创建一个机器人
- 复制Webhook地址,格式如下:
https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=你的key
- 用任意方式调用这个接口发送消息
Python示例代码:
import requests
import json
# 你的webhook地址
webhook_url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx"
# 要发送的消息
message = {
"msgtype": "text",
"text": {
"content": "【审批通知】您的请假申请已被批准,请假时间:2024年1月15日至1月17日,共3天。",
"mentioned_list": ["@all"] # @所有人
}
}
# 发送请求
response = requests.post(
webhook_url,
json=message,
headers={"Content-Type": "application/json"}
)
print(response.json())
效果: 员工在企业微信群里会收到一条格式化的消息,点击就可以跳转到企业微信内部处理。
方案二:完整版的双向对接(需要开发)
如果你的需求更复杂——比如员工在企业微信里操作后,要同步回OA系统——那就需要完整的API对接了。
先注册企业微信应用
第1步:进入管理后台
登录 https://work.weixin.qq.com,进入管理后台,找到”应用管理”,点击”创建应用”。
第2步:获取关键信息
创建应用后,你会拿到三个核心参数:
CorpId:企业ID(在”我的企业”页面查看)AgentId:应用IDSecret:应用密钥(用于获取access_token)
获取Access Token
这是调用所有API的前提:
import requests
CORP_ID = "ww1234567890abcdef"
AGENT_ID = "1000001"
SECRET = "your_secret_here"
# 获取access_token
url = f"https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={CORP_ID}&corpsecret={SECRET}"
response = requests.get(url)
token_data = response.json()
if token_data.get("errcode") != 0:
raise Exception(f"获取token失败: {token_data}")
ACCESS_TOKEN = token_data["access_token"]
print(f"获取到token: {ACCESS_TOKEN}")
发送应用消息
def send_message_to_employee(user_id, content):
"""
发送消息给指定员工
"""
url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=" + ACCESS_TOKEN
message_body = {
"touser": user_id, # 员工userid
"msgtype": "text",
"agentid": AGENT_ID,
"text": {
"content": content
},
"safe": 0 # 是否是保密消息,0否,1是
}
response = requests.post(url, json=message_body)
result = response.json()
if result.get("errcode") == 0:
print(f"消息发送成功,接收人: {user_id}")
else:
print(f"消息发送失败: {result}")
return result
设置回调接收消息
当员工在企业微信里回复消息或点击按钮时,企业微信会回调你的服务器。
你需要做的:
- 在管理后台配置”接收消息”的URL
- 编写一个接收和处理回调的接口
from flask import Flask, request, jsonify
import xml.etree.ElementTree as ET
import requests
app = Flask(__name__)
# 企业微信配置的验证token
TOKEN = "your_verify_token"
@app.route("/callback", methods=["GET", "POST"])
def callback():
if request.method == "GET":
# 验证URL有效性
signature = request.args.get("signature")
timestamp = request.args.get("timestamp")
nonce = request.args.get("nonce")
echostr = request.args.get("echostr")
# 简单验证(生产环境需要更严格的签名验证)
return echostr
elif request.method == "POST":
# 解析接收到的消息
xml_data = request.data.decode("utf-8")
root = ET.fromstring(xml_data)
# 获取消息内容
msg_type = root.find("MsgType").text
content = root.find("Content").text
from_user = root.find("FromUserName").text
print(f"收到消息 - 类型: {msg_type}, 内容: {content}, 发送者: {from_user}")
# 在这里处理业务逻辑
# 比如:把消息同步到你的内部系统,或者触发审批流程
# 返回成功响应(企业微信要求必须返回)
return "<xml><ToUserName><![CDATA[]]></ToUserName><FromUserName><![CDATA[]]></FromUserName><CreateTime>1234567890</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[收到消息]]></Content></xml>"
if __name__ == "__main__":
app.run(port=8080)
真实案例:某物流公司如何打通三个系统
让我给你讲一个真实的故事。
背景
小李是某物流公司的IT负责人,公司有三个内部系统:
- 订单系统(管理快递订单)
- CRM系统(管理客户关系)
- 内部OA(行政审批)
痛点: 员工每天要在三个系统之间来回切换,订单状态更新、客户信息变更、审批通知——这些消息经常漏掉,导致客户投诉。
解决方案
第1步:统一入口
在企微创建一个”内部通知”应用,所有系统的消息都通过这个应用推送。
第2步:订单系统对接
import requests
import json
from datetime import datetime
class OrderNotifier:
def __init__(self, access_token, agent_id):
self.access_token = access_token
self.agent_id = agent_id
self.api_base = "https://qyapi.weixin.qq.com/cgi-bin"
def notify_order_update(self, order_id, status, employee_ids):
"""
当订单状态变更时,通知相关员工
"""
# 构建消息内容
status_text = self._get_status_text(status)
message = {
"touser": "|".join(employee_ids), # 可以一次性通知多人
"msgtype": "markdown",
"agentid": self.agent_id,
"markdown": {
"content": f"## 📦 订单状态更新\n\n"
f"**订单号:** {order_id}\n"
f"**新状态:** {status_text}\n"
f"**更新时间:** {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n\n"
f"> 点击查看详情 → [订单链接](https://your-system.com/order/{order_id})"
},
"safe": 0
}
# 发送消息
url = f"{self.api_base}/message/send?access_token={self.access_token}"
response = requests.post(url, json=message)
return response.json()
def _get_status_text(self, status):
"""状态映射"""
status_map = {
"pending": "待处理",
"shipped": "已发货",
"in_transit": "运输中",
"delivered": "已签收",
"cancelled": "已取消"
}
return status_map.get(status, status)
# 使用示例
notifier = OrderNotifier("your_access_token", 1000001)
# 当订单状态变更时触发
notifier.notify_order_update(
order_id="ORD20240115001",
status="shipped",
employee_ids=["zhangsan", "lisi"]
)
第3步:CRM系统对接
class CRMNotifier:
def __init__(self, access_token, agent_id):
self.access_token = access_token
self.agent_id = agent_id
def notify_new_lead(self, customer_name, contact, sales_id):
"""
有新的潜在客户线索时,通知销售人员
"""
message = {
"touser": sales_id,
"msgtype": "news",
"agentid": self.agent_id,
"news": {
"articles": [{
"title": f"新线索:{customer_name}",
"description": f"联系电话:{contact}",
"url": f"https://your-crm.com/leads/new?name={customer_name}",
"picurl": "https://your-system.com/images/new_lead.png"
}]
}
}
url = f"https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={self.access_token}"
response = requests.post(url, json=message)
return response.json()
# 当CRM系统捕获到新线索时
crm_notifier = CRMNotifier("your_access_token", 1000001)
crm_notifier.notify_new_lead("张三科技有限公司", "138xxxx8888", "sales001")
第4步:OA审批通知
class OAApprover:
def __init__(self, access_token, agent_id):
self.access_token = access_token
self.agent_id = agent_id
def request_approval(self, applicant, item, amount, approver_ids):
"""
发起审批请求,并在企微中通知审批人
"""
message = {
"touser": "|".join(approver_ids),
"msgtype": "template_card",
"agentid": self.agent_id,
"template_card": {
"card_type": "text_note",
"source": {
"icon_url": "https://your-system.com/images/approval.png",
"desc": "审批通知"
},
"main_title": {
"title": f"请审批:{applicant}的{item}申请",
"desc": f"金额:{amount}元"
},
"emphasis_content": {
"title": "状态",
"desc": "待审批"
},
"sub_title_text": f"申请人:{applicant} | 时间:{datetime.now().strftime('%Y-%m-%d %H:%M')}",
"horizontal_content_list": [
{"title": "申请类型", "content": item},
{"title": "申请金额", "content": f"{amount}元"}
],
"action_menu_list": [
{"key": "approve", "value": "同意"},
{"key": "reject", "value": "驳回"}
],
"button_list": [
{
"keytype": 2, # 点击跳转URL
"text": "前往审批",
"url": f"https://your-oa.com/approval/{item_id}"
}
]
}
}
url = f"https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={self.access_token}"
response = requests.post(url, json=message)
return response.json()
对接完成后:员工端体验
当所有系统都对接完成后,员工的日常会变成这样:
早上9:00 — 手机震动,企业微信弹出消息:
📦 订单ORD20240115001已发货,请及时安排配送员接单。
上午10:30 — 又一条消息:
👔 您的差旅报销申请已被批准,款项将在3个工作日内到账。
下午2:00 — 有新的客户线索:
张三科技有限公司来电咨询,联系电话138xxxx8888,已分配给销售人员李四跟进。
所有消息都集中在一处,点击就能处理,不需要再切换系统。
常见问题与解决方案
Q1: 消息推送失败怎么办?
可能原因:
- Access Token过期(有效期2小时)
- 员工不在企业微信通讯录中
- 发送频率超限
解决方案:
import time
def get_valid_token():
"""缓存token,避免频繁获取"""
token_data = cache.get("wx_access_token")
if token_data and token_data["expires_at"] > time.time() + 300:
return token_data["token"]
# 重新获取
url = f"https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={CORP_ID}&corpsecret={SECRET}"
response = requests.get(url).json()
token = response["access_token"]
expires_in = response["expires_in"]
# 缓存5分钟提前过期
cache.set("wx_access_token", {
"token": token,
"expires_at": time.time() + expires_in - 300
})
return token
Q2: 如何批量通知所有员工?
def notify_all_employees(content):
"""
通知所有员工(适合全员通知场景)
"""
# 先获取所有部门
url = f"https://qyapi.weixin.qq.com/cgi-bin/department/list?access_token={get_valid_token()}"
departments = requests.get(url).json()["department"]
all_users = []
for dept in departments:
# 获取每个部门的成员
dept_url = f"https://qyapi.weixin.qq.com/cgi-bin/user/list?access_token={get_valid_token()}&department_id={dept['id']}"
users = requests.get(dept_url).json()["userlist"]
for user in users:
all_users.append(user["userid"])
# 批量发送(注意企业微信限制:每次最多100人)
for i in range(0, len(all_users), 100):
batch = all_users[i:i+100]
send_message_to_employee("|".join(batch), content)
print(f"已通知 {len(all_users)} 名员工")
Q3: 如何确保消息安全?
企业微信支持消息加密,你可以通过以下配置提高安全性:
- 使用HTTPS回调地址
- 验证请求签名
- 对敏感消息进行加密处理
import hashlib
def verify_signature(token, signature, timestamp, nonce):
"""验证请求签名"""
temp_list = [token, timestamp, nonce]
temp_list.sort()
temp_str = "".join(temp_list)
hash_str = hashlib.sha1(temp_str.encode("utf-8")).hexdigest()
return hash_str == signature
总结:对接的核心思路
打通企业微信和内部通讯系统,本质上是三个动作:
- 获取令牌 — 用CorpId和Secret换取Access Token
- 配置应用 — 在企业微信后台创建应用,设置回调地址
- 调用API — 根据业务需求,调用对应的接口发送消息
| 对接场景 | 难度 | 推荐方案 |
|---|---|---|
| 简单消息推送 | ⭐ | Webhook群机器人 |
| 单向通知 | ⭐⭐ | 应用消息API |
| 双向交互 | ⭐⭐⭐ | 完整回调机制 |
| 复杂流程 | ⭐⭐⭐⭐ | 企业微信开放平台API + 自研系统 |
最后想说的话:
技术对接本身不难,难的是找到正确的切入点。
建议你先从一个简单的场景开始——比如把OA审批通知推送到企业微信,跑通整个流程后,再逐步接入其他系统。
每一步都小步快跑,不要因为追求完美而迟迟不动手。
如果你的公司还没有开始对接,现在就是最好的时机。
毕竟,谁也不想继续在三个系统之间反复横跳了吧?
