微信H5登录是很多移动端网页应用的常见功能,核心是通过微信提供的授权能力获取用户身份标识,其中openid和unionid是最关键的两个参数。下面我们先通过一张示意图了解整体流程,再逐步拆解细节。

一、openid与unionid的核心概念
首先要明确两个标识的定义,避免混淆使用场景:
- openid:是微信用户针对某个特定公众号、小程序、移动应用等唯一的应用标识。同一个微信用户,在不同的微信应用下对应的openid是不同的。
- unionid:是微信用户针对同一个微信开放平台账号下所有应用的统一标识。只要多个应用都绑定到同一个微信开放平台,同一个用户在这些应用下的unionid是一致的。
简单来说,如果你只有一个独立的H5应用,只需要openid就能完成用户身份识别;如果你的业务有多个关联应用,需要打通用户账号体系,就必须使用unionid。
二、微信H5登录的前置准备
在开发登录功能前,需要完成以下配置:
- 注册微信开放平台账号,创建网站应用,获取到
AppID和AppSecret。 - 在网站应用配置中填写授权回调域名,注意不要带http/https前缀,只填主域名即可。
- 如果需要获取unionid,需要把网站应用和同主体的公众号、小程序等绑定到同一个开放平台账号下。
三、完整登录流程步骤
1. 引导用户发起授权
前端页面需要跳转到微信的授权地址,让用户确认授权,授权地址格式如下:
// 微信H5授权跳转地址
const appId = '你的网站应用AppID';
const redirectUri = encodeURIComponent('你的回调地址'); // 回调地址需要在配置的域名下
const scope = 'snsapi_userinfo'; // snsapi_base只能拿到openid,snsapi_userinfo可以拿到用户基本信息
const state = '自定义状态参数,可用来防CSRF';
const authUrl = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appId}&redirect_uri=${redirectUri}&response_type=code&scope=${scope}&state=${state}#wechat_redirect`;
// 跳转到授权地址
window.location.href = authUrl;2. 后端接收回调code
用户授权后,微信会跳转到你配置的回调地址,并带上code和state参数,后端需要接收这个code,然后调用微信接口换取access_token和openid。
<?php
// 后端接收code并换access_token的示例
$code = $_GET['code'] ?? '';
$appId = '你的网站应用AppID';
$appSecret = '你的网站应用AppSecret';
// 调用微信接口获取access_token
$url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid={$appId}&secret={$appSecret}&code={$code}&grant_type=authorization_code";
$result = file_get_contents($url);
$data = json_decode($result, true);
// 判断是否请求成功
if (isset($data['errcode'])) {
// 处理错误逻辑
echo '授权失败:' . $data['errmsg'];
exit;
}
$accessToken = $data['access_token'];
$openid = $data['openid'];
$unionid = $data['unionid'] ?? ''; // 满足条件时才会返回unionid
?>3. 获取用户详细信息(可选)
如果授权的scope是snsapi_userinfo,可以用获取到的access_token和openid调用接口拿到用户的昵称、头像等信息:
<?php
// 获取用户基本信息的接口调用
$infoUrl = "https://api.weixin.qq.com/sns/userinfo?access_token={$accessToken}&openid={$openid}&lang=zh_CN";
$infoResult = file_get_contents($infoUrl);
$userInfo = json_decode($infoResult, true);
// 拿到用户信息后可以存储到自己的业务库中,关联openid或unionid
?>四、常见问题说明
| 问题场景 | 解决方案 |
|---|---|
| 为什么拿不到unionid | 检查网站应用是否绑定到开放平台,且同开放平台下是否有其他已审核的关联应用,只有满足条件才会返回unionid |
| code有效期是多久 | code有效期为5分钟,且只能使用一次,使用后需要重新获取 |
| access_token和微信公众平台的access_token是同一个吗 | 不是,这里的access_token是用户授权层面的接口调用凭证,和公众平台的基础access_token完全独立 |
整个微信H5登录机制的核心就是通过授权拿到用户唯一标识,根据业务需求选择openid或unionid作为用户身份关联的依据,只要按照流程配置和调用接口,就能稳定实现登录功能。