核心流程
- 获取登录授权码:请求
https://login.weixin.qq.com/jslogin,解析返回的 window.QRLogin.uuid。
- 生成二维码图片:
https://login.weixin.qq.com/qrcode/{uuid}?t=webwx。
- 轮询验证扫码状态:请求
https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?uuid={uuid}&tip=1,解析 window.code:
- 408:等待扫码
- 201:已扫码未确认
- 200:确认登录,携带
ticket
- 凭票换取登录 Cookie:访问
https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket=...,响应头中提取 `Set-Cookie`。
- 获取用户信息:携带 Cookie 请求
https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxinit,解析 JSON 得到用户昵称、头像等。
SDK 关键类结构
class Wechatauth {
private $cookie; // 登录后的 Cookie 字符串
private $_logincode; // uuid
private $_cookiename; // 本地 Cookie 缓存文件路径
private $_cookieexpired = 3600;
public function __construct($options) { /* 初始化账号、路径、调试回调 */ }
public function get_login_code() { /* 步骤1 */ }
public function get_code_image($code='') { /* 步骤2 */ }
public function verify_code() { /* 步骤3,返回 200/201/408/400 */ }
public function get_login_cookie($is_array=false) { /* 步骤4 */ }
public function get_login_info() { /* 步骤5 */ }
public function get_avatar($url) { /* 下载头像 */ }
public function logout() { /* 登出并清理 Cookie */ }
}
前端集成示例
<img id="qrcode" src="" width="200" height="200">
<script>
let auth = new Wechatauth({account: 'my_account'});
// 1. 获取 uuid 并显示二维码
fetch('api.php?act=get_uuid').then(r=>r.json()).then(d=>{
document.getElementById('qrcode').src = d.qrcode_url;
startPolling();
});
function startPolling() {
fetch('api.php?act=verify').then(r=>r.json()).then(d=>{
if (d.status === 200) {
// 登录成功,跳转或获取用户信息
location.href = 'dashboard.php';
} else if (d.status === 201) {
setTimeout(startPolling, 1000); // 继续轮询
} else if (d.status === 408) {
setTimeout(startPolling, 2000);
} else {
alert('二维码失效,请刷新');
}
});
}
</script>
依赖与部署
- 需 Snoopy 类(纯 PHP HTTP 客户端)或替换为 cURL/Guzzle。
- Cookie 缓存目录需可写权限。
- 生产环境建议用 Redis 存储 Cookie,多实例共享。
- 微信网页版登录接口**非官方文档**,可能随时失效,重要业务请申请**微信开放平台**官方扫码登录(OAuth2.0)。