注冊(cè)登錄

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

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

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

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

 

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

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

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

 

  1. // 點(diǎn)擊微信登錄
  2. wechatAction: function(e) {
  3. // 用戶點(diǎn)擊授權(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失敗,請(qǐng)重試',
  45. icon: 'none'
  46. })
  47. }
  48. wx.hideLoading()
  49. }
  50. })
  51. },
  52.  
  53. // 根據(jù)獲取到的code 向服務(wù)器發(fā)送登錄請(qǐng)求 獲取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ù),請(qǐng)求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. // 請(qǐng)求成功
  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. // 請(qǐng)求失敗
  88. let fail = function(res) {
  89. wx.hideLoading()
  90. wx.showToast({
  91. title: '獲取token失敗,請(qǐng)重試',
  92. icon: 'none'
  93. })
  94. }
  95. // 登錄請(qǐng)求
  96. req.reqLogin(code, encryptedData, iv, rawData, signature, success, fail)
  97. },

 

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

第一部分:小商店是什么

第二部分:如何開通一個(gè)小商店

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

第四部分:開店任務(wù)常見問題

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

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

第七部分:小程序直播

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

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

第十部分:小程序客服

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

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

電話咨詢 微信咨詢 預(yù)約演示 0元開店