文章目录
- 概述
- 一、 整体流程概览
- 二、 前期准备工作
- 1. 账号准备与认证
- 2. 绑定至微信开放平台
- 3. 配置服务器信息(公众号)
- 4.公众号绑定小程序
- 5.小程序配置
- 三、 核心实现步骤
- 步骤一:获取用户的 UnionID 并建立身份映射
- 1.小程序端获取 UnionID
- 2.公众号端获取 UnionID
- 3.建立用户身份映射表
- 步骤二:配置公众号模板消息
- 步骤三:服务端发送模板消息
- 1. 获取 access_token(公众号)
- 2. 构造并发送模板消息
- 3.参数说明:
- 4. 处理响应结果
- 四、 重要注意事项与最佳实践
- 1. 用户必须关注公众号
- 2. 小程序内关注公众号的方式
- 1.小程序内引导用户识别二维码关注公众号
- 2. 通过“公众号关注组件”实现。(官方推荐)
- 3. 小程序跳转限制
- 4. 消息频率与用户体验
- 5. UnionID 获取失败排查
- 6. 安全与稳定性建议
- 五、 建议
- 六、 总结
概述
在微信生态中,小程序与公众号是两个重要的用户触达渠道。然而,由于它们属于不同的应用形态,用户身份默认是隔离的。若想实现“从小程序触发,向用户推送公众号模板消息”的功能(如待办提醒、订单通知等),就需要打通二者之间的用户身份体系。
本文将详细介绍如何利用微信开放平台的 UnionID 机制,实现小程序与公众号的用户身份统一,并通过服务端调用接口,向已关注公众号的用户发送模板消息。适用于需要强通知能力的小程序场景,如任务提醒、审批通知、预约提醒等。
一、 整体流程概览
我们先通过一张流程图快速理解整个实现过程的核心环节:
关键前提:只有当用户同时使用小程序并关注了对应的公众号时,才能成功收到消息。
二、 前期准备工作
在编写代码前,必须完成以下基础配置,否则后续所有操作都无法生效。
1. 账号准备与认证
- 微信公众号:必须是已认证的服务号(订阅号无模板消息权限)。
- 微信小程序:必须是已认证的小程序。
- 注意:未认证账号无法获取
UnionID,也无法调用高级接口。
2. 绑定至微信开放平台
这是实现身份打通的核心前提。
- 登录 微信开放平台,创建或使用已有开放平台账号。
- 将你的公众号和小程序均绑定到同一个开放平台账号下。
- 绑定完成后,同一用户在不同应用中的身份将通过 UnionID 实现统一识别。


UnionID 是微信为同一微信用户在同一个开放平台账号下的多个应用分配的唯一标识。只要用户使用同一微信登录多个绑定到同一开放平台的应用,就能获得相同的 UnionID。
3. 配置服务器信息(公众号)
进入【公众号后台】→【设置与开发】→【基本配置】:
-
APPID和Appsecret:
- 生成并保存用于调用发送模版消息接口。
-
IP 白名单:
- 在【公众号设置】→【功能设置】中添加你的服务器出口 IP,确保能正常调用微信 API。

4.公众号绑定小程序
进入【公众号后台】→【广告与服务】→【小程序管理】:绑定后 用户点击公众号的模版消息才可以跳转到对应的小程序

5.小程序配置
进入【公众号后台】→【广告与服务】→【小程序管理】,查看是否已关联公众号,是否允许公众号进行跳转

三、 核心实现步骤
步骤一:获取用户的 UnionID 并建立身份映射
要实现跨应用消息推送,核心在于找到目标用户在公众号侧的 OpenID。而连接小程序与公众号身份的桥梁,就是 UnionID。
1.小程序端获取 UnionID
-
小程序前端调用
wx.login()获取临时登录凭证code:wx.login({ success(res) { if (res.code) { // 将 code 发送给后端 wx.request({ url: 'https://yourdomain.com/api/login', method: 'POST', data: { code: res.code } }) } } }) -
服务端使用
code+ 小程序 AppID/Secret 调用jscode2session接口:GET https://api.weixin.qq.com/sns/jscode2session? appid=APPID& secret=SECRET& js_code=JSCODE& grant_type=authorization_code返回示例:
{ "openid": "oABC123456", "session_key": "SESSIONKEY", "unionid": "uABC123456", "expires_in": 7200 }注意:只有绑定开放平台后,此接口才会返回
unionid字段。 -
服务端保存:
{ openid_mini: 'oABC...', unionid: 'uABC...' }
2.公众号端获取 UnionID
-
获取公众号的
access_token:GET https://api.weixin.qq.com/cgi-bin/token? grant_type=client_credential& appid=APPID& secret=SECRET -
获取关注用户列表:
GET https://api.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN返回包含一批
openid的列表。 -
遍历每个
openid,调用用户信息接口:GET https://api.weixin.qq.com/cgi-bin/user/info? access_token=ACCESS_TOKEN& openid=OPENID& lang=zh_CN返回示例:
{ "subscribe": 1, "openid": "oDEF7890", "nickname": "张三", "unionid": "uABC123456" } -
服务端保存:
{ openid_mp: 'oDEF...', unionid: 'uABC...' }
3.建立用户身份映射表
建议在数据库中设计一张用户绑定关系表:
| 字段名 | 类型 | 说明 |
|---|---|---|
| unionid | string | 全局唯一用户 ID |
| openid_mini | string | 小程序 OpenID |
| openid_mp | string | 公众号 OpenID |
| created_at | datetime | 创建时间 |
| updated_at | datetime | 更新时间 |
当从小程序触发消息时,可通过
unionid查出openid_mp,进而向公众号发送模板消息。
步骤二:配置公众号模板消息
-
进入【公众号后台】→【广告与服务】→【模板消息】→【模板库】。

-
搜索合适的模板(如“待办事项提醒”、“订单状态通知”等),点击“添加”。
-
添加成功后,记录以下关键信息:
- 模板 ID(template_id)
- 模板内容结构(关键词数量、字段名、示例值)
示例模板内容:
项目名称:{{thing9.DATA}} 创建时间:{{time22.DATA}} 执行进度:{{phrase10.DATA}}

- 建议:将常用模板 ID 和字段结构维护在服务端配置文件中,便于动态调用。
步骤三:服务端发送模板消息
当业务逻辑触发待办提醒(如创建新任务、审批通过等),服务端执行以下流程:
1. 获取 access_token(公众号)
GET https://api.weixin.qq.com/cgi-bin/token?
grant_type=client_credential&
appid=APPID&
secret=SECRET
access_token有效期为 2 小时,建议缓存并自动刷新。
2. 构造并发送模板消息
调用微信模板消息发送接口:
POST https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN
请求体(JSON)示例:
{
"touser": "OPENID_IN_MP",
"template_id": "TEMPLATE_ID_HERE",
"url": "https://yourdomain.com/task/123",
"miniprogram": {
"appid": "wxdemo123456789",
"pagepath": "pages/task/detail?id=123"
},
"data": {
"first": {
"value": "您有一条新的待办事项",
"color": "#173177"
},
"keyword1": {
"value": "项目周报提交"
},
"keyword2": {
"value": "2025-10-25 18:00"
},
"remark": {
"value": "请尽快完成,逾期将影响绩效考核。"
}
}
}
3.参数说明:
| 参数 | 是否必填 | 说明 |
|---|---|---|
touser | 是 | 用户在公众号中的 OpenID(通过 UnionID 查询得到) |
template_id | 是 | 公众号后台申请的模板 ID |
url | 否 | 用户点击消息后的跳转网页链接(H5) |
miniprogram | 否 | 点击后跳转的小程序(必须与公众号已关联) |
data | 是 | 模板数据,字段需与模板定义一致 |
支持同时设置
url和miniprogram,但用户只能点击其中一个(优先小程序)。
4. 处理响应结果
成功返回:
{
"errcode": 0,
"errmsg": "ok",
"msgid": 2434567890
}
失败返回(常见错误):
| errcode | 含义 | 解决方案 |
|---|---|---|
| 40003 | 无效的 OpenID | 检查用户是否关注公众号 |
| 40037 | template_id 不正确 | 核对模板 ID 是否准确 |
| 43004 | 用户未关注公众号 | 提示用户先关注 |
| 45009 | 接口调用频率超限 | 控制发送频率,加入队列机制 |
四、 重要注意事项与最佳实践
1. 用户必须关注公众号
- 模板消息只能发送给已关注公众号的用户。
- 若用户未关注,即使有 UnionID 也无法发送。
2. 小程序内关注公众号的方式
| 特性 | 二维码扫码关注 | 公众号关注组件 |
|---|---|---|
| 实现难度 | 简单 | 中等(需配置) |
| 用户体验 | 差(多步操作) | 好(一键关注) |
| 转化率 | 较低 | 较高 |
| 自定义能力 | 高 | 低(样式固定) |
| 状态监听 | 困难(需带参+事件) | 支持加载状态 |
| 官方推荐 | ❌ | ✅ |
| 适用范围 | 所有小程序 | 需绑定开放平台 |
1.小程序内引导用户识别二维码关注公众号
- 在【微信公众号后台】生成公众号的永久二维码(可带参数)。
- 将该二维码图片上传至小程序资源或 CDN。
- 在小程序页面中以弹窗、浮层、引导页等形式展示二维码,并配以文字提示,如:
- 用户长按识别二维码后跳转至公众号主页,点击“关注”即可完成操作。
示例代码(WXML)
<view class="subscribe-guide">
<image src="/images/mp-qrcode.png" mode="widthFix" />
<text>长按识别二维码,关注我们获取最新通知</text>
</view>
优点
- 简单易实现,兼容所有小程序版本。
- 可自定义样式与布局,灵活控制展示时机(如首次进入、提交表单后等)。
- 支持带参数二维码,可用于用户来源追踪。
缺点
- 操作路径较长:需长按 → 识别 → 跳转 → 关注。
- 用户流失率较高,体验不够流畅。
- 无法直接判断用户是否完成关注(除非结合带参二维码 + 后台事件推送)。
2. 通过“公众号关注组件”实现。(官方推荐)
- 用户点击后弹出确认框,确认后自动关注公众号。
- 支持实时监听用户关注状态变化。
- 体验更流畅,转化率显著高于二维码方式。
- 组件由微信提供,安全合规。
使用前提
- 小程序与公众号需绑定在同一微信开放平台账号下。
- 公众号需为已认证的服务号。
- 小程序管理后台需开启“公众号关注组件”功能:
- 登录【小程序后台】→【设置】→【功能设置】→ 开启“公众号关注组件”。
WXML 使用示例
<!-- 关注组件 -->
<official-account
style="margin: 20px auto;"
bindload="onOfficialAccountLoad"
binderror="onOfficialAccountError">
</official-account>
JS 监听加载状态(可选)
Page({
onOfficialAccountLoad() {
console.log('公众号关注组件加载成功');
},
onOfficialAccountError(e) {
console.error('公众号关注组件加载失败', e.detail);
// 可在此降级显示二维码
}
})
优点
- 一键关注,流程极简,用户体验好。
- 可监听加载状态,便于做降级处理(如组件加载失败时显示二维码)。
- 官方支持,未来功能迭代有保障。
缺点
- 不支持所有小程序类目(部分特殊行业受限)。
- 样式固定,不可高度自定义外观。
- 需要用户授权,部分用户可能因隐私顾虑拒绝。
3. 小程序跳转限制
miniprogram.appid必须是与公众号已关联的小程序。pagepath必须是已发布上线的页面路径,不能包含未发布功能。
4. 消息频率与用户体验
- 公众号模板消息有每日群发限制(通常为无上限,但单用户不可高频打扰)。
- 微信会对频繁发送无关通知的账号进行限流或封禁。
- 建议:按需发送、内容简洁、提供退订机制。
5. UnionID 获取失败排查
- 确保小程序和公众号都已绑定至同一开放平台账号。
- 使用
wx.getUserProfile()或button.open-type="getPhoneNumber"等方式获取用户信息时,也可能带回 UnionID(需用户授权)。 - 测试时可用开放平台提供的“UnionID 获取工具”验证。
6. 安全与稳定性建议
- 所有敏感接口调用应在服务端完成,避免泄露 AppSecret。
access_token应全局缓存,避免频繁请求。- 对消息发送失败的情况,建议加入重试机制和日志记录。
五、 建议
- 使用【微信公众平台测试账号】进行开发调试:
- 可自由配置模板、接收消息,无需审核。
- 支持扫码关注模拟真实场景。
- 小程序也可使用体验版配合测试号进行全流程验证。
六、 总结
| 关键点 | 说明 |
|---|---|
| 身份打通 | 依赖微信开放平台 + UnionID |
| 消息通道 | 公众号模板消息 |
| 前提条件 | 用户关注公众号 + 账号绑定开放平台 |
| 实现路径 | 小程序获取 UnionID → 映射公众号 OpenID → 调用 API 发送 |
| 推荐场景 | 待办提醒、审批通知、预约提醒、订单状态变更等强提醒场景 |
通过以上方案,你可以实现从微信小程序触发,向用户推送高到达率的公众号服务通知,显著提升关键信息的触达效率。
如果你在实际开发中遇到以下问题,欢迎继续交流:
- 如何自动化同步用户关注状态?
- 如何设计高效的 UnionID 映射系统?
- 如何结合云开发(CloudBase)简化流程?
- 如何升级到订阅消息(一次性订阅/长期订阅)?
7875

被折叠的 条评论
为什么被折叠?



