微信掃碼登錄已成主流網站標配。本文深度解析基於 Snoopy 類庫的 Wechatauth 非官方 SDK,涵蓋從獲取授權碼、生成二維碼、輪詢驗證到獲取用戶資料的完整流程,助你快速集成「掃碼即登錄」功能。
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,根據返回 window.code 判斷:408 等待掃描、201 已掃描未確認、200 確認登錄成功。ticket 訪問 webwxnewloginpage 獲取登錄 Cookie,再調用 webwxinit 拉取用戶資料(昵稱、頭像等)。class Wechatauth {
private $cookie; // 登錄態 Cookie
private $_logincode; // 授權碼 uuid
private $_account; // 賬號標識,用於 Cookie 文件隔離
private $_datapath; // Cookie 持久化路徑
// 核心公共方法
public function get_login_code() { /* 步驟 1 */ }
public function get_code_image($code = '') { /* 步驟 2 */ }
public function verify_code() { /* 步驟 3:返回 200/201/408 等狀態碼 */ }
public function get_login_cookie($is_array = false) { /* 步驟 4 */ }
public function get_login_info() { /* 獲取用戶詳細信息 */ }
public function get_avatar($url) { /* 下載頭像二進制數據 */ }
public function logout() { /* 登出並清理 Cookie */ }
}
snoopy.class.php,模擬瀏覽器 HTTP 請求(含 Referer、Cookie 處理)。$_SESSION['login_step'] 記錄掃碼階段,確保 PHP 配置了正常的 Session 存儲。./data/cookie_{account} 文件,生產環境建議改用 Redis/Memcached 提升並發性能。['debug' => true, 'logcallback' => 'my_log_func'] 可輸出詳細請求/響應日誌,排查掃碼卡頓、二維碼過期等問題。| 現象 | 原因 | 解決 |
|---|---|---|
| 二維碼長時間不刷新 | uuid 失效或網絡阻斷 | 前端定時重新調用 get_login_code() 刷新二維碼 |
| verify_code() 永遠返回 408 | 手機未掃描或微信版本過低 | 引導用戶升級微信、檢查網絡;前端增加超時倒計時 |
| 獲取用戶信息為空 | Cookie 域/路徑不匹配 | 檢查 logout() 中 Domain 設置,確保後續請求攜帶完整 Cookie |
此 SDK 為非官方實現,依賴微信網頁版協議,微信官方隨時可能變更接口導致失效。生產環境建議:
掌握上述原理與代碼結構,你即可在任意 PHP 項目中快速接入微信掃碼登錄,提升用戶體驗與轉化率。