現象
Android App 唤起微信授權頁面,用戶點擊「允許」後,App 收到 `code`,換取 `access_token` 成功,但拉取用戶信息 (`/sns/userinfo`) 失敗,或返回 `openid` 為空、數據解析異常。
核心排查方向 (按概率排序)
1. 作用域 `scope` 缺失或錯誤
- 授權請求 URL **必須包含** `scope=snsapi_userinfo` (區分大小寫)。
- 若只用 `snsapi_base` 僅能獲取 `openid`,無法獲取昵稱、頭像等詳細信息。
- 檢查 `WXEntryActivity` 或網頁授權跳轉 URL 構建代碼。
2. 服務器 IP 白名單未配置
- 微信開放平台 → 開發設置 → **IP 白名單** 必須添加**後端服務器出口公網 IP**。
- 本地測試時,需將開發機公網 IP 加入白名單,或使用內網穿透工具映射固定 IP。
3. `access_token` 過期 / 刷新邏輯缺陷
`access_token` 有效期 2 小時,`refresh_token` 30 天。
- 後端需緩存 `access_token`,過期前主動刷新 (`/sns/oauth2/refresh_token`)。
- 並發請求時加分布式鎖,防止重複刷新導致舊 token 失效。
4. 用戶信息接口調用參數錯誤
// 正確請求
GET https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
// 參數必須為 access_token + openid 組合,缺一不可
5. 數據解析與存儲異常
- JSON 解析異常:微信返回 `errcode` 非 0 時無 `nickname` 等字段,代碼需先判斷 `errcode`。
- 字符編碼:確保請求/響應均為 UTF-8,避免昵稱含 Emoji 導致入庫報錯 (MySQL 需 `utf8mb4`)。
調試利器
- **微信開放平台接口調試工具**:直接輸入參數在線調用,對比返回結果。
- **抓包 (Charles/Fiddler)**:查看 App→微信服務器、後端→微信服務器完整請求響應。
- **後端日誌**:記錄每步請求參數、響應體、耗時,定位具體失敗環節。
總結
**「授權成功但取信息失敗」 90% 是後端問題**:`scope` 缺失、IP 白名單、Token 管理、參數拼裝、解析容錯。逐項核對即可定位。