微信小程序受權登陸

公司業務開展,最近完成了一個微信小程序的開發。場景是這樣:同一微信開放平臺下擁有相同主體的APP和微信小程序來完成一樣的業務,用戶進入app或者微信小程序時必須獲取用戶的unionid來確認當前的用戶身份,完成登陸。小程序「獲取用戶信息」api(getUserInfo)的調用方式和以前相比有了較大更新,優雅的實現用戶受權和登陸很是重要,如下是我在微信小程序受權登陸相關流程在開發時候的實現思路和總結,分享以下。html

1、微信小程序登陸流程時序

登陸流程時序

說明:ajax

  1. 小程序調用wx.login() 獲取 臨時登陸憑證code ,並回傳到開發者服務器
  2. 開發者服務器以code換取 用戶惟一標識openid 和 會話密鑰session_key。
  3. 臨時登陸憑證code只能使用一次

什麼是openid?

在關注者與公衆號產生消息交互後,公衆號可得到關注者的OpenID(加密後的微信號,每一個用戶對每一個公衆號的OpenID是惟一的。對於不一樣公衆號,同一用戶的openid不一樣)。—— 微信公衆平臺開發者文檔
  • 普通用戶的標識,對當前公衆號惟一
  • 不一樣的公衆號,同一個用戶,openid不一樣

你能夠簡單的理解爲小程序

openid = hash(uid + app_id)

什麼是unionid?

若是開發者擁有多個移動應用、網站應用、和公衆賬號(包括小程序),可經過unionid來區分用戶的惟一性,由於只要是同一個微信開放平臺賬號下的移動應用、網站應用和公衆賬號(包括小程序),用戶的unionid是惟一的。換句話說,同一用戶,對同一個微信開放平臺下的不一樣應用,unionid是相同的。 UnionID機制說明

若是開發者在多個移動應用、網站應用和公衆賬號之間有統一用戶帳號的需求,須要前往微信開放平臺(open.weixin.qq.com)綁定公衆號後,即可利用UnionID機制來知足上述需求。後端

  • 一個微信開放平臺賬號下能夠有多個移動應用,網站應用,公衆帳號和小程序
  • 只要是同一個微信開放平臺賬號下的移動應用、網站應用和公衆賬號(包括小程序),用戶的unionid是惟一的。

用戶在開放平臺的惟一標識符微信小程序

你能夠簡單的理解爲:api

unionid = hash(uid + 開放平臺id)

總結下
微信針對不一樣的用戶在不一樣的應用下都有惟一的一個openId, 可是要想肯定用戶是否是同一個用戶,就須要靠unionid來區分。通常本身的後臺都會有本身的一個用戶表,每一個用戶有不一樣的userid。也就是說同一個用戶在同一個微信開放平臺下的相同主體的應用對應着相同的userid,unionid以及不一樣的openid。因此在用戶登陸進來的時候,咱們只能靠微信返回給咱們的unionid去判斷是否是同一個用戶,在去關聯咱們的用戶表,拿到對應的userid。服務器

2、微信小程序如何獲取unionid?

綁定了開發者賬號的小程序,能夠經過下面3種途徑獲取UnionID。微信

  1. 調用接口wx.getUserInfo,從解密數據中獲取UnionID。注意本接口須要用戶受權,請開發者妥善處理用戶拒絕受權後的狀況。
  2. 若是開發者賬號下存在同主體的公衆號,而且該用戶已經關注了該公衆號。開發者能夠直接經過wx.login獲取到該用戶UnionID,無須用戶再次受權。
  3. 若是開發者賬號下存在同主體的公衆號或移動應用,而且該用戶已經受權登陸過該公衆號或移動應用。開發者也能夠直接經過wx.login獲取到該用戶UnionID,無須用戶再次受權。

當用戶知足條件2和3時,開發者能夠直接經過wx.login獲取到該用戶的unionid, 不然必須調用接口wx.getUserInfo,額外須要注意的事就是妥善處理用戶拒絕受權的狀況。session

3、登陸最佳實踐

  1. 調用 wx.login 獲取 code。
  2. 使用 wx.getSetting 獲取用戶的受權狀況app

    • 若是用戶已經受權,直接調用 API wx.getUserInfo 獲取用戶最新的信息;
    • 用戶未受權,在界面中顯示一個按鈕提示用戶登入,當用戶點擊並受權後就獲取到用戶的最新信息。
  3. 將獲取到的用戶數據連同wx.login返回的code一同傳給後端

封裝ajax()

在真實的業務場景中,咱們但願,用戶進入小程序時,未登陸狀況下能夠正常瀏覽商品,對小程序有個基本的認知,不要直接彈出框要求用戶受權,不然會干擾用戶,致使新用戶的流失,當用戶須要使用一些高級功能和場景,這個時候再去要求用戶受權,這樣用戶受權的概率會大大提升。
將登陸的邏輯封裝ajax
流程:

封裝的意義
再也不關注當前接口是否須要登陸,用戶是否已受權,全部請求直接調用ajax(),在必要的時候完成一切登陸以及受權流程。小程序入口頁面增長,業務拓展的時候,你只須要專一於業務實現。

參考資料

相關文章
相關標籤/搜索