Python 实现微信小程序的用户登录

     小程序可以通过官方提供的登录能力来获取用户身份的标示,具体文档可以参考 这里,通过流程时序可以看到,对于需要和前端配合的服务端开发,主要实现的就是通过小程序提供的 code 换取用户的 openid 和 session_key,并用换取到的 openid 和 secret_key 作为自定义的登录态。分析后得知,作为小程序后端的开发,主要实现以下几部分内容:

  - 提供一个 HTTP 接口,供小程序方使用,传递 code;

   - 换取用户身份标识;

   - 维护一个自定义的登录态;

       - 需要存储用户的 openid,以备后续使用。

 

1. 提供给小程序一个 HTTP 接口,接口使用 Tornado 框架

     为了简化思路,下面代码都没有做各种异常处理!

class LoginHandler(RequestHandler):def post(self):req_data = json.loads(self.request.body)js_code = req_data.get('js_code')# 这里是换取用户的信息user_info = get_user_info(js_code=js_code)openid = user_info['openid']session_key = user_info['session_key']user_uuid = str(uuid.uuid4())  # 暴露给小程序端的用户标示# 用来维护用户的登录态
        User.save_user_session(user_uuid=user_uuid,openid=openid,session_key=session_key)# 微信小程序不能设置cookie,把用户信息存在了 headers 中self.set_header('Authorization', user_uuid)# 存储用户信息User.save_user_info(open_id=openid)self.set_status(204)

 

2. 换取用户身份标示,直接使用 Requests 请求微信的相关接口,获取数据

 1 def get_user_info(js_code):
 2 
 3     req_params = {
 4         "appid": 'app_id',  # 小程序的 ID
 5         "secret": 'secret',  # 小程序的 secret
 6         "js_code": js_code,
 7         "grant_type": 'authorization_code'
 8     }
 9     req_result = requests.get('https://api.weixin.qq.com/sns/jscode2session', 
10                               params=req_params, timeout=3, verify=False)
11     return req_result.json()

3. 维护一个自定义的登录态,使用了 Redis

 1 user_redis = StrictRedis.from_url('redis//localhost:6379')
 2 
 3 
 4  class User(object):
 5 
 6     REDIS_EXPIRES = 7 * 24 * 60 * 60
 7 
 8     @classmethod
 9     def save_user_session(cls, user_uuid, openid, session_key):
10         user_session_value = {
11             'openid': openid,
12             'session_key': session_key
13         }
14         user_session_key = 'US:' + user_uuid
15         with user_redis.pipeline(transaction=False) as pipe:
16             pipe.hmset(user_session_key, user_session_value)
17             pipe.expire(user_session_key, cls.REDIS_EXPIRES)
18             pipe.execute()

 

4. 存储用户信息,以备后用,这里使用了 MySQL,ORM 使用的是 SQLAlchemy

 1 from sqlalchemy import create_engine
 2 from sqlalchemy.ext.declarative import declarative_base
 3 
 4 # mysql 相关设置
 5 engine = create_engine('mysql://root:@localhost/wechat')
 6 conn = engine.connect()
 7 
 8 Base = declarative_base()
 9 Base.metadata.reflect(engine)
10 tables = Base.metadata.tables
11 
12 class User(object):
13     table = tables['user']
14     
15     @classmethod
16     def save_user_info(cls, open_id):
17         #  存储用户信息
18         sql = cls.table.insert().values(open_id=open_id)
19         conn.execute(sql)

SQL 语句

CREATE TABLE `user` (`id` int(20) unsigned NOT NULL AUTO_INCREMENT,`open_id` varchar(32) NOT NULL COMMENT '用户 open_id',`created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',PRIMARY KEY (`id`),KEY `idx_oid` (`open_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

 

全部代码可以点击 这里 获取!

转载于:https://www.cnblogs.com/qiaojushuang/p/9171680.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/465745.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

硬件基础 —— 电容

硬件基础 —— 电容1、电容基本知识(记忆元件)电容器是一种能储存电荷的容器。电容器对直流电阻力无穷大,即电容器具有通交隔直的作用。电容器对交流电的阻力受交流电频率影响,即相同容量的电容器对不同频率的交流电呈现不同的容抗…

python 学习笔记一

有关 dictionary、tuple、和 list Tuple 是不可变的 list。一旦创建了一个 tuple,就不能以任何方式改变它。如t ("a", "b", "mpilgrim", "z", "example") List 是 Python 中使用最频繁的数据类型。如&#xff1…

同事说rar压缩有风险,让我用zip压缩文件

在现在最常见的压缩文件有zip、rar、7z三种,它们都有各自的优点和缺点。我们用一句话来概括一下:7z压缩率最高,RAR安全性高,ZIP使用范围广。文件压缩打包是最为常见的一种分享方式了,而众多的压缩格式中zip仍然是主流。…

JAVA实现概率计算(数字不同范围按照不同几率产生随机数)

程序中经常遇到随机送红包之类的情景&#xff0c;这个随机还得指定概率&#xff0c;比如10%的机率可以得到红包。那么java怎么实现一个简单的概率计算了&#xff0c;见如下例子&#xff1a; int randomInt RandomUtils.nextInt(1,101); if(randomInt < 10){ //100里面1个数…

硬件基础 —— 二极管

硬件基础 —— 二极管1、二极管基础知识PN结&#xff1a;P区空穴&#xff0c;N区电子。由于浓度差原理&#xff0c;会产生扩散运动&#xff08;N到P运动&#xff09;。在电场作用下&#xff0c;载流电子作漂移运动&#xff0c;方向与扩散运动方向相反直到PN结电流为零&#xff…

AKI-H8串口通信

串口通信是一种通信接口简写SCI&#xff0c;它可是实现异步和同步两种传输模式。可以思考一下同步和异步的区别。 所谓同步就是接收方和发送方使用的是同一个时钟&#xff0c;步调一致的处理数据。典型的就是CPU和内存&#xff0c;通过总线存取数据。特点就是快&#xff0c;发送…

字节取消大小周,部分员工:心疼,每个月少拿 1W 块

如图&#xff0c;是脉脉最近的一个热帖&#xff0c;头条昨天全员发邮件取消了大小周&#xff0c;原本是一件好事&#xff0c;减轻大家的工作压力&#xff0c;努力向 workbalance 靠拢&#xff0c;可是看着风向好像不太对&#xff0c;我们继续看下 TOP 的几个回复。下面是反对头…

高通LCD的pwm背光驱动

发生异常的现象&#xff1a; msm8953 lcd在快速亮灭的情况下背光概率性休眠不灭&#xff1b;测量高通pwm&#xff0c;发现正常的时候pwm的管脚LCM_BL_PWM为低电平&#xff0c;失败的时候为高电平&#xff1b; 根据原理图&#xff1a; mpp是什么&#xff1f; mpp是基于电源pmic的…

为什么一个字节定义成8位?

今天给大家分享一个小小知识点&#xff0c;为什么一个字节定义成8位呢&#xff1f;一些人没有回答到点子上。这件事得追溯计算机历史&#xff0c;源于IBM360操作系统和图灵奖得主&#xff08;Fred&#xff09;Brooks Jr。布鲁克斯被问到“您认为自己最大的技术成就是什么&#…

测试一下新的签名

测试一下新的签名看看是否漂亮

硬件基础 —— 光耦

光耦1、工作原理以光为媒介传递电信号。对输入和输出信号有良好的隔离作用&#xff08;光耦隔离&#xff09;。光耦一般由三个部分组成&#xff1a;光的发射、光的接收和信号放大。输入的电信号驱动发光二极管&#xff0c;被光探测器接收而产生光电流&#xff0c;再经过进一步放…

【51nod】1934 受限制的排列

题解 这题还要判无解真是难受…… 我们发现我们肯定能确定1的位置&#xff0c;1左右的两个区间是同理的可以确定出最小值的位置 我们把区间最小值看成给一个区间1&#xff0c;构建出笛卡尔树&#xff0c;就求出了每一次取最小值和最小值左右的区间大小 然后就相当于左右子树的排…

红外感应自动出水水龙头的电路原理

红外感应自动出水的水龙头&#xff0c;生活中很常见&#xff1a;可以用以下的电路方案实现&#xff0c;供电采用USB的5V&#xff1a;只要手靠近“红外线靠近检测模块”&#xff0c;直流水泵就会开启供水&#xff1a;其中这种直流水泵长这样&#xff1a;当“红外线靠近检测模块”…

推荐一些国产开源项目

推荐一些国产开源项目EasyjfEasyjf是一个国产的开源社区&#xff0c;开源项目众多&#xff0c;都做的一般般&#xff0c;但是要支持下&#xff01;http://www.easyjf.com/精仿DZ论坛 LForum 写在前面的话&#xff1a;一 直以来&#xff0c;我都对Web充满了兴趣。曾在04年就开始…

Linux面试最高频的5个基本问题

CPU利用率和CPU负载的区别是什么提到CPU利用率&#xff0c;就必须理解时间片。什么是CPU时间片&#xff1f;我们现在所使用的Windows、Linux、Mac OS都是“多任务操作系统”&#xff0c;就是说他们可以“同时”运行多个程序&#xff0c;比如一边打开Chrome浏览器浏览网页还能一…

用iptables实现G1手机cmwap代理上http网站[转]

2019独角兽企业重金招聘Python工程师标准>>> 折腾了几天&#xff0c;总算有点阶段性成果&#xff1a; 证实可以用iptables实现通过cmwap的代理上HTTP协议的网站。 首先&#xff0c;android系统的实现是有缺陷的。在接入apn中指定的proxy并不会被系统所用。好似只有浏…

equals与==的区别

使用比较原生类型如&#xff1a;boolean、int、char等等&#xff0c;使用equals()比较对象。 1、是判断两个变量或实例是不是指向同一个内存空间。 equals是判断两个变量或实例所指向的内存空间的值是不是相同。 2、是指对内存地址进行比较。 equals()是对字符串的内容进行比较…

初识Buildroot

转自CSDN &#xff0c;记录是为了作者小编学习需要作者&#xff1a;xixihaha331什么是buildrootBuildroot是Linux平台上一个构建嵌入式Linux系统的框架。整个Buildroot是由Makefile脚本和Kconfig配置文件构成的。你可以和编译Linux内核一样&#xff0c;通过buildroot配置&#…

Python3安装(Windows)

Windows下Python3环境搭建 目录 Windows下Python3环境搭建 安装Python 启动终端会话 IDE —— Geany 安装Python 访问https://www.python.org/downloads 点击上图红色区域按钮&#xff0c;下载Python。下载完成后开始安装&#xff1a; 勾选“Add Python 3.7 to PATH”&…

Runtime消息动态解析与转发流程

先上图&#xff1a; 下面根据具体代码看这张图。 一、创建一个Person类&#xff0c; Person.h #import <Foundation/Foundation.h>interface Person : NSObject-(void)sendMessage:(NSString *)message;end Person.m #import "Person.h" #import <objc/runt…