微信小程序授權登錄、解密unionId出錯

注意:沒有在微信開放平臺(不是公眾平臺)做開發者資質認證的就不要浪費時間了,沒認證無法獲取unionId,認證費用300元/年,emmmm....

微信授權登錄流程

第一步:wx.login獲取 用戶臨時登錄憑證code

第二步:wx.getUserInfo獲取加密過的數據encryptedData和解密參數iv

第三步:把步驟一、二中的code、encryptedData、iv傳到開發者自己服務端

第三步:服務端獲取到code、encryptedData、iv之后用get方法請求如下微信接口

https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code

appid:小程序appid

secret: 小程序密鑰

js_code: 第一步獲取的臨時登錄憑證code

grant_type:'authorization_code'

接口會返回 openid, session_key,注意:用戶已經授權過的平臺還會返回unionId,如果你只是需要unionId,則到此為止

官方文檔說法如圖:

官方文檔說法

沒有授權過則用encryptedData、session_key、iv、appid、secret進行解密,官方多語言解密示例下載鏈接:

unionId解密示例

包含c++ php python node

第四步:仿照示例解密后獲得unionId,想做什么就做什么了~

以下是授權登錄前端代碼

// 微信授權登錄

? authLogin () {

? ? wx.login({

? ? ? success: loginRes => {

? ? ? ? let code = loginRes.code??// 獲取用戶臨時code

? ? ? ? wx.getUserInfo({

? ? ? ? ? success: function (res) {

? ? ? ? ? ? let encryptedData = res.encryptedData??// 獲取加密數據

? ? ? ? ? ? let iv = res.iv? //??解密參數

? ? ? ? ? ? // 發送解密必要數據到服務端

? ? ? ? ? ? wx.request({

? ? ? ? ? ? ? url: 'http://localhost',

? ? ? ? ? ? ? methods: 'POST',

? ? ? ? ? ? ? data: {

? ? ? ? ? ? ? ? code: code,

? ? ? ? ? ? ? ? encryptedData: encryptedData,

? ? ? ? ? ? ? ? iv: iv

? ? ? ? ? ? ? },

? ? ? ? ? ? ? succeess: res => {

? ? ? ? ? ? ? ? // 服務端首先調用微信接口獲取session_key

? ? ? ? ? ? ? ? // 用戶已經授權過的平臺會直接返回unionId

? ? ? ? ? ? ? ? // 沒有授權過則用session_key進行解密

? ? ? ? ? ? ? ? // 解密成功后服務端根據邏輯返回自定義信息

? ? ? ? ? ? ? }

? ? ? ? ? ? })

? ? ? ? ? }

? ? ? ? })

? ? ? }

? ? })

? }


以上步驟可行,但是微信更改用戶授權方式


未授權將直接調用失敗

需用button組件調用getUserInfo,所以在這之前無法調用wx.login。解決辦法,在頁面的onLoad生命周期里調用wx.login,獲取的code存入data以備需要的時候使用,但是code失效時間為5分鐘,如果用戶停留頁面時間過長后點擊授權登錄,此時的code已經過期了,所以,獲取code的函數應該每4分鐘左右調用一次。

獲取code代碼如下:

onLoad: function (options) {

? ? this.getCodeTimer()

? },

getCodeTimer () {

? ? wx.login({

? ? ? success: res => {

? ? ? ? this.data.code = res.code

? ? ? ? setTimeout(() => {

? ? ? ? ? this.getCodeTimer()

? ? ? ? }, 4 * 60 * 1000)

? ? ? }

? ? })

? }

wxml按鈕授權:

<button class="primary-bg" open-type='getUserInfo' bindgetuserinfo="authLogin">微信登錄</button>

授權登錄:

// 授權登錄

? authLogin(event) {

? ? if (event.detail.errMsg == 'getUserInfo:ok') {

? ? ? wx.showLoading()

? ? ? let reqData = {

? ? ? ? code: this.data.code,

? ? ? ? encryptedData: event.detail.encryptedData,

? ? ? ? iv: event.detail.iv

? ? ? }

? ? ? wx.request({

? ? ? ? url: 'http://localhost:8080',

? ? ? ? methods: 'POST',

? ? ? ? data: reqData,

? ? ? ? success: (res) => {

? ? ? ? ? console.log(res)

? ? ? ? ? ? // 請求完成

? ? ? ? }

? ? ? })

? ? } else {

? ? ? console.log('用戶拒絕授權')

? ? }

? }

到此,完。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容