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 请求微信的相关接口,获取数据
def get_user_info(js_code):
req_params = {
"appid": 'app_id', # 小程序的 ID
"secret": 'secret', # 小程序的 secret
"js_code": js_code,
"grant_type": 'authorization_code'
}
req_result = requests.get('https://api.weixin.qq.com/sns/jscode2session',
params=req_params, timeout=3, verify=False)
return req_result.json()
3. 维护一个自定义的登录态,使用了Redis
user_redis = StrictRedis.from_url('redis//localhost:6379')
class User(object):
REDIS_EXPIRES = 7 * 24 * 60 * 60
@classmethod
def save_user_session(cls, user_uuid, openid, session_key):
user_session_value = {
'openid': openid,
'session_key': session_key
}
user_session_key = 'US:' + user_uuid
with user_redis.pipeline(transaction=False) as pipe:
pipe.hmset(user_session_key, user_session_value)
pipe.expire(user_session_key, cls.REDIS_EXPIRES)
pipe.execute()
4. 存储用户信息,以备后用,这里使用了 MySQL,ORM 使用的是 SQLAlchemy
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base # mysql 相关设置
engine = create_engine('mysql://root:@localhost/wechat')
conn = engine.connect() Base = declarative_base()
Base.metadata.reflect(engine)
tables = Base.metadata.tables class User(object):
table = tables['user'] @classmethod
def save_user_info(cls, open_id):
# 存储用户信息
sql = cls.table.insert().values(open_id=open_id)
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;
全部代码可以点击 这里 获取!
Python 实现微信小程序的用户登录的更多相关文章
- 微信小程序中用户登录和登录态维护
提供用户登录以及维护用户的登录状态,是一个拥有用户系统的软件应用普遍需要做的事情.像微信这样的一个社交平台,如果做一个小程序应用,我们可能很少会去做一个完全脱离和舍弃连接用户信息的纯工具软件. 让用户 ...
- 微信小程序 获取用户信息并保存登录状态
微信小程序 获取用户信息并保存登录状态:http://www.360doc.com/content/18/0124/11/9200790_724662071.shtml
- 使用uView UI+UniApp开发微信小程序--判断用户是否登录并跳转
在<使用uView UI+UniApp开发微信小程序>的随笔中,介绍了基于uView UI+UniApp开发微信小程序的一些基础知识和准备工作,其中也大概介绍了一下基本的登录过程,本篇随笔 ...
- 微信小程序API~检查登录状态
wx.checkSession(Object object) 检查登录态是否过期. 通过 wx.login 接口获得的用户登录态拥有一定的时效性.用户越久未使用小程序,用户登录态越有可能失效.反之如果 ...
- Laravel wxxcx 微信小程序获取用户信息
wxxcx 是Laravel5微信小程序登录获取用户信息扩展 部署 12345678 # 安装$ composer require iwanli/wxxcx# 注册服务# 在 /config/app. ...
- [微信小程序] 微信小程序获取用户定位信息并加载对应城市信息,wx.getLocation,腾讯地图小程序api,微信小程序经纬度逆解析地理信息
因为需要在小程序加个定位并加载对应城市信息 然而小程序自带api目前只能获取经纬度不能逆解析,虽然自己解析方式,但是同时也要调用地图,难道用户每次进小程序还要强行打开地图选择地址才定位吗?多麻烦也不利 ...
- 基于微信小程序的用户列表点赞功能
代码地址如下:http://www.demodashi.com/demo/13997.html 一.前言 (1).适合人群 1.微信小程序开发者 2.前端工程师 3.想入门学习小程序开发的人员 4.想 ...
- 利用python实现微信小程序游戏跳一跳详细教程
利用python实现微信小程序游戏跳一跳详细教程 1 先安装python 然后再安装pip <a href="http://newmiracle.cn/wp-content/uploa ...
- 微信小程序开发用户授权登录
用wx.login获取登录凭证code <!--pages/user/index.wxml--> <view hidden='{{boolean}}'> <view wx ...
随机推荐
- [NOI.AC]NOI2019省选模拟赛 第二场
传送门 Solution A. 一共有\(T\)组数据 每次询问你\([l,r]\)中有多少个数能被他的所有数位整除(如果数位中含有\(0\)忽略掉) 数位dp,咕咕咕 B. 题面略 考虑一个个只有两 ...
- Java 中Math常用方法
import java.text.SimpleDateFormat; import java.util.Date; public class Test4 { public static void ma ...
- DH密钥加解密
一.概述 1.与对称加密算法的主要差别在于,加密和解密的密钥不相同,一个公开(公钥),一个保密(私钥).主要解决了对称加密算法密钥分配管理的问题,提高了算法安全性. 2.非对称加密算法的加密.解密的效 ...
- 2018-2019-2 网络对抗技术 20165322 Exp9 Web安全基础
2018-2019-2 网络对抗技术 20165322 Exp9 Web安全基础 目录 实验内容与步骤 (一)Webgoat安装 (二)SQL注入攻击 1.命令注入(Command Injection ...
- sql 数字转换为字符串补0
select right('00000000000'+convert(varchar(5),123),5) select right('00000000000'+cast(123 as var ...
- Oracle通过一个字段的值将一条记录拆分为多条记录
前言 之前遇到了一次这样的需求,当时没有记录,这一次又赶上了,简单的记录一下. 本文个人拙见,若有出入,请指出--来自菜的颤抖 场景 表A中存放了集装箱的信息,一个集装箱一条记录,表B中存放了对于集装 ...
- JWT Claims
JWT Claims “iss” (issuer) 发行人 “sub” (subject) 主题 “aud” (audience) 接收方 用户 “exp” (expiration time) 到 ...
- Oracle的存储的三大物理文件
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 一. ...
- 解决 screen 连接不上,提示“There is no screen to be resumed matching 18352.” 的问题
当你挂起screen,下次想重新连上screen时,有时会出现screen session的状态为Attached但是却连不上的情况,比如我想重新进入session id 为18352的screen, ...
- [转] Filezilla server设置指南及中文乱码、登录欢迎语问题解决
一.filezilla server 安装指南:FileZilla是一款免费而且开源的FTP工具.包括FileZilla Client,FileZilla Server两个版本.FileZilla S ...