怀怀歌创作者网络DEMO

企微集成面板

DRY_RUNwwdc467b59cb7eac44

这套系统真接上企业微信之后的形态。当前运行在 DRY_RUN 模式: 不发任何网络请求,但每一次调用的接口、参数、前置条件与限制都如实记录在下方台账里。 把 WECOM_DRY_RUN=0 加上两个 Secret 就是真实调用,代码不用改。

为什么先做这一页
企微的坑不在写代码,在后台开关和额度:客户联系不勾「可调用接口的应用」白名单,externalcontact/* 一律无权限;可信域名每月只能改 20 次,超限封 30 天。 所以整套封装默认 DRY_RUN —— 本地联调一次都不碰真实额度,域名与开关一次性配死再切真。

1 · 连接状态

以下取自企业微信管理后台的实际配置
企业与应用
已认证 · 有效期至 2027-03-11
CorpIDwwdc467b59cb7eac44
自建应用阅读助手 AgentId 1000003
企业规模12 人 · 6 部门
企业域名huaige.cn 已登记
企业可信 IP已配 5 个
经营类目生活服务 · 摄影/扩印(客户联系无行业限制)
已开通的能力
通讯录同步已开启 接口同步 · 读取并编辑
客户联系已开通 API 接收消息已启用
智能机器人支持 MCP 插件 当前插件与工作流为空
微信开发者 ID未绑定
当前运行模式DRY_RUN
外部联系人额度68 / 2,000
后台「已服务 68 位」,其中 64 位已入网成为创作者,4 位加了好友未转化。2000 位免费额度,当前用量 3.4%

2 · 渠道活码台账

8 个在用活码 · 累计加好友 68 位 · 转化创作者 64 位
API 创建的活码在管理后台完全不展示。每企业 50 万个额度且与「加入群聊」活码共用同一个池, 没有台账就是把额度扔进黑洞 —— 这个页面就是台账。state 采用可解析命名法, 回调 add_external_contact 带回 State,即可自动归因并打渠道标签。
渠道state(活码参数)活码 config_id扫码加好友转化创作者转化率在网活跃累计结算额
老创作者引荐 · #012referral_012cw_referral_012121192%7¥62,877
小红书招募帖 · 09/03xhs_post_0903cw_xhs_post_0903111091%6¥93,031
小红书招募帖 · 08/12xhs_post_0812cw_xhs_post_0812111091%5¥44,571
主理人微信 1v1 邀约wechat_1v1cw_wechat_1v110990%7¥168,037
2025 BD 名单批量加bd_list_2025cw_bd_list_202577100%6¥34,333
抖音主页简介挂链douyin_biocw_douyin_bio77100%7¥40,904
成都线下活动 · 立牌offline_chengducw_offline_chengdu66100%5¥143,154
老创作者引荐 · #037referral_037cw_referral_03744100%3¥23,849
合计686494%46¥610,756
渠道活码额度(与「加入群聊」活码共用)8 / 500,000
临时会话模式每日最多加 10 万人;活码创建后 state 不可改,命名法必须一次定死。
引荐渠道为什么值钱
referral_012 一个人带来 11 位创作者、¥62,877 累计结算额。 给每位站台创作者一个专属活码,带来多少人、这些人接了多少单全部自动归因, 转介绍奖励可以按成交自动算 —— 这是把「熟人推荐」变成可结算资产的唯一办法。

3 · 企业客户标签体系

等级与来源在企微侧的落地形式。客户标签对客户端完全不可见,这是隔离的基础
等级组
晋升 = 换标签,权限自动跟着走
已创建
L1 · 观察30
L2 · 认证20
L3 · 金牌10
L4 · 签约4
平台组
群发按平台定向的筛选维度
已创建
小红书32
B哔哩哔哩24
抖音22
视频号14
微博11
垂类组
本次 add_corp_tag 新建
待创建
宠物11旅拍10婚礼10街拍9纪实9建筑9风光8人像7星空7后期调色6器材测评4美食2
标签额度与限制
企业客户标签总量9 / 10,000
已创建 9 个(等级 4 + 平台 5),本次计划新增 20 个(垂类 12 + 渠道 8)。
  • ·每企业最多 1 万个客户标签;标签名与组名 ≤30 字符。
  • ·每个成员对同一位客户最多 3000 个标签。
  • 应用只能增删改查自己创建的标签 —— 后台手工建的标签本应用改不了,所以标签体系必须全部由程序建立。
  • 客户标签对客户端完全不可见。博主不知道自己被打了什么标签,也看不到别人 —— 这正是辐条型网络在企微侧成立的前提。

4 · 群发配额看板

这些不是待优化的性能问题,是企微的产品约束,派单流程必须绕开它们设计
本月已确认发出
3 条任务
触达 34 人次
待运营手机确认
3 条任务
将触达 42 人次
单客户本月已收
1 / 4 条
全部确认后升至 2 / 4
单次群发覆盖
20 / 200 位
按标签筛选收件人
硬约束逐条
add_msg_template · 创建企业群发
  • 接口只创建任务。消息进入成员手机端「客户群发」待办,必须人在手机上逐条点确认才真正发出。「一句话给 200 个博主派单」在企微里做不到。
  • ·每位客户每天最多接收 1 条群发(成员创建与企业创建合并计算)。
  • ·企业统一创建的群发,每位客户每自然月最多 4 条
  • ·每次群发成员可选择 200 位客户,支持按标签筛选。
  • ·创建频率 10 次/分钟;朋友圈是另一套独立额度(每企业每月 10 万条,jobid 24 小时过期)。
本月各等级触达
按等级分层发不同文案,避免撞配额
等级任务收件人状态
L2 · 认证创作者bc_bf_001_L220已发出
L3 · 金牌创作者bc_bf_001_L310已发出
L4 · 签约创作者bc_bf_001_L44已发出
L1 · 观察创作者bc_bf_002_L112待手机确认
L2 · 认证创作者bc_bf_002_L220待手机确认
L3 · 金牌创作者bc_bf_002_L310待手机确认
配额稀缺反而是好事
既然触达要人工确认、每月每人只有 4 条,派单就必须两段式: 群发只发不含任何价格的通用邀约(「有一批秋季旅拍需求,感兴趣点这里」),真实报价走一对一的电子条款单。 这既绕开了人力瓶颈,又让差价天然不会出现在任何一条群发里 —— 约束和红线正好指向同一个设计。 配套做「催确认」:任务创建后用应用消息推一条待办提醒,2 小时未确认再催一次。

5 · 智能机器人 + MCP 插件

后台实测到的配置形态,以及它对权限设计意味着什么
插件配置形态
智能机器人 → 工具 → 插件
传输协议Streamable HTTP / SSE (无 stdio)
鉴权方式Header / Query + 静态 token (不支持 OAuth 2.1)
插件 URLhttps://mcp.huaige.cn/sse
长连接同一机器人同时只允许 1 条活跃连接,新连接踢掉旧的;心跳 30s
response_url有效期 1 小时,且只能调用一次
markdown 上限20480 字节(中文约 6800 字)
后台原文:「仅配置企业域名 URL 时,请求头中将返回提问者 userid」。 这一句是整套按人鉴权的地基 —— 用临时域名(trycloudflare / vercel 子域)拿不到 userid, 机器人就只能对所有人返回同一份数据,「运营看得到差价、博主看不到」的隔离会直接失效
创作者自助问答(设想)
同一个问题,不同的人拿到不同的答案
我这单什么时候结款?
外部创作者 · #037
→ MCP get_my_settlement
  header: x-wecom-userid = (企微注入,不可由调用方指定)
  header: authorization = Bearer ****
  scope: creator_self · 字段白名单不含 brandPricePerVideo
你的条款单 ts_0142 已验收,稿酬 ¥1,350, 预付 30% 已于 9 月 12 日打出。尾款按你的等级账期 T+7 结算,预计 9 月 26 日到账。
还需要我把完税凭证发你吗?
怀歌助手 · 流式回复
  • 智能机器人的服务对象是企业内部成员,外部创作者用不了单聊机器人。对外的等价通道是微信客服(客户主动发消息后 48 小时内最多 5 条)+ H5 深链。
  • ·必须同时校验静态 token 与 userid header(header 可伪造),并限制企微出口 IP。
  • ·异常分支要在 finally 里补发 finish=true,否则消息永远转圈。
为什么非要做机器人
主理人现在的时间全花在一对一回复「什么时候结款」「这条能不能改」上。 12 个人要管 64 位创作者、100–200 条视频,1v1 人力是最先崩的地方。 MCP 按 userid 鉴权意味着同一个机器人,运营问能看到差价与预算,创作者问只能拿到自己那一份 —— 自助问答不是锦上添花,它是让这张网络能扩到 500 人的前提。

本页触发的接口调用 · 8 次

DRY_RUN 模式下没有发出任何网络请求。以下是切到真实模式后会原样发出的请求
调用台账
WECOM_DRY_RUN=0 写进 .env.local 并配好两个 Secret,这些请求就会真的发出去
DRY_RUN
01GET/cgi-bin/gettoken取 客户联系 的 access_token
{
  "corpid": "wwdc467b59cb7eac44",
  "corpsecret": "CVu_········0Y"
}
文档 服务端API · 开发指南 · 获取access_token
前置 「客户联系」已开通,且本应用在「可调用接口的应用」白名单内
限制 2000 次/分/应用;token 有效期 7200s,必须缓存
02GET/cgi-bin/externalcontact/list拉取成员 HuaigeOps 名下的外部联系人 ID
{
  "userid": "HuaigeOps"
}
文档 客户联系 · 客户管理 · 获取客户列表
前置 客户联系已开通;本应用在「可调用接口的应用」白名单内;该成员在应用可见范围内
限制 30 万次/日/企业
03GET/cgi-bin/externalcontact/get取外部联系人 wmDemo0001AAA 的详情(state / 标签 / 添加时间)
{
  "external_userid": "wmDemo0001AAA",
  "cursor": ""
}
文档 客户联系 · 客户管理 · 获取客户详情
前置 客户联系白名单;unionid 需先绑定「微信开发者 ID」
限制 30 万次/日/企业
04POST/cgi-bin/externalcontact/add_contact_way创建渠道活码「老创作者引荐 · #037(2026Q3)」,state=referral_037
{
  "type": 2,
  "scene": 2,
  "remark": "老创作者引荐 · #037(2026Q3)",
  "skip_verify": true,
  "state": "referral_037",
  "user": [
    "HuaigeOps"
  ]
}
文档 客户联系 · 「联系我」与客户入群 · 配置客户联系「联系我」方式
前置 客户联系白名单;user 中的成员必须在应用可见范围内
限制 每企业 50 万个(与「加入群聊」活码共用);API 创建的活码后台不可见,必须自建台账
05POST/cgi-bin/externalcontact/mark_tag给客户 wmDemo0001AAA 打标签 et_渠道组_1 / et_平台组_2
{
  "userid": "HuaigeOps",
  "external_userid": "wmDemo0001AAA",
  "add_tag": [
    "et_渠道组_1",
    "et_平台组_2"
  ],
  "remove_tag": []
}
文档 客户联系 · 客户标签管理 · 编辑客户企业标签
前置 客户联系白名单;userid 须为实际添加该客户的成员
限制 每成员对同一客户最多 3000 个标签
06POST/cgi-bin/externalcontact/add_corp_tag建立客户标签组「垂类组」,含 12 个标签
{
  "group_name": "垂类组",
  "order": 1,
  "tag": [
    {
      "name": "人像",
      "order": 1
    },
    {
      "name": "风光",
      "order": 2
    },
    {
      "name": "街拍",
      "order": 3
    },
    {
      "name": "纪实",
      "order": 4
    },
    {
      "name": "建筑",
      "order": 5
    },
    {
      "name": "旅拍",
      "order": 6
    },
    {
      "name": "星空",
      "order": 7
    },
    {
      "name": "婚礼",
      "order": 8
    },
    {
      "name": "宠物",
      "order": 9
    },
    {
      "name": "美食",
      "order": 10
    },
    {
      "name": "器材测评",
      "order": 11
    },
    {
      "name": "后期调色",
      "order": 12
    }
  ]
}
文档 客户联系 · 客户标签管理 · 添加企业客户标签
前置 客户联系白名单;应用只能操作自己创建的标签
限制 每企业 1 万个标签;名称 ≤30 字符
07POST/cgi-bin/externalcontact/add_msg_template创建群发任务,覆盖 20 位客户 —— 创建后仍需运营在手机上确认
{
  "chat_type": "single",
  "external_userid": [
    "wmDemo0015AAA",
    "wmDemo0016AAA",
    "wmDemo0017AAA",
    "wmDemo0018AAA",
    "wmDemo0019AAA",
    "wmDemo0020AAA",
    "wmDemo0021AAA",
    "wmDemo0022AAA",
    "wmDemo0023AAA",
    "wmDemo0024AAA",
    "wmDemo0025AAA",
    "wmDemo0026AAA",
    "wmDemo0027AAA",
    "wmDemo0028AAA",
    "wmDemo0029AAA",
    "wmDemo0030AAA",
    "wmDemo0031AAA",
    "wmDemo0032AAA",
    "wmDemo0033AAA",
    "wmDemo0034AAA"
  ],
  "sender": "HuaigeOps",
  "text": {
    "content": "认证创作者你好,有一批秋季旅拍主题的内容需求,档期在 10-15 前。感兴趣点这里查看详情 →"
  },
  "attachments": [
    {
      "msgtype": "link",
      "link": {
        "title": "怀歌创作者计划 · 新需求",
        "url": "https://app.huaige.cn/m/c_015"
      }
    }
  ]
}
文档 客户联系 · 消息推送 · 创建企业群发
前置 客户联系白名单;发送成员需在应用可见范围内
限制 只创建任务,必须成员手机端确认;每客户每天 1 条、企业统一群发每客户每自然月 4 条;每次 200 位客户;10 次/分钟
08POST/cgi-bin/externalcontact/get_user_behavior_data拉取 HuaigeOps 近期的加人 / 会话 / 回复率统计
{
  "userid": [
    "HuaigeOps"
  ],
  "start_time": 1789689600,
  "end_time": 1789862400
}
文档 客户联系 · 统计管理 · 获取「联系客户统计」数据
前置 客户联系白名单;userid 与 partyid 不可同时为空
限制 各最多 100 个;单次跨度 ≤30 天;只保留最近 180 天;多 userid 返回汇总而非按人拆分

真实接入还差什么

按依赖顺序排列。任何一项没做,对应接口一律返回无权限,而不是提示你少了什么
后台前置项 checklist
3 项待办 · 2 项待确认
接口同步已开启,权限「读取并编辑」已配置
管理工具 · 通讯录同步·不开则读不到成员 userid
已配置 5 个服务器出口 IP已配置
应用管理 · 阅读助手 · 企业可信 IP·不配则报 60020 not allow to access from your ip
客户联系已开通,外部联系人额度 2000 位已配置
客户联系·经营类目为摄影/扩印,无行业限制
把「阅读助手」加入白名单(需进后台核对是否已勾选)待确认
客户联系 · 客户 · API · 可调用接口的应用·不勾则 externalcontact/* 全族接口一律无权限 —— 最常见的踩坑点
审批 / 汇报 / 打卡等,用到哪个勾哪个待确认
各 OA 模块 · 可调用应用白名单·结算走审批流时必须先勾,否则审批接口无权限
绑定微信开放平台账号未配置
客户联系 · 微信开发者 ID 绑定·不绑则 externalcontact/get 不返回 unionid,将来打通微信生态断路,现在就该绑
一次性配 app.huaige.cn(门户)+ mcp.huaige.cn(MCP 插件)并通过归属校验未配置
应用管理 · 网页授权及 JS-SDK · 可信域名·每企业每月最多设置 20 次,超限月级封禁 30 天,且不支持通配符 —— 域名规划必须一次定死
打开开关,才能推千人千面的工作台挂件未配置
应用管理 · 阅读助手 · 工作台自定义展示·不开则 set_workbench_template / set_workbench_data 调用无效;keydata 最多 4 项,频控 10 次/分/用户
可信域名是整个项目唯一能被卡死 30 天的地方。本地联调全程用 DRY_RUN,域名与开关一次性配完,正式域名上只做一次联调 —— 这条纪律比任何代码都重要。 完整说明见 lib/wecom/README.md