Python Flask微信小程式登入流程及登入api實現程式碼
阿新 • • 發佈:2020-06-07
一、先來看看效果
介面請求返回的資料:
二、官方登入流程圖
三、小程式登入流程梳理:
1、小程式端呼叫wx.login
2、判斷使用者是否授權
3、小程式端訪問 wx.getUserInfo
4、小程式端js程式碼:
wx.login({ success: resp => { // 傳送 res.code 到後臺換取 openId,sessionKey,unionId console.log(resp); var that = this; // 獲取使用者資訊 wx.getSetting({ success: res => { if (res.authSetting['scope.userInfo']) { // 已經授權,可以直接呼叫 getUserInfo 獲取頭像暱稱,不會彈框 wx.getUserInfo({ success: userResult => { var platUserInfoMap = {} platUserInfoMap["encryptedData"] = userResult.encryptedData; platUserInfoMap["iv"] = userResult.iv; wx.request({ url: 'http://127.0.0.1:5000/user/wxlogin',data: { platCode: resp.code,platUserInfoMap: platUserInfoMap,},header: { "Content-Type": "application/json" },method: 'POST',dataType:'json',success: function (res) { console.log(res) wx.setStorageSync("userinfo",res.userinfo) //設定本地快取 },fail: function (err) { },//請求失敗 complete: function () { }//請求完成後執行的函式 }) } }) } } }) } })
5、後端伺服器訪問code2session,通過code2Session這個api介面來獲取真正需要的微信使用者的登入態session_key
和 openid
和 unionid
6、後端伺服器校驗使用者資訊,對encryptedData
解密
微信小程式登入後獲得session_key後,返回了encryptedData,iv的資料,其中encryptedData解密後包含了使用者的資訊,解密後的json格式如下:
{ "openId": "OPENID","nickName": "NICKNAME","gender": GENDER,"city": "CITY","province": "PROVINCE","country": "COUNTRY","avatarUrl": "AVATARURL","unionId": "UNIONID","watermark": { "appid":"APPID","timestamp":TIMESTAMP } }
7、新建解密檔案——WXBizDataCrypt.py
from Crypto.Cipher import AES
這邊一般會遇到ModuleNotFoundError:No module named "Crypto"
錯誤
(1)執行pip3 install pycryptodome
(2)如果還是提示沒有該模組,那就虛擬環境目錄Lib—-site-package
中檢視是否有Crypto
資料夾,這時你應該看到有crypto
資料夾,將其重新命名為Crypto
即可
import base64 import json from Crypto.Cipher import AES class WXBizDataCrypt: def __init__(self,appId,sessionKey): self.appId = appId self.sessionKey = sessionKey def decrypt(self,encryptedData,iv): # base64 decode sessionKey = base64.b64decode(self.sessionKey) encryptedData = base64.b64decode(encryptedData) iv = base64.b64decode(iv) cipher = AES.new(sessionKey,AES.MODE_CBC,iv) decrypted = json.loads(self._unpad(cipher.decrypt(encryptedData))) if decrypted['watermark']['appid'] != self.appId: raise Exception('Invalid Buffer') return decrypted def _unpad(self,s): return s[:-ord(s[len(s)-1:])]
8、Flask的/user/wxlogin
api程式碼:
import json,requests from WXBizDataCrypt import WXBizDataCrypt from flask import Flask @app.route('/user/wxlogin',methods=['GET','POST']) def user_wxlogin(): data = json.loads(request.get_data().decode('utf-8')) # 將前端Json資料轉為字典 appID = 'appID' # 開發者關於微信小程式的appID appSecret = 'appSecret' # 開發者關於微信小程式的appSecret code = data['platCode'] # 前端POST過來的微信臨時登入憑證code encryptedData = data['platUserInfoMap']['encryptedData'] iv = data['platUserInfoMap']['iv'] req_params = { 'appid': appID,'secret': appSecret,'js_code': code,'grant_type': 'authorization_code' } wx_login_api = 'https://api.weixin.qq.com/sns/jscode2session' response_data = requests.get(wx_login_api,params=req_params) # 向API發起GET請求 resData = response_data.json() openid = resData ['openid'] # 得到使用者關於當前小程式的OpenID session_key = resData ['session_key'] # 得到使用者關於當前小程式的會話金鑰session_key pc = WXBizDataCrypt(appID,session_key) #對使用者資訊進行解密 userinfo = pc.decrypt(encryptedData,iv) #獲得使用者資訊 print(userinfo) ''' 下面部分是通過判斷資料庫中使用者是否存在來確定新增或返回自定義登入態(若使用者不存在則新增;若使用者存在,返回使用者資訊) --------略略略略略略略略略------------- 這部分我就省略啦,資料庫中對使用者進行操作 ''' return json.dumps ({ "code": 200,"msg": "登入成功","userinfo":userinfo},indent=4,sort_keys=True,default=str,ensure_ascii=False)
總結
到此這篇關於Python Flask微信小程式登入詳解及登入api實現的文章就介紹到這了,更多相關Python Flask微信小程式登入詳解及登入api實現內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!