你這個需求是「小程序端與網頁端打通同一個微信用戶體系」,也就是用戶無論在網頁掃碼還是小程序使用,都能統一到一個唯一的賬號。實現思路是:用微信的 unionid 作為唯一標識,通過掃碼登錄建立關聯。下面給你拆解成具體步驟:
一、整體思路
- 小程序端:獲取用戶 openid、unionid 并在你后臺創建用戶。
- 網頁端(PC/H5):通過掃碼授權獲取 openid、unionid。
- 后臺系統:以 unionid 為唯一用戶主鍵,把小程序和網頁端的登錄綁定到同一個賬號。
- 掃碼場景:網頁端生成帶參數二維碼 → 小程序掃碼 → 小程序回調后臺 → 網頁端完成登錄。
二、實現步驟
1. 小程序端賬號初始化
- 用戶在小程序登錄時,調用: wx.login({ success: res => { // res.code 發給后臺 } })
- 后臺調用 code2session 接口換取 openid 和 unionid: https://api.weixin.qq.com/sns/jscode2session ?appid=APPID &secret=SECRET &js_code=CODE &grant_type=authorization_code
- 后臺以 unionid 作為用戶表的唯一 ID(沒有 unionid 時先用 openid 占位,后續補全)。
2. 網頁端掃碼登錄
- 在 PC/H5 網頁中嵌入微信官方掃碼登錄二維碼(適用微信開放平臺網站應用,或者用公眾號網頁授權)。
- 掃碼后,用戶授權 → 后臺拿到網頁端的 openid/unionid。
- 后臺用 unionid 去匹配小程序端用戶表,若存在則直接登錄同一賬號。
3. 小程序掃碼網頁二維碼的場景(常用)
- 網頁端生成一個「臨時登錄二維碼」,參數為 login_token(隨機字符串),寫到數據庫狀態為未登錄。 二維碼可用 微信小程序碼 或者 普通二維碼。
- 用戶打開小程序掃碼: 小程序獲取到 login_token,并攜帶自己的 openid/unionid 調用后臺接口:/api/scanLoginConfirm。 后臺標記 login_token 已綁定某用戶 ID。
- 網頁端輪詢或 WebSocket 查詢 login_token 狀態: 一旦被綁定 → 返回登錄成功 → 寫入用戶 session/cookie。 整個掃碼登錄流程完成。
4. 賬號唯一性保障
- 關鍵點在 unionid: 同一微信用戶在同一微信開放平臺下(小程序 + 公眾號 + 網頁應用),unionid 是相同的。 以 unionid 為主鍵,保證小程序端與網頁端是同一個用戶。
- 數據庫表設計: user ( id bigint pk, unionid varchar unique, openid_mp varchar, -- 公眾號 openid openid_mini varchar, -- 小程序 openid openid_web varchar, -- 網頁端 openid ... )
三、流程圖(簡化版)
網頁端 → 生成二維碼 (login_token)
↓
用戶用小程序掃碼 → 小程序帶用戶信息調用后臺綁定 login_token
↓
后臺 → 確認 login_token 與用戶ID綁定
↓
網頁端 → 檢測到 login_token 已綁定,完成登錄

