
在微信生态中,小程序与公众号是两个重要的用户触达渠道。然而,由于它们属于不同的应用形态,用户身份默认是隔离的。若想实现“从小程序触发,向用户推送公众号模板消息”的功能(如待办提醒、订单通知等),就需要打通二者之间的用户身份体系。
本文将详细介绍如何利用微信开放平台的 UnionID 机制,实现小程序与公众号的用户身份统一,并通过服务端调用接口,向已关注公众号的用户发送模板消息。适用于需要强通知能力的小程序场景,如任务提醒、审批通知、预约提醒等。
我们先通过一张流程图快速理解整个实现过程的核心环节:

关键前提:只有当用户同时使用小程序并关注了对应的公众号时,才能成功收到消息。
在编写代码前,必须完成以下基础配置,否则后续所有操作都无法生效。
UnionID,也无法调用高级接口。这是实现身份打通的核心前提。


UnionID 是微信为同一微信用户在同一个开放平台账号下的多个应用分配的唯一标识。只要用户使用同一微信登录多个绑定到同一开放平台的应用,就能获得相同的 UnionID。
进入【公众号后台】→【设置与开发】→【基本配置】:

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

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

要实现跨应用消息推送,核心在于找到目标用户在公众号侧的 OpenID。而连接小程序与公众号身份的桥梁,就是 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...' }
获取公众号的 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...' }
建议在数据库中设计一张用户绑定关系表:
字段名 | 类型 | 说明 |
|---|---|---|
unionid | string | 全局唯一用户 ID |
openid_mini | string | 小程序 OpenID |
openid_mp | string | 公众号 OpenID |
created_at | datetime | 创建时间 |
updated_at | datetime | 更新时间 |
当从小程序触发消息时,可通过
unionid查出openid_mp,进而向公众号发送模板消息。

示例模板内容:
项目名称:{{thing9.DATA}}
创建时间:{{time22.DATA}}
执行进度:{{phrase10.DATA}}
当业务逻辑触发待办提醒(如创建新任务、审批通过等),服务端执行以下流程:
GET https://api.weixin.qq.com/cgi-bin/token?
grant_type=client_credential&
appid=APPID&
secret=SECRET
access_token有效期为 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": "请尽快完成,逾期将影响绩效考核。"
}
}
}参数 | 是否必填 | 说明 |
|---|---|---|
touser | 是 | 用户在公众号中的 OpenID(通过 UnionID 查询得到) |
template_id | 是 | 公众号后台申请的模板 ID |
url | 否 | 用户点击消息后的跳转网页链接(H5) |
miniprogram | 否 | 点击后跳转的小程序(必须与公众号已关联) |
data | 是 | 模板数据,字段需与模板定义一致 |
支持同时设置
url和miniprogram,但用户只能点击其中一个(优先小程序)。
成功返回:
{
"errcode": 0,
"errmsg": "ok",
"msgid": 2434567890
}失败返回(常见错误):
errcode | 含义 | 解决方案 |
|---|---|---|
40003 | 无效的 OpenID | 检查用户是否关注公众号 |
40037 | template_id 不正确 | 核对模板 ID 是否准确 |
43004 | 用户未关注公众号 | 提示用户先关注 |
45009 | 接口调用频率超限 | 控制发送频率,加入队列机制 |
特性 | 二维码扫码关注 | 公众号关注组件 |
|---|---|---|
实现难度 | 简单 | 中等(需配置) |
用户体验 | 差(多步操作) | 好(一键关注) |
转化率 | 较低 | 较高 |
自定义能力 | 高 | 低(样式固定) |
状态监听 | 困难(需带参+事件) | 支持加载状态 |
官方推荐 | ❌ | ✅ |
适用范围 | 所有小程序 | 需绑定开放平台 |
示例代码(WXML)
<view class="subscribe-guide">
<image src="/images/mp-qrcode.png" mode="widthFix" />
<text>长按识别二维码,关注我们获取最新通知</text>
</view>优点
缺点
使用前提
WXML 使用示例
<!-- 关注组件 -->
<official-account
style="margin: 20px auto;"
bindload="onOfficialAccountLoad"
binderror="onOfficialAccountError">
</official-account>JS 监听加载状态(可选)
Page({
onOfficialAccountLoad() {
console.log('公众号关注组件加载成功');
},
onOfficialAccountError(e) {
console.error('公众号关注组件加载失败', e.detail);
// 可在此降级显示二维码
}
})优点
缺点
miniprogram.appid 必须是与公众号已关联的小程序。pagepath 必须是已发布上线的页面路径,不能包含未发布功能。wx.getUserProfile() 或 button.open-type="getPhoneNumber" 等方式获取用户信息时,也可能带回 UnionID(需用户授权)。access_token 应全局缓存,避免频繁请求。关键点 | 说明 |
|---|---|
身份打通 | 依赖微信开放平台 + UnionID |
消息通道 | 公众号模板消息 |
前提条件 | 用户关注公众号 + 账号绑定开放平台 |
实现路径 | 小程序获取 UnionID → 映射公众号 OpenID → 调用 API 发送 |
推荐场景 | 待办提醒、审批通知、预约提醒、订单状态变更等强提醒场景 |
通过以上方案,你可以实现从微信小程序触发,向用户推送高到达率的公众号服务通知,显著提升关键信息的触达效率。
如果你在实际开发中遇到以下问题,欢迎继续交流: