[转]微信小程序登录逻辑梳理
本文轉自:http://www.jianshu.com/p/d9996cafdb31
官方文檔
文檔相關地址:
用戶登錄 獲取用戶數據 用戶數據的簽名驗證和加解密
登錄時序圖.png微信兩個api所拿到的信息:login和getUserInfo
返回的信息.png注冊/登錄
小程序端:
通過上面wx.login和wx.getUserInfo兩個api拿到相應的信息,并通過上方接口傳給自己的服務器. 需要傳輸的信息有7個參數:
appid 小程序唯一標識 secret 小程序的 app secret js_code //wx.login登錄時獲取的 code,用于后續獲取session_key //下面兩個參數用戶服務器端簽名校驗用戶信息的 signature 使用 sha1( rawData + sessionkey ) 得到字符串,用于校驗用戶信息。 rawData 不包括敏感信息的原始數據字符串,用于計算簽名。 //下面兩個參數是用于解密獲取openId和UnionId的 encryptedData 包括敏感數據在內的完整用戶信息的加密數據 iv 加密算法的初始向量當然,可以精簡為以下三個參數. 其余的簽名校驗的參數可省略,而appid和secret可以直接寫在服務器.
js_code // wx.login登錄時獲取的 code,用于后續獲取session_key encryptedData 包括敏感數據在內的完整用戶信息的加密數據 iv 加密算法的初始向量服務端處理邏輯
相關的信息傳輸給服務器后,服務器
1.先根據js_code去微信服務器拿到session_key 2.(此步可省略)使用 sha1( rawData + sessionkey )拿到字符串,判斷與signature值是否相同,如果相同則用戶信息無誤,可進行下一步.如果不同,則說明用戶信息被篡改或過期. 3.然后根據解密算法自行解密(輸入參數為appId,sessionKey,encryptedData,iv,返回一個jsonObj),拿到openId和unionId等信息,執行服務器端的注冊/登錄操作. 4.注冊/登錄操作邏輯完成后,將我們服務器的sessionId(或其他token),以及用戶信息返回給客戶端.
其中,服務器去獲取session_key的請求為:
(小寫為固定寫好的,大寫為待替換的) https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
返回:
//正常返回的JSON數據包{"openid": "OPENID","session_key": "SESSIONKEY" "expires_in": 2592000 } //錯誤時返回JSON數據包(示例為Code無效) { "errcode": 40029, "errmsg": "invalid code" }相關解密算法:
https://mp.weixin.qq.com/debug/wxadoc/dev/api/signature.html
注意:示例代碼中有node,c++,php,python的,沒有java的.
需要服務器返回的信息:
sessionId/token 登錄狀態標識 userInfo: jsonObject,用戶在我們平臺上的信息,其內容與getPersonalInfo接口返回的相同.最后,將登錄操作封裝成方法,需要處調用即可
//最終供外面調用的方法 function login(){ console.log('logining..........'); //調用登錄接口 wx.login({ success: function (e) { console.log('wxlogin successd........'); var code = e.code; wx.getUserInfo({ success: function (res) { console.log('wxgetUserInfo successd........'); var encryptedData = encodeURIComponent(res.encryptedData); thirdLogin(code,encryptedData,res.iv);//調用服務器api } }) } }); } function thirdLogin(code,encryptedData,iv){ var url = "eeee/xxx/login/ttttt"; var params = new Object(); params.code = code; params.encryptedData = encryptedData; params.iv =iv; buildRequest(new Object(),url,params,{ onPre: function(page){}, onSuccess:function (data){ console.log('my login successd........'); console.log(data); getApp().globalData.session_id = data.session_id; getApp().globalData.uid = data.uid; getApp().globalData.isLogin = true; }, onError : function(msgCanShow,code,hiddenMsg){ } }).send(); }????????
微信小程序?
轉載于:https://www.cnblogs.com/freeliver54/p/6529564.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的[转]微信小程序登录逻辑梳理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 结构体内存对齐规则
- 下一篇: 数字电路与模拟电路区别