CRM 直接提交客户业务字段,PushMsg 将其转换为“仙宝科技”公众号的“新客户跟进通知”。公众号通道、微信模板 ID 与微信字段名由服务端配置。
接口与鉴权
服务地址:https://openid.xianboss.com。
| 方法 | 路径 | 用途 |
|---|---|---|
| POST | /api/v1/crm/push |
提交客户跟进通知 |
| GET | /api/v1/crm/messages/{id} |
查询当前调用方的消息状态 |
| GET | /api/v1/crm/template |
查看当前模板与字段映射 |
每个调用系统同时携带 X-API-Key: YOUR_CRM_API_KEY 和 X-API-Secret: YOUR_CRM_API_SECRET。Key 也支持 Authorization: Bearer YOUR_CRM_API_KEY,Secret 仍必填。凭据须具有当前 CRM 公众号通道权限,且 OpenID 须已在后台绑定到该系统及通道。未绑定或停用的接收人返回 403 RECIPIENT_FORBIDDEN,不会入队。
系统之间的接收人独立授权;新系统没有接收人时不能推送。凭据轮换会同时更换 Key 和 Secret,旧凭据立即失效。旧版单 Key 接入需先在管理后台轮换凭据、配置接收人,再使用双凭据请求。
openId 对应通知接收人,例如 CRM 负责人或管理人员;客户字段描述 CRM 中的客户记录。接收人的 OpenID 必须属于目标公众号,可通过 OpenID 页面获取后由管理员绑定到对应调用系统,再与 CRM 员工账号绑定;仅获取 OpenID 不会自动授予推送权限。
提交请求
POST /api/v1/crm/push
Content-Type: application/json
X-API-Key: YOUR_CRM_API_KEY
X-API-Secret: YOUR_CRM_API_SECRET
{
"requestId": "crm-customer-C0001-followup-001",
"openId": "YOUR_OPENID",
"customerName": "测试客户",
"customerType": "潜在客户",
"customerSource": "CRM录入",
"customerPhone": "13800000000",
"markedAt": "2026-10-26 11:00",
"url": "https://crm.example.com/customers/C0001"
}
| 字段 | 必填 | 类型与限制 |
|---|---|---|
| requestId | 是 | 非空字符串,最长 128 字符;在当前调用方中标识一条业务通知 |
| openId | 是 | 非空字符串,最长 128 字符;通知接收人在目标公众号下的 OpenID |
| customerName | 是 | 非空字符串,最长 20 字符 |
| customerType | 是 | 非空字符串,最长 20 字符 |
| customerSource | 是 | 非空字符串,最长 20 字符 |
| customerPhone | 是 | 3–17 字符,至少包含一个数字;允许数字、+、括号、空格和短横线 |
| markedAt | 是 | 有效的北京时间,严格格式 yyyy-MM-dd HH:mm |
| url | 否 | 完整 HTTP/HTTPS URL,最长 2048 字符;可省略或传 null |
所有字段使用 JSON 字符串;必填字段不可为空白,字符串不接受控制字符。服务不会自动去除空格或改写值。markedAt 不会默认取当前时间,重试时应保持本次业务事件的时间不变。
请求只接受表中字段。channelId、templateId、type、data 或其他额外字段会返回 400 UNSUPPORTED_CRM_FIELD。
成功接收与去重
首次提交返回 HTTP 202:
{
"id": "11111111-2222-4333-8444-555555555555",
"status": "PENDING",
"duplicate": false
}
幂等范围为“调用方应用 + requestId”,标识区分大小写。同一标识及相同映射内容返回 HTTP 200、原消息 ID、当前状态及 duplicate:true;内容变化返回 409 IDEMPOTENCY_CONFLICT。JSON 对象键顺序不影响去重,接收人、字段值和详情 URL 的变化会影响消息内容。
状态查询
curl --fail-with-body \
'https://openid.xianboss.com/api/v1/crm/messages/11111111-2222-4333-8444-555555555555' \
-H "X-API-Key: $CRM_PUSH_API_KEY" \
-H "X-API-Secret: $CRM_PUSH_API_SECRET"
必须使用原调用方的密钥;其他调用方的消息按不存在处理,返回 HTTP 404。
{
"id": "11111111-2222-4333-8444-555555555555",
"requestId": "crm-customer-C0001-followup-001",
"status": "SENT",
"attempts": 1,
"maxAttempts": 5,
"wechatMessageId": "WECHAT_MESSAGE_ID",
"lastError": null,
"createdAt": "2026-10-26T11:00:00",
"updatedAt": "2026-10-26T11:00:01"
}
时间字段按北京时间返回,可能带小数秒。微信消息 ID 以字符串处理,未成功或微信未返回时可能为 null。
| status | 含义 | CRM 处理方式 |
|---|---|---|
| PENDING | 等待发送 | 稍后查询 |
| PROCESSING | 正在处理 | 继续查询原任务 |
| RETRY | 等待自动重试 | 等待队列处理 |
| SENT | 微信接口已接受 | 记录结果;接收、阅读情况需在微信客户端确认 |
| FAILED | 明确拒绝、配置错误或达到尝试上限 | 查看 lastError 并联系管理员处理 |
| UNKNOWN | 结果无法确定 | 人工核实后再决定是否重试 |
可每 2–5 秒查询一次,按业务量适当放宽间隔。对网络超时或临时服务错误的提交重试,应继续使用原 requestId 和原内容。UNKNOWN 人工重试可能产生重复通知。
模板字段映射
GET /api/v1/crm/template
X-API-Key: YOUR_CRM_API_KEY
X-API-Secret: YOUR_CRM_API_SECRET
当前默认通道为 xianbao,模板为“新客户跟进通知”。接口会返回通道 ID、模板名称、模板 ID、时区及以下字段映射,调用方须有该通道权限。
| CRM 字段 | 微信字段 | 显示名称 |
|---|---|---|
| customerName | thing2 | 客户名称 |
| customerType | thing3 | 客户类型 |
| customerSource | thing5 | 客户来源 |
| customerPhone | phone_number6 | 客户电话 |
| markedAt | time8 | 标记时间 |
发送时使用左侧业务字段即可。当前完整微信模板 ID 为 OpH0RvriM-Zi5WmN25X6ox0FY6rKMoStoXb_ab-jiRw;以模板配置接口返回值为准。
cURL 调用
先将请求示例保存为 crm-message.json,替换接收人和业务数据,再执行:
export CRM_PUSH_API_KEY='YOUR_CRM_API_KEY'
export CRM_PUSH_API_SECRET='YOUR_CRM_API_SECRET'
curl --fail-with-body \
'https://openid.xianboss.com/api/v1/crm/push' \
-H "X-API-Key: $CRM_PUSH_API_KEY" \
-H "X-API-Secret: $CRM_PUSH_API_SECRET" \
-H 'Content-Type: application/json' \
--data-binary @crm-message.json
下载 CRM JSON 示例或 OpenAPI 3.0.3 定义。完整的可编译 Java 17 标准库调用和轮询示例见 完整 CRM 调用文档。
错误码与限制
应用错误一般返回以下 JSON;入口层的请求大小与限流错误也可能返回 HTTP 错误页面。
{"code":"INVALID_CRM_TIME","message":"markedAt 必须是有效的北京时间,格式 yyyy-MM-dd HH:mm"}
| HTTP | 主要原因 |
|---|---|
| 400 | 字段、格式、日期、电话或 URL 校验失败;CHANNEL_DISABLED 表示通道停用 |
| 401 | Key 或 Secret 缺失、不匹配、尚未配置,或调用方已停用 |
| 403 | CHANNEL_FORBIDDEN:无通道权限;RECIPIENT_FORBIDDEN:OpenID 未绑定到当前调用系统或已撤销 |
| 404 | 消息不存在或不属于当前调用方 |
| 409 | IDEMPOTENCY_CONFLICT,同一请求标识对应了不同内容 |
| 413 | 请求体超过 64KB |
| 429 | 按来源 IP 限流,请延迟后复用原请求重试 |
| 500 / 503 | 服务暂不可用;CRM_NOT_CONFIGURED 表示渠道或模板配置不完整 |
常见 400 错误包括 VALIDATION_ERROR、INVALID_CRM_REQUEST、INVALID_CRM_TIME、INVALID_CRM_PHONE、UNSUPPORTED_CRM_FIELD 和 INVALID_URL。微信最终拒绝的任务会记录为 FAILED,具体原因见 lastError。