PRD Demo:服务号模板消息(OA)实现路径
用于写 PRD:讲清楚「是否需要订阅」「在哪里触发」「用户端与后台如何配合」。以本仓库的
config_demo(1).html
口径(字段名带
.DATA
)为准。
可交互 Demo(纯前端,无后端调用)
1) 是否需要“订阅”?(结论 + PRD 可直接引用)
服务号模板消息
“如果要订阅”替代方案
结论
服务号模板消息(OA)不需要用户在 App/小程序里“订阅”。
可发送的关键前置条件是:
用户已关注该服务号
,且你使用的是该服务号下的
openid
进行发送;否则会报
40003 invalid openid
(常见原因:未关注或 openid 不属于该公众号)。
你在 PRD 里写「用户侧需要做什么」
用户只要关注服务号即可成为可推送对象(无需额外订阅弹窗)。
需要解决身份绑定:业务用户 ↔ 公众号
openid
。
用户点击消息卡片后跳转:可配 H5
url
或小程序
miniprogram
。
你在 PRD 里写「平台/技术侧需要做什么」
后台同步模板列表:拉取已选用模板(用于配置中心选择)。
配置映射:内部变量 → 外部占位符(形如
keyword1.DATA
)。
服务端发送:
touser/openid
+
template_id
+
data
。
注意
“订阅”通常属于另一类产品形态(例如小程序订阅消息/公众号订阅通知)。
如果你们将来要做“用户显式订阅”,触发位置的原则是:必须在微信客户端环境里完成授权(而不是任意原生 App 页面)。
方案 A:仍用 OA 模板消息(本期默认)
用户动作
关注服务号(即可)
触发位置
公众号关注页 / 引导关注页面(App 内可做引导)
限制
只能发给已关注用户;内容受平台规则限制
方案 B:如果要“订阅弹窗”体验
用户动作
在微信环境中点击“订阅/允许”(由微信弹窗完成)
触发位置
微信内 H5 / 小程序页(不是任意原生 App 页面)
建议
把“订阅”作为单独功能点写进 PRD,并标注与 OA 模板消息不是同一条能力链路
3) 建议你在 PRD 里写的“实现路径”(一页搞定)
可复制到 PRD 的结构
A. 管理后台(配置中心)
同步模板:拉取服务号“已选用模板列表”,供管理员搜索/选择。
内部模板:
internal_template_id
+ 名称 + 渠道=OA。
映射配置:内部变量 → 外部占位符(如
amount → keyword1.DATA
)。
跳转配置:H5
url
或小程序
miniprogram(appid/pagepath)
。
B. 用户侧(“关注 + 绑定”)
App / 小程序提供入口:“绑定微信接收通知”。
绑定动作必须在微信环境内完成:打开微信内 H5(OAuth 获取 openid)或在公众号交互事件里拿 openid。
用户关注服务号后即具备接收资格;无需订阅弹窗。
C. 业务调用(统一发送接口)
业务系统只传:要发给谁(业务用户ID/openid)、发哪个内部模板、业务数据 KV。
消息中台负责:查配置、做映射、组装
data
、调用微信发送。
建议幂等:
client_msg_id
防重入;建议记录
msgid
便于追踪。
D. 失败与排障(PRD 可写验收点)
未关注/不属于该公众号:会失败(典型
invalid openid
)。
内容违规/模板被限:需要可观测(错误码 + 记录)。
可选:提供“查询被拦截消息”排障入口(运营/管理员用)。