注冊登錄

微信小程序授權(quán)登錄41003錯誤

2018-09-26
導讀:最近遇到這么個坑,偶然請求己方服務器授權(quán)登錄失敗,百度上一堆復制黏貼的文章并不靠譜,最終在微信論壇上看到解決方案。 網(wǎng)上有些是說iv內(nèi)空格導致解密失敗,我出錯的情況下...

最近遇到這么個坑,偶然請求己方服務器授權(quán)登錄失敗,百度上一堆復制黏貼的文章并不靠譜,最終在微信論壇上看到解決規(guī)劃。 
網(wǎng)上有些是說iv內(nèi)空格導致解密失敗,我出錯的情況下并沒有出現(xiàn)空格,排除這種情況。 
有說是因為請求順序,但是按照微信官方文檔,似乎并不是最新的,至少我授權(quán)方式不完全跟文檔一樣。

我的授權(quán)方式 
通過添加一個按鈕并且設置 open-type="getUserInfo"

 

  1. <button class='wxBtn'
  2. open-type="getUserInfo"
  3. bindgetuserinfo="wechatAction">操作微信賬號登錄</button>

在按鈕點擊事件里,會返回一些授權(quán)登錄需要用到的字段如:iv、encryptedData、signature、rawData  這個時候再調(diào)用 wx.login() 去獲取code,整合以上數(shù)據(jù)向己方服務器發(fā)送請求獲取用戶唯一標識 token。  通過以上的方式是可以成功登錄,但是偶然會出現(xiàn)請求己方服務器授權(quán)登錄失敗,再一次就會成功。  原因在于請求順序,這里的請求順序是先請求 wx.getUserInfo(按鈕) 再請求 wx.login()。有時候獲取code后iv已經(jīng)失效,所以失敗。  解決規(guī)劃:在請求 wx.login() 后,調(diào)用一次 wx.getUserInfo(廢棄接口) ,更新iv等信息。注意:這里調(diào)用的廢棄接口只是不再彈出授權(quán)請求窗口,但還是能夠獲取到 iv 等信息,授權(quán)接口彈窗已將在點擊按鈕的時候彈出,并且授權(quán)了,所以沒毛病。  再總結(jié)一下,正確的順序:wx.getUserInfo(按鈕) -> wx.login() -> wx.getUserInfo(廢棄接口),整合以上操作獲取到的最近數(shù)據(jù) code、iv、encryptedData、signature、rawData 傳給己方服務器,授權(quán)登錄成功。

以下貼上我的業(yè)務代碼

 

  1. // 點擊微信登錄
  2. wechatAction: function(e) {
  3. // 用戶點擊授權(quán)
  4. // 先保存獲取到的微信用戶信息
  5. const { nickName, avatarUrl } = JSON.parse(e.detail.rawData)
  6. this.setData({
  7. nickName: nickName,
  8. avatarUrl: avatarUrl
  9. })
  10. // 獲取微信code
  11. this.reqWechatCode()
  12. },
  13.  
  14. // 微信登錄:獲取code
  15. reqWechatCode: function() {
  16. // 授權(quán)接口登錄接口
  17. let that = this
  18. // 從微信獲取code
  19. wx.showLoading({
  20. title: '獲取code',
  21. })
  22.  
  23. wx.login({
  24. success: function (res) {
  25. if (res.code) {
  26.  
  27. wx.getUserInfo({
  28. success: function (res) {
  29. // 保存微信登錄參數(shù)
  30. const { encryptedData, iv, signature, rawData } = res
  31. that.setData({
  32. encryptedData: encryptedData,
  33. iv: iv,
  34. signature: signature,
  35. rawData: rawData
  36. })
  37. that.wxLoginReq(res.code)
  38. }
  39. })
  40.  
  41. } else {
  42.  
  43. wx.showToast({
  44. title: '獲取code失敗,請重試',
  45. icon: 'none'
  46. })
  47. }
  48. wx.hideLoading()
  49. }
  50. })
  51. },
  52.  
  53. // 根據(jù)獲取到的code 向服務器發(fā)送登錄請求 獲取token
  54. wxLoginReq: function (code) {
  55. let that = this
  56.  
  57. wx.showLoading({
  58. title: '獲取token中',
  59. })
  60.  
  61. // 拿到code 再加上 encryptedData, iv, rawData, signature 等參數(shù),請求token
  62. let encryptedData = that.data.encryptedData
  63. let iv = that.data.iv
  64. let signature = that.data.signature
  65. let rawData = that.data.rawData
  66. var req = require('../../util/Request.js')
  67.  
  68. // 請求成功
  69. let success = function(res) {
  70. // console.log(res)
  71. wx.hideLoading()
  72. // 緩存token
  73. const { token, user_id } = res.data.data
  74. let userInfo = {
  75. token: token,
  76. user_id: user_id,
  77. nickName: that.data.nickName,
  78. avatarUrl: that.data.avatarUrl
  79. }
  80. getApp().setUserInfo(userInfo)
  81. // 同步用戶信息
  82. getApp().loginSuccess(function () {
  83. wx.navigateBack({})
  84. })
  85. }
  86.  
  87. // 請求失敗
  88. let fail = function(res) {
  89. wx.hideLoading()
  90. wx.showToast({
  91. title: '獲取token失敗,請重試',
  92. icon: 'none'
  93. })
  94. }
  95. // 登錄請求
  96. req.reqLogin(code, encryptedData, iv, rawData, signature, success, fail)
  97. },

 

重磅推薦:小程序開店目錄

第一部分:小商店是什么

第二部分:如何開通一個小商店

第三部分:如何登錄小商店

第四部分:開店任務常見問題

第五部分:小商店可以賣什么

第六部分:HiShop小程序特色功能

第七部分:小程序直播

第八部分:小程序收貨/物流

第九部分:小程序怎么結(jié)算

第十部分:小程序客服

第十一部分:電商創(chuàng)業(yè)

第十二部分:小程序游戲開發(fā)

電話咨詢 微信咨詢 預約演示 0元開店