适用场景
适用于需要微信头像、昵称的活动签到、互动报名等小程序业务。已有小程序登录体系,同时具备可使用网页授权的公众号,以及同一微信开放平台下的账号关联条件。本文以活动参与场景的实际实现为例,说明如何把公众号取得的资料安全附加到原小程序会话。
基于 UniApp、公众号 OAuth 与 UnionID,打通“小程序进入 → 网页授权 → 自动返回 → 读取资料”的流程。使用短期一次性票据绑定原登录会话,并保留原生头像昵称填写作为兜底。

适用于需要微信头像、昵称的活动签到、互动报名等小程序业务。已有小程序登录体系,同时具备可使用网页授权的公众号,以及同一微信开放平台下的账号关联条件。本文以活动参与场景的实际实现为例,说明如何把公众号取得的资料安全附加到原小程序会话。
配置条件:小程序须具备 web-view 使用条件,个人类型小程序目前不支持该组件。公众号须具备网页授权权限,通常使用已认证服务号。完成同一开放平台的账号绑定,并确认两端 UnionID 实际可用。分别配置小程序业务域名、接口合法域名、公众号网页授权域名;本实现进一步要求授权回调与活动服务同源且使用 HTTPS。 交互边界:真实头像昵称以微信授权结果为准。遇到“访问完整网页”或虚拟快照身份,需让用户主动点击继续授权;不能通过自动跳转绕过微信同意要求。保留原生填写与手动返回入口,明确资料用途,并考虑头像更新与授权撤回处理。 排错顺序:UnionID 缺失先查开放平台绑定及小程序登录响应;域名错误分别查业务域名与授权域名;授权成功仍停网页先查 JSSDK 加载顺序、getEnv 和上一页;返回资料为空查 onShow、票据过期、重复消费及原令牌变化。微信 API 代理不能代替平台绑定或授权。 实施与验收:服务端票据与状态使用 Redis 原子操作。小程序业务页、web-view 页、PHP 回调和网页脚本需配套发布。在微信真机覆盖成功、取消、过期、身份不一致及自动返回失败。本方案仅补充既有会话的业务资料,不承担账号合并,也不自动改变活动参与规则。 官方参考(核对日期:2026-10-09): 微信网页授权:https://developers.weixin.qq.com/doc/service/guide/h5/auth.html web-view:https://developers.weixin.qq.com/miniprogram/dev/component/web-view.html UnionID:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/union-id.html
一、方案目标 让用户在小程序内打开公众号授权网页,完成头像昵称授权后自动回到原业务页,再由小程序从服务端领取资料。它适用于活动签到、互动报名等场景。 小程序登录、用户资料授权和页面返回是三个环节。“自动返回”发生在授权完成之后,仍需遵守微信的用户同意要求,不能保证所有场景都静默取得真实资料。 二、先核对两端身份 公众号与小程序的 OpenID 属于不同应用,不能直接比较。本方案要求账号关联同一微信开放平台,并由服务端核对两端实际返回的 UnionID。 UnionID 缺失或不一致时停止桥接,显示小程序原生头像选择与昵称填写入口。同属一家公司不等于已完成开放平台绑定。 三、服务端创建短期票据 小程序携带原登录令牌调用 bridge/create。服务端验证小程序会话、活动和 UnionID,生成 24 字节随机数,转为 48 位十六进制 ticket,有效期 300 秒。 Redis 将用户 ID、活动标识、原令牌摘要、UnionID 摘要及到期时间与票据关联。网页地址只带 ticket,不带登录令牌、AppSecret 或完整用户资料。 进入 bridge/entry 时,服务端原子地将 issued 改为 authorizing,并创建 OAuth state 和浏览器随机绑定值。绑定值通过 Secure、HttpOnly Cookie 保存,state 留在服务端;票据地址不得转发,日志须隐藏敏感参数。 四、公众号回调取得并核验资料 服务端发起 snsapi_userinfo 授权。用户同意后,bridge/callback 先消费 state,核对 Cookie 与有效期,再用 code 换取网页授权 access_token,调用用户信息接口取得 nickname、headimgurl 和 UnionID。 网页授权 access_token 与公众号基础接口凭证不同,相关请求及 AppSecret 均留在服务端。若使用微信 API 代理,应复用统一封装和错误处理。 本实现拒绝 is_snapshotuser=1 的快照虚拟身份。仅当两端 UnionID 一致、原登录有效、头像昵称非空且活动有效,才能将票据置为 ready;失败进入 failed。 回调只保存待领取资料,不创建新的网页登录会话,也不替换小程序令牌。 五、授权完成后自动返回 成功页先加载微信 JSSDK,再执行以下脚本;服务端通过 data-authorized="1" 标记成功。web-view 应由 navigateTo 打开,保证上一页是业务页。 let returning = false; function returnToMiniapp() { const mp = window.wx?.miniProgram; if (!mp || returning) return; mp.getEnv(env => { if (!env.miniprogram || returning) return; returning = true; mp.navigateBack({ delta: 1, fail: () => { returning = false; } }); }); } document.getElementById('return-miniapp') ?.addEventListener('click', returnToMiniapp); if (document.body.dataset.authorized === '1') { returnToMiniapp(); } getEnv 确认小程序环境后才返回。返回锁避免按钮与自动导航重复执行;导航失败释放锁,允许手动重试。失败结果页保留原因和返回按钮,不自动离开。 六、回到小程序后领取结果 UniApp 业务页在 onShow 中先执行 completeBridge,再刷新业务状态。bridge/result 使用原登录令牌和 ticket 核对用户、令牌摘要与到期时间。 ready 或 failed 结果通过 Redis 原子操作单次消费;未完成只返回 ready=false。成功资料保存到原会话的业务资料缓存,再交给正常签到或报名接口使用。 页面返回不代表签到成功,业务状态仍以服务端结果为准。不要依赖 web-view postMessage 实时传递可信资料,以服务端回调和结果接口为准。 本方案的票据时长、状态机和会话绑定属于项目设计,微信能力与配置要求见下方官方参考。