微信H5登录是很多移动端网页应用的常用登录方式,对接过程中开发者经常会接触到openid和unionid两个用户标识,不少人对两者的关系和作用存在疑惑。下面我们就详细拆解这两个标识的相关内容。

openid和unionid的基础定义
openid是微信用户针对单个公众号、小程序、移动应用等独立应用生成的唯一标识,同一个微信用户在不同的应用下openid完全不同。比如用户A关注了公众号甲和公众号乙,他在两个公众号下的openid是不一样的。
unionid是微信用户针对同一个开放平台账号下所有关联应用生成的统一标识,只要用户将这些应用绑定到同一个微信开放平台账号,那么该用户在所有关联应用下的unionid都是相同的。
两者的核心关系
openid和unionid的关系可以从两个维度理解:
- 从唯一性范围来看,openid的唯一性仅局限于单个应用,而unionid的唯一性覆盖同一个开放平台下的所有关联应用。
- 从生成条件来看,用户只要授权了某个应用,就会生成对应的openid;而只有当用户将多个应用绑定到同一个开放平台账号,且用户在这些应用中都授权过,才会生成统一的unionid,如果应用没有绑定到开放平台,即使有多个应用,也不会有unionid。
openid的作用
openid主要用于单个应用内的用户身份识别,常见作用如下:
- 作为单个应用内的用户唯一主键,关联该用户在该应用下的所有行为数据,比如订单记录、收藏内容、个人设置等。
- 用于应用内的登录态维持,用户授权登录后,应用可以存储用户的openid,后续请求中通过openid识别用户身份,不需要用户重复授权。
- 用于和微信侧的用户数据做对应,比如调用微信的用户信息接口时,需要传入openid获取对应用户的头像、昵称等信息。
unionid的作用
unionid主要用于跨应用的用户身份统一,常见作用如下:
- 实现多应用间的用户数据打通,比如企业有公众号、小程序、H5网页三个应用,都绑定到同一个开放平台,那么可以通过unionid识别同一个用户在不同应用下的身份,将他的订单、积分等数据同步。
- 避免用户在不同关联应用中重复注册,比如用户已经在小程序注册过,当他访问同主体的H5网页时,可以通过unionid识别他已经注册过,直接登录不需要重新填写信息。
- 用于统一的用户运营,企业可以通过unionid统计同一个用户在不同渠道的行为,做更精准的用户画像和运营策略。
实际开发中的获取示例
在微信H5登录中,获取openid和unionid的流程需要先拿到授权code,再调用接口换取用户信息,以下是Node.js的示例代码:
const axios = require('axios');
// 第一步:通过授权code获取access_token和openid
async function getOpenidAndUnionid(code) {
// 公众号的appid和appsecret,实际开发中从配置中读取
const appid = 'your_appid';
const secret = 'your_secret';
// 调用微信接口换取access_token和openid
const tokenUrl = `https://api.weixin.qq.com/sns/oauth2/access_token?appid=${appid}&secret=${secret}&code=${code}&grant_type=authorization_code`;
const tokenRes = await axios.get(tokenUrl);
const { access_token, openid } = tokenRes.data;
// 第二步:通过access_token和openid获取用户信息,包含unionid(如果应用绑定了开放平台)
const userInfoUrl = `https://api.weixin.qq.com/sns/userinfo?access_token=${access_token}&openid=${openid}&lang=zh_CN`;
const userInfoRes = await axios.get(userInfoUrl);
const { unionid } = userInfoRes.data;
return {
openid,
unionid: unionid || null // 未绑定开放平台时unionid为undefined
};
}
// 调用示例,code是前端授权后回调带来的参数
// getOpenidAndUnionid('front_end_code').then(res => console.log(res));开发注意事项
- 如果只需要单个H5应用的用户登录,只需要使用openid即可,不需要关注unionid。
- 如果有多个应用需要打通用户数据,一定要将所有应用绑定到同一个微信开放平台账号,否则无法获取统一的unionid。
- 不要将openid和unionid泄露到前端页面,避免用户标识被恶意利用,存储时建议做加密处理。
- 微信官方的接口规则可能会有调整,开发时建议参考最新的微信开放平台文档,确保接口调用符合要求。