微信生态账号体系OpenID、UnionID、access_token关联详解

什么是OpenID,UnionID,access_token?

OpenID是用户在小程序中的唯一标识。

UnionID是用户在微信开放平台上的唯一标识,包括小程序、公众号等,同一个用户的UnionID都是一样的。

access_token是后端调用微信接口用的。

image

 

 

一、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 流程产出)

image

✅ 只能用它的接口

  1. 拉取用户授权信息(scope=snsapi_userinfo)
    GET /sns/userinfo?access_token=...&openid=...
  2. 刷新/续期 token
    GET /sns/oauth2/refresh_token
  3. 校验 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

image

   wxLogin.html

image

 

    示例2:    

  公众号发券的典型链路

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

  必须走网页授权的场景(必须拿到 openid)

image

  

  2、基础 access_token

image

✅ 必须用它的常见接口(节选)

  • 用户管理
    • 获取任意关注用户资料
      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

四、微信账号体系结构总结

image

 

五、实际应用建议

  • 如果只有单个应用,只需使用 OpenID 即可。
  • 如果有多个应用(如公众号+小程序),建议绑定到同一微信开放平台账号,使用 UnionID 实现用户统一识别。
  • 所有接口调用都需要 access_token,需妥善管理其生命周期。
posted @ 2025-09-05 17:10  当下是吾  阅读(735)  评论(0)    收藏  举报