1、前端將由wx.login()方法獲取到的用戶臨時(shí)登錄憑證code(只能使用一次)傳給后臺(tái)服務(wù)器(即登錄接口)
2、后臺(tái)利用微信小程序的appid、appsecret以及前端傳過(guò)來(lái)的code以GET請(qǐng)求方式調(diào)用微信提供的相關(guān)API
https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
得到用戶OpenID(關(guān)于當(dāng)前小程序的唯一標(biāo)識(shí))和會(huì)話密鑰session_key(對(duì)用戶數(shù)據(jù)進(jìn)行加密簽名的密鑰)
3、出于安全考慮,微信官方要求開(kāi)發(fā)者不能將會(huì)話密鑰下發(fā)到小程序,所以要想確保用戶登錄的唯一性(即知道登錄的用戶對(duì)應(yīng)的是數(shù)據(jù)庫(kù)中哪一個(gè)OpenID和會(huì)話密鑰)就需要結(jié)合OpenID和session_key自定義登錄態(tài)(例:可以在數(shù)據(jù)庫(kù)中為每一個(gè)用戶加一個(gè)自增的UserID字段與OpenID、session_key對(duì)應(yīng))
4、前端調(diào)用后臺(tái)登錄接口時(shí)便將自定義的登錄態(tài)(例:對(duì)應(yīng)UserID)返回,前端在需要對(duì)用戶相關(guān)數(shù)據(jù)進(jìn)行操作時(shí)便可通過(guò)得到的登錄態(tài)對(duì)與之對(duì)應(yīng)的用戶數(shù)據(jù)進(jìn)行操作
from flask import Flaskimport requests, jsonapp = Flask(__name__)@app.route('/login', methods = ['POST'])def login(): data = json.loads(request.get_data().decode('utf-8')) #將前端Json數(shù)據(jù)轉(zhuǎn)為字典 appID = 'APPID' #開(kāi)發(fā)者關(guān)于微信小程序的appID appSecret = 'SECRET' #開(kāi)發(fā)者關(guān)于微信小程序的appSecret code = data['code'] #前端POST過(guò)來(lái)的微信臨時(shí)登錄憑證code 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發(fā)起GET請(qǐng)求 data = response_data.json() openid = data['openid'] #得到用戶關(guān)于當(dāng)前小程序的OpenID session_key = data['session_key'] #得到用戶關(guān)于當(dāng)前小程序的會(huì)話密鑰session_key ''' 下面部分是通過(guò)判斷數(shù)據(jù)庫(kù)中用戶是否存在來(lái)確定添加或返回自定義登錄態(tài)(若用戶不存在則添加;若用戶存在,我這里返回的是添加用戶時(shí)生成的自增長(zhǎng)字段UserID) ''' if openid and session_key: ''' 在數(shù)據(jù)庫(kù)用戶表查詢(查找得到的OpenID在數(shù)據(jù)庫(kù)中是否存在) SQLalchemy語(yǔ)句: user_info = User.query.filter(User.OpenID == openid).first() ''' if user_info is None: #不存在 ''' 將得到的OpenID添加到數(shù)據(jù)庫(kù)得用戶表 SQLalchemy語(yǔ)句: user_info = User(OpenID = openid) db.session.add(user_info) db.session.commit() ''' return json.dumps(user_info.UserID, ensure_ascii = False) #將UserID轉(zhuǎn)為Json返回 return "code失效或不正確"if __name__ == '__main__': app.run(host = '0.0.0.0', port = 80)
聯(lián)系客服