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实现内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
时间:2020-06-05
Python的Flask框架中实现登录用户的个人资料和头像的教程
用户资料页面 在用户资料页面,基本上没有什么特别要强调和介绍的新概念.只需要创建一个含有HTML的新视图函数模板页面即可. 下面是视图函数(项目目录/views.py): @app.route('/user/<nickname>') @login_required def user(nickname): user = User.query.filter_by(nickname = nickname).first() if user == None: flash('不存在用户:' + nickn
Python Flask 搭建微信小程序后台详解
前言: 近期需要开发一个打分的微信小程序,涉及到与后台服务器的数据交互,因为业务逻辑相对简单,故选择Python的轻量化web框架Flask来搭建后台程序.因为是初次接触小程序,经过一番摸索和尝试,个人觉得的微信小程序与后台的交互有点像ajax,所以有ajax开发经验的同学开发小程序应该很容易上手,因为本文着重讲解后台程序的搭建,所以,微信小程序的前端开发将一笔带过,有兴趣学习小程序前端语言的同学可移步网易云课堂的一套快速入门课程<轻松玩转微信小程序>. 分三步讲解微信小程序与Python后台
使用Python的Flask框架表单插件Flask-WTF实现Web登录验证
表单是让用户与我们的网页应用程序交互的基本元素.Flask 本身并不会帮助我们处理表单,但是 Flask-WTF 扩展让我们在我们的 Flask 应用程序中使用流行的 WTForms 包.这个包使得定义表单和处理提交容易一些. Flask-WTF 我们想要使用 Flask-WTF 做的第一件事情(在安装它以后,GitHub项目页
:https://github.com/lepture/flask-wtf )就是在 myapp.forms 包中定义一个表单. # ourapp/forms.py fr
Python的Flask框架中实现简单的登录功能的教程
回顾 在前面的系列章节中,我们创建了一个数据库并且学着用用户和邮件来填充,但是到现在我们还没能够植入到我们的程序中. 两章之前,我们已经看到怎么去创建网络表单并且留下了一个实现完全的登陆表单. 在这篇文章中,我们将基于我门所学的网络表单和数据库来构建并实现我们自己的用户登录系统.教程的最后我们小程序会实现新用户注册,登陆和退出的功能. 为了能跟上这章节,你需要前一章节最后部分,我们留下的微博程序.请确保你的程序已经正确安装和运行. 在前面的章节,我们开始配置我们将要用到的Flask扩展.为了登
python使用Flask操作mysql实现登录功能
用到的一些知识点
:Flask-SQLAlchemy.Flask-Login.Flask-WTF.PyMySQL 这里通过一个完整的登录实例来介绍,程序已经成功运行,在未登录时拦截了success.html页面跳转到登录页面,登录成功后才能访问success. 以下是项目的整体结构图: 首先是配置信息,配置了数据库连接等基本的信息,config.py DEBUG = True SQLALCHEMY_ECHO = False SQLALCHEMY_DATABASE_URI = 'mysql+pymy
python实现网站用户名密码自动登录功能
一.概述 公司需要通过网页用户认证登录实现上网,网络设备判断当前帐号12小时没有没上网将会自动断开帐号上网,每天早上上班第一件事就是打开用户认证网页输入. 用户名与密码,有时候要家里通过teamview远程控制软件连接公司电脑,想让公司电脑24小时在线,最后通过python实现了自动登录. 代码: #_*_ coding:utf-8 _*_ import requests,time s=requests.session() data = [ ('opr', 'pwdLogin'), ('user
在Python程序中操作MySQL的基本方法
Python操作Mysql 最近在学习python,这种脚本语言毫无疑问的会跟数据库产生关联,因此这里介绍一下如何使用python操作mysql数据库.我python也是零基础学起,所以本篇博客针对的是python初学者,大牛可以选择绕道. 另外,本篇基于的环境是Ubuntu13.10,使用的python版本是2.7.5. MYSQL数据库 MYSQL是一个全球领先的开源数据库管理系统.它是一个支持多用户.多线程的数据库管理系统,与Apache.PHP.Linux共同组成LAMP平台,在web应
python简单实现操作Mysql数据库
用python编写数据库的代码很方便,但是如果不想自己写sql语句,其实还有更多的讨巧办法.使用webpy的db库就是不错的一个选择.当然为了使用webpy的db,之前你还需要安装MySQLdb,其他的就不需要做什么了. 1.安装MySQLdb库 sudo apt-get install python-MySQLdb 2.安装webpy sudo apt-get install python-webpy 3.连接数据库 import web db = web.database(dbn='mysq
python使用SQLAlchemy操作MySQL
SQLAlchemy是Python编程语言下的一款开源软件,提供了SQL工具包及对象关系映射(ORM)工具,使用MIT许可证发行.SQLAlchemy首次发行于2006年2月,并迅速地在Python社区中最广泛使用的ORM工具之一,不亚于Django的ORM框架. 本文将介绍如何使用SQLAlchemy操作MySQL,完成基础的表创建,表格数据的新增.查询.修改.删除(CRUD)等操作. 首先我们需要确认当前的Python环境下已经安装sqlalchemy和pymysql模块. 新建表格 我们使
Java+mysql用户注册登录功能
最近刚刚开始学习mysql,所以就写了这个很基本的用户注册登录的功能来练练手.虽然这个很简单,但是我还是看到了自己学习的进步,很开心.哈哈哈. 这里要注意数据表的建立: 直接上代码吧,里面注释很详细了. package client; import java.sql.*; import java.util.*; public class Client { /** * 用以实现用户的注册和登录 */ private static String username;//用户登录注册的姓名 privat
Python的Flask框架中实现分页功能的教程
Blog Posts的提交 让我们从简单的开始.首页上必须有一张用户提交新的post的表单. 首先我们定义一个单域表单对象(fileapp/forms.py): class PostForm(Form): post = TextField('post', validators = [Required()]) 下面,我们把这个表单添加到template中(
fileapp/templates/index.html): {% extends &
flask 框架操作MySQL数据库简单示例
本文实例讲述了flask 框架操作MySQL数据库.分享给大家供大家参考,具体如下: 一.创建数据库表格 """ Created on 19-10-8 @requirement:Anaconda 4.3.0 (64-bit) Python3.6 @description:创建表格 """ import pymysql server = '127.0.0.1' user = 'root' password = 'password' # 连接数据库
Python操作MySQL数据库的三种方法总结
1. MySQLdb 的使用 (1) 什么是MySQLdb? MySQLdb 是用于 Python 连接 MySQL 数据库的接口,它实现了 Python 数据库 API 规范 V2.0,基于 MySQL C API 上建立的. (2) 源码安装 MySQLdb:
https://pypi.python.org/pypi/MySQL-python $ tar zxvf MySQL-python-*.tar.gz $ cd MySQL-python-* $ python setup.py buil