主题
10 — 模板消息代发(HMAC)
第三方委托平台使用已配置模板发送短信 / 微信公众号 / 邮件。
与事项/公告管道并列、独立:不写站内收件箱。
设计方案:doc/45-开放模板消息代发.md。
代码锚点:OpenNotifyController、OpenNotifyHmacFilter、OpenNotifySendService。
基路径:/api/open/notify
鉴权:与 02-事项推送-HMAC.md 完全一致。
1. 鉴权头
| Header | 必填 | 说明 |
|---|---|---|
X-Client-Id | 是 | SSO client_id |
X-Timestamp | 是 | Unix 秒,±300 |
X-Signature | 是 | HMAC-SHA256 Hex |
X-Idempotency-Key | 否 | 一期仅透传,幂等以 Body externalId 为准 |
签名串:
text
{clientId}\n{timestamp}\n{rawBody}GET /records 无 Body 时 rawBody 为空串。system_code 只认 Client 绑定。
2. 接口
2.1 提交代发
POST /api/open/notify/send
| 字段 | 必填 | 说明 |
|---|---|---|
externalId | 是 | 第三方业务主键;UK=(system_code, externalId),同键返回原记录 |
channelType | 是 | EMAIL / SMS / WECHAT |
templateCode | 是 | 邮件/短信为平台 templateCode;微信为 sceneCode |
templateParams | 否 | Map<String,String> 模板变量 |
username | 是 | 平台用户名(必须存在且启用) |
email | 否 | 仅 EMAIL;若传须与用户档案邮箱一致 |
phone | 否 | 仅 SMS;若传须与用户绑定手机一致 |
openid | 否 | 仅 WECHAT;若传须与用户 wechat_oa_openid 一致 |
成功 data:
| 字段 | 说明 |
|---|---|
requestCode | 入站请求编码 |
externalId | 回显 |
status | DISPATCHED / 幂等时为历史状态 |
outboundRecordCode | 外发台账编码(已派发时) |
outboundStatus | 外发状态摘要(若可查) |
errorMessage | 失败摘要 |
业务拒绝(用户不存在、账号不一致、未绑定、模板停用)→ code=400,并写入入站台账 status=REJECTED(不调用外发)。
2.2 查询记录
GET /api/open/notify/records?requestCode= 或 ?externalId=(二选一)
返回入站记录 + 可选 outboundStatus。仅本 Client 绑定 system_code 下可见。
3. 收件人规则
- 必须传
username;禁止无平台账号的裸手机/邮箱/openid 代发。 - 未传渠道直达字段时,从用户档案解析(邮箱 / 手机明文 /
wechat_oa_openid)。 - 传了直达字段则必须与档案一致,否则 400。
- 档案未绑定对应渠道 → 400「用户未绑定…」。
微信 openid 绑定:登录用户 PUT /api/notify/wechat/oa-openid(管理端会话,非本开放面)。
4. 模板
仅能使用平台已配置且启用的模板:
- 邮件:
/api/notify/mail/templates(管理端) - 短信:
/api/notify/sms/templates - 微信:
/api/notify/wechat/templates(sceneCode)
第三方不能通过本 API 注册模板。
5. 与其他管道边界
| 能力 | 路径 | 是否本能力 |
|---|---|---|
| 站内待办 | /api/open/matters | 否 |
| 站内公告 | /api/open/notices | 否 |
| 模板代发 | /api/open/notify/** | 是 |
| 管理端通知配置 | /api/notify/** | 否(非第三方) |