配套第 18 篇《把 DeepSeek Harness 接入企业微信,让全员用上 AI 助手》。那篇讲"为什么、整体怎么连",这份讲"照着敲、照着配、照着排查"。
〇、结论先行(避免走弯路)
DeepSeek Harness 本身不对外暴露 OpenAI 兼容 API 服务,它是模型后端的"客户端"。所以"让企微用上 Harness"的正确链路是:
企微用户发消息 → 企微服务器回调你的 Bridge 服务 → Bridge 把任务交给 Harness 会话 / 你的模型后端 跑 → Bridge 把结果通过 主动发消息接口 推回企微
也就是说,Bridge 是你自己写的胶水服务,不是 Harness 自带功能。下面全部围绕"怎么写好这个 Bridge"。
一、整体架构(照抄)
[员工] [企业微信服务器] [你的 Bridge 服务] [Harness / 模型后端]
| 发消息(IM) → | 回调 POST /wecom → | 解密 + 验签 → 驱动 dsh web 会话
| | (HTTPS + Token+AESKey) | (5 秒内必须回 200) | 或调模型 API
| ← 收到 AI 回复 ← | ← 主动推送 message/send ← | 调 message/send 主动推 ← 返回结果

二、企微后台配置清单(先备齐)
| 配置项 | 在哪拿 | 用途 | 备注 |
|---|---|---|---|
| CorpID | 我的企业 → 企业信息 | 企业唯一标识 | 全局一个 |
| CorpSecret | 应用管理 → 自建应用 → Secret | 换 access_token | 每个应用独立 |
| AgentID | 自建应用详情 | 发消息指定应用 | 每个应用独立 |
| 可信域名 | 自建应用 → 可信域名 | 回调 URL 必须在此域下 | 需备案 + HTTPS |
| 回调 URL | 自建应用 → 接收消息 → 设置 API | 填你的 Bridge 公网地址 | https://你的域名/wecom |
| Token | 同上 | GET 验签 | 自定义字符串 |
| EncodingAESKey | 同上 | 消息 AES-256-CBC 加密 | 43 位随机串 |
⚠️ 回调 URL 必须公网可达 + HTTPS。Harness 默认只监听
127.0.0.1,所以 Bridge 单独部署在有公网 IP 的机器/容器上,Harness 可在内网或同机。
三、Bridge 最小可跑骨架(Flask)
# bridge.py —— 仅展示链路骨架,production 请加日志/限流/密钥管理
import time, hashlib, xml.etree.ElementTree as ET
import requests
from flask import Flask, request
CORP_ID = "你的CorpID"
SECRET = "你的Secret"
AGENT_ID = 1000002
TOKEN = "你设的Token"
AES_KEY = "你设的43位EncodingAESKey"
BRIDGE_URL = "https://你的域名/wecom"
# 1) access_token 必须缓存(7200s 有效,别每次都换)
_token_cache = {"t": "", "exp": 0}
def get_token():
if time.time() < _token_cache["exp"] - 60:
return _token_cache["t"]
r = requests.get("https://qyapi.weixin.qq.com/cgi-bin/gettoken",
params={"corpid": CORP_ID, "corpsecret": SECRET}, timeout=5)
d = r.json(); _token_cache["t"] = d["access_token"]
_token_cache["exp"] = time.time() + d.get("expires_in", 7200)
return _token_cache["t"]
# 2) GET 验签:sha1(token, timestamp, nonce, echostr) 排序后 hex
def verify_get(args):
arr = sorted([TOKEN, args["timestamp"], args["nonce"], args["echostr"]])
return hashlib.sha1("".join(arr).encode()).hexdigest() == args["msg_signature"]
# 3) POST 收消息:先验签 → 解密 AES-256-CBC → 取明文(此处略解密实现,用伪代码占位)
def handle_post(xml_text):
# 真实实现:按企微文档用 AESKey 做 AES-256-CBC 解密 msg_encrypt
plain = decrypt_wecom(xml_text, AES_KEY) # 见企微官方加解密库
user = plain.findtext("FromUserName")
content = plain.findtext("Content")
# 关键:5 秒内必须回 200,AI 结果用"主动推送"异步发
ask_harness(content) # 驱动 dsh web 会话 / 调模型后端(见第四节)
return "", 200
# 4) 主动推送结果:异步把 AI 回复发回用户
def push_reply(user, text):
tok = get_token()
requests.post("https://qyapi.weixin.qq.com/cgi-bin/message/send",
params={"access_token": tok},
json={"touser": user, "msgtype": "text", "agentid": AGENT_ID,
"text": {"content": text}}, timeout=5)
app = Flask(__name__)
@app.route("/wecom", methods=["GET"])
def challenge():
if verify_get(request.args): return request.args["echostr"]
return "verify fail", 403
@app.route("/wecom", methods=["POST"])
def callback():
return handle_post(request.data)
上面是骨架。AES-256-CBC 解密请直接用企业微信官方提供的
WXCrypt加解密库(Python/Java/Go/Node 都有),别自己造轮子上生产。
四、Harness 侧怎么接
# Harness 起 Web UI(默认仅本机,Bridge 与 Harness 同机时直接访问)
npx @deepseek-ai/dsh web # http://127.0.0.1:3080
# 换端口:
npx @deepseek-ai/dsh web --port 8080
- 同机模式:Bridge 直接
http://127.0.0.1:3080驱动 Harness 会话(用 Harness 的会话 API 或 UI 自动化)。 - 跨机/上云:Harness 与 Bridge 分置时,Bridge 通过内网地址访问;若 Harness 在纯内网、Bridge 在公网,反过来——让 Bridge 在内网侧、用内网穿透/反向代理接企微回调(见第五节拓扑 B)。
- 模型后端若走 DeepSeek/百炼等,apiKey 用环境变量注入 Bridge 进程,别写死在代码。

五、部署拓扑三档(按规模选)
| 方案 | 部署 | 适用 | 风险 |
|---|---|---|---|
| A 同机 | Harness + Bridge 一台内网机,企微回调走内网穿透 | 个人/小团队试水 | 公网穿透是单点 |
| B 内网 Bridge | Bridge 在内网侧接企微回调,Harness 同内网 | 数据不出企业 | 需有固定公网入口 |
| C 全上云 | Bridge 部署在云服务器(HTTPS 域名),Harness 在云内网 | 全员长期使用 | 云成本 + 运维 |
六、5 秒红线(最容易翻车)
企微 POST 回调 5 秒内必须收到 200,否则认为失败、最多重试 3 次。AI 生成往往超过 5 秒,所以:
- ✅ 正确:回调里只做"验签 + 收消息 + 入队",立刻回 200;AI 结果用
message/send主动推送。 - ❌ 错误:在回调里同步等 AI 跑完再返回 → 超时 → 企微重试 → 用户收到 3 条重复回复。
七、安全双红线
- Harness 不直连公网:
dsh web默认127.0.0.1,别用--host 0.0.0.0裸奔。 - Bridge 每条入站必校验:GET 验签 + POST 验签名 + AES 解密,缺一不可;非法请求直接 403。

八、上线检查清单(8 项)
- [ ] CorpID / Secret / AgentID 已填,Secret 用环境变量不入库
- [ ] 可信域名已备案 + HTTPS,回调 URL 公网可达
- [ ] Token / EncodingAESKey 已配,GET 验签通过(echostr 原样返回)
- [ ] 用企微官方
WXCrypt库做 AES-256-CBC 解密,POST 能取到明文 - [ ] 回调 5 秒内回 200,AI 结果走
message/send主动推(非同步返回) - [ ] access_token 已做 7200s 缓存,无频繁刷新
- [ ] Harness
dsh web仅监听127.0.0.1,Bridge 与 Harness 网络互通 - [ ] 异常有日志 + 限流,重复消息有幂等处理
九、常见故障排查
| 现象 | 原因 | 处理 |
|---|---|---|
| 配置回调时验证失败 | Token/域名不对 | 检查可信域名 HTTPS + Token 一致 |
| 用户发消息无回复 | 回调超时/解密失败 | 看 Bridge 日志;确认 5 秒回 200 |
| 收到 3 条重复回复 | 同步等 AI 超时重试 | 改异步主动推送 |
| access_token 频繁失效 | 没缓存每次新建 | 加 7200s 缓存 |
| Harness 连不上 | 监听 127.0.0.1 跨机 | Bridge 与 Harness 同网或加内网代理 |
十、回链
- 想看完整背景与设计取舍?回复 【企微】 看第 18 篇《把 DeepSeek Harness 接入企业微信,让全员用上 AI 助手》。
- 想顺手把 Harness 插件也配齐?回复 【插件】 看第 19 篇《DeepSeek Harness 办公环境下必装插件指南》+ 赠品《办公插件选型清单》。
—— 莱驰云 AI 实战课堂 · 配套赠品 ——





