Python-Flask微信小程序登录流程详解及后台实现

文章目录

  • 登录流程图及个人理解
  • 登录接口源码

登录流程图及个人理解

Python-Flask微信小程序登录流程详解及后台实现_第1张图片

1、前端将由wx.login()方法获取到的用户临时登录凭证code(只能使用一次)传给后台服务器(即登录接口)
2、后台利用微信小程序的appid、appsecret以及前端传过来的code以GET请求方式调用微信提供的相关API

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

得到用户OpenID(关于当前小程序的唯一标识)和会话密钥session_key(对用户数据进行加密签名的密钥)
3、出于安全考虑,微信官方要求开发者不能将会话密钥下发到小程序,所以要想确保用户登录的唯一性(即知道登录的用户对应的是数据库中哪一个OpenID和会话密钥)就需要结合OpenID和session_key自定义登录态(例:可以在数据库中为每一个用户加一个自增的UserID字段与OpenID、session_key对应)
4、前端调用后台登录接口时便将自定义的登录态(例:对应UserID)返回,前端在需要对用户相关数据进行操作时便可通过得到的登录态对与之对应的用户数据进行操作

登录接口源码

from flask import Flask
import requests, json

app = Flask(__name__)

@app.route('/login', methods = ['POST'])
def login():
    data = json.loads(request.get_data().decode('utf-8')) #将前端Json数据转为字典
    appID = 'APPID' #开发者关于微信小程序的appID
    appSecret = 'SECRET' #开发者关于微信小程序的appSecret
    code = data['code'] #前端POST过来的微信临时登录凭证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发起GET请求
    data = response_data.json()
    openid = data['openid'] #得到用户关于当前小程序的OpenID
    session_key = data['session_key'] #得到用户关于当前小程序的会话密钥session_key


	'''
	下面部分是通过判断数据库中用户是否存在来确定添加或返回自定义登录态(若用户不存在则添加;若用户存在,我这里返回的是添加用户时生成的自增长字段UserID)
	'''
    if openid and session_key:
        '''
    	在数据库用户表查询(查找得到的OpenID在数据库中是否存在)
    	SQLalchemy语句:
    	user_info = User.query.filter(User.OpenID == openid).first() 
        '''
        if user_info is None: #不存在
	        '''
	        将得到的OpenID添加到数据库得用户表
	        SQLalchemy语句:
	        user_info = User(OpenID = openid)
	        db.session.add(user_info)
	        db.session.commit()
	        '''
        return json.dumps(user_info.UserID, ensure_ascii = False) #将UserID转为Json返回
    return "code失效或不正确"

if __name__ == '__main__':
	app.run(host = '0.0.0.0', port = 80)
	

你可能感兴趣的:(Python-Flask)