微信生态账号体系OpenID、UnionID、access_token关联详解
什么是OpenID,UnionID,access_token?
OpenID是用户在小程序中的唯一标识。
UnionID是用户在微信开放平台上的唯一标识,包括小程序、公众号等,同一个用户的UnionID都是一样的。
access_token是后端调用微信接口用的。

一、OpenID:用户在单个应用中的唯一标识
-
定义:OpenID 是微信用户在某个具体应用(如某个公众号或小程序)中的唯一身份标识。
-
特点:
-
同一个用户在不同应用中有不同的 OpenID。
-
是开发者识别用户的基础。
-
-
用途:用于获取用户基本信息、发送模板消息等。
举例:用户A在公众号X和小程序Y中分别有不同的 OpenID。
二、UnionID:用户在同一主体下多个应用中的统一标识
-
定义:UnionID 是微信用户在同一微信开放平台账号下的多个应用(如多个小程序、公众号、App)中的统一身份标识。
-
特点:
-
同一用户在同一开放平台下的所有应用中 UnionID 相同。
-
可用于跨应用识别用户,实现统一登录、数据互通。
-
-
前提条件:开发者需将多个应用绑定到同一个微信开放平台账号。
举例:用户A在公司C的公众号和小程序中 OpenID 不同,但 UnionID 相同。
三、access_token:调用微信接口的凭证
-
定义:access_token 是开发者调用微信开放平台或公众平台接口的访问令牌。
-
特点:
-
有效期通常为 2 小时,过期需重新获取。
-
不同接口可能使用不同类型的 access_token(如网页授权 access_token 和基础 access_token)。
-
-
用途:用于获取用户信息、调用支付接口、发送消息等。
网页授权 access_token 和基础 access_token说明:
1、网页授权 access_token(OAuth2.0 流程产出)

✅ 只能用它的接口
-
拉取用户授权信息(scope=snsapi_userinfo)
GET /sns/userinfo?access_token=...&openid=... -
刷新/续期 token
GET /sns/oauth2/refresh_token -
校验 token 是否有效
GET /sns/auth?access_token=...&openid=...
除以上 3 个接口外,任何其它能力都不接受网页授权 token;把它传给普通接口会直接报 40001 或 42001
只要“需要拿到当前浏览者的 openid(或 unionid)”——也就是业务动作必须跟“这个人”强绑定——就绕不开网页授权;发券、签到、抽奖、积分兑换、支付等带用户身份的场景全部要走网页授权。
p.s
1、通过网页授权code换取拿到的openid是用户在公众号(绑定了诸多小程序,在哪个小程序跳转去网页授权,就会获取到公众号-当前小程序)处的openid,公众号有绑定服务商号,发券可以发到该有关联服务商的用户openid上。
2、通过小程序内的code换取到的openid则是属于当前小程序的,若未关联服务商号,则无法用来发券。
示例1:
c端静默登录》跳网页授权跳转地址》无感可换到当前用户的 openid 和网页授权专用 access_token。
https://open.weixin.qq.com/connect/oauth2/authorize ?appid=APPID &redirect_uri=ENCODE_URI &response_type=code &scope=snsapi_base // 这里只写死 snsapi_base &state=任意自定义参数
具体方案实施:
c端首次一进到小程序页面,首次无token, 先跳小程序授权页面(自己定义的小程序页面,我这边是openid.vue), 由它再跳 wxCode.html -> wxLogin.html -> 最后回跳到小程序授权页面,完成code换取openid、access_token操作 -> 自动返回用户首次进的页面,该页面接口重新请求, 完成静默登录流程。
wxCode.html

wxLogin.html

示例2:
公众号发券的典型链路
-
运营在后台创建批次(coupon_id)
-
用户收到推文/菜单/二维码,点击进入 H5
-
H5 用网页授权拿到 openid → 后台校验是否发过 → 调微信“发放代金券”接口
-
微信把券打到用户微信卡包
其中第 3 步就是网页授权的唯一目的:让后台知道这个“浏览者”到底是谁。
必须走网页授权的场景(必须拿到 openid)

2、基础 access_token

✅ 必须用它的常见接口(节选)
-
用户管理
-
获取任意关注用户资料
GET /cgi-bin/user/info?access_token=...&openid=... -
批量获取用户列表
POST /cgi-bin/user/info/batchget
-
-
账号相关
-
生成带参二维码
POST /cgi-bin/qrcode/create -
长链接转短链接
POST /cgi-bin/shorturl
-
-
消息与菜单
-
发送模板消息 / 订阅消息
POST /cgi-bin/message/template/send -
创建 / 查询 / 删除自定义菜单
POST /cgi-bin/menu/create
-
-
素材与草稿
-
上传图文、图片、视频等永久素材
POST /cgi-bin/material/add_material
-
-
网页调用 JS-SDK
-
获取 jsapi_ticket(先拿基础 token → 再拿 ticket)
GET /cgi-bin/ticket/getticket?type=jsapi
-
这些接口一旦误用网页授权 token,会返回errcode=40001 invalid credential
一句话速记
-
网页授权链路 →
/sns/...开头接口 → 用网页授权 access_token -
其它所有能力 →
/cgi-bin/...开头接口 → 用基础 access_token
四、微信账号体系结构总结

五、实际应用建议
-
如果只有单个应用,只需使用 OpenID 即可。
-
如果有多个应用(如公众号+小程序),建议绑定到同一微信开放平台账号,使用 UnionID 实现用户统一识别。
-
所有接口调用都需要 access_token,需妥善管理其生命周期。

浙公网安备 33010602011771号