10 分钟接完:最小可用链路
目标:在你的站点里做出「微信内一键登录」。全程只需要 3 个东西:站点短码、接入密钥、4 行代码。
第 0 步:确认前置条件
| 条件 | 怎么确认 |
|---|---|
| 你的站点是 https,且域名已备案 | 浏览器直接打开 https://你的域名/ 不报证书错误 |
| 中台已登记你的站点 | 请中台管理员在「接入站点」里加一条,或自己加(入口) |
| 中台入口域名已配成网页授权域名 | mp 后台 → 功能设置 → 网页授权域名 = wx.onzx.cn |
| 本机出口 IP 在开发者平台白名单里 | 微信账号页顶部会显示出口 IP |
第 1 步:把登录按钮指到中台
<a href="https://wx.onzx.cn/oauth/entry?site=你的短码&scope=snsapi_userinfo&return=/me">
微信授权登录
</a>
三个参数:
site:站点短码(后台注册时定的,创建后不可改)。scope:snsapi_base静默授权只拿 openid(无感);snsapi_userinfo会弹确认页,能拿到昵称头像。return:授权完跳回哪儿。推荐写相对路径(如/me),中台会拼到你登记的站点主页域名上; 写绝对地址则必须命中你配置的「允许回跳域名」,否则报return_not_allowed。
第 2 步:站点接收票据并兑换身份
跳回时 URL 形如:/me?hub_ticket=xxxx&hub_site=你的短码&hub_scope=snsapi_base。
<?php
// 站点侧:只用一次,兑换完立刻建自己的会话
require 'hub-client.php'; // 从 https://wx.onzx.cn/docs/download 下载
$hub = new HubClient('你的短码', getenv('WXHUB_SECRET'));
if (isset($_GET['hub_ticket'])) {
$id = $hub->exchange($_GET['hub_ticket']); // 失败会抛 HubException,带 code
// $id = ['openid'=>…, 'unionid'=>…, 'nickname'=>…, 'is_followed'=>true, …]
$user = find_or_create_user($id['unionid'] ?: $id['openid'], $id);
$_SESSION['uid'] = $user['id'];
header('Location: /me'); // 把 ticket 从地址栏清掉
exit;
}
不要用 GET 参数里的 openid 建会话。票据是一次性、60 秒、绑定站点的,
偷到别人的 ticket 也换不到身份(需要你的接入密钥签名)。这是这套链路的核心防线。
第 3 步:验证链路
- 命令行先验签名:把 诊断台 里生成的 curl 拷到服务器上跑,返回
ok:true说明密钥与时钟都对。 - 微信里打开你站点的页面,点授权按钮,走完回到
/me并且站点日志里有一条 exchange 成功。 - 在后台「接口日志」按
in方向筛选你的站点,能看到这两次调用。
接下来
本页内容随代码一起版本化(V0.1.0)。发现文档与实际行为不一致,请当缺陷报告。