python实现微信小程序用户登录、模板推送
作者:刘东灵 发布时间:2021-10-15 23:25:17
标签:python,微信小程序,登录,模板推送
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_resutl = 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.存储用户信息, 以备后用, ORM使用 SQLAlchemy
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
# mysql 相关设置
engine = create_engine('mysql://root:pwd@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;
Template: 通过代码发送微信模板消息
import json
import requests
from redis import StrictRedis
from tornado.web import RequestHandler
redis = StrictRedis.from_url('redis//localhost:6379')
def get_access_token():
payload = {
'grant_type': 'client_credential',
'appid': 'appid',
'secret': 'secret'
}
req = requests.get('https://api.weixin.qq.com/cgi-bin/token', params=payload, timeout=3, verify=False)
access_token = req.json().get('access_token')
redis.set('ACCESS_TOKEN', access_token)
class FormHandler(RequestHandler):
def post(self):
req_data = self.request.body
req_data = json.loads(req_data)
form_id = req_data.get('from_id')
remplate_push(form_id) # 使用消息进行模板推送
def template_push(form_id):
data = {
"touser": 'open_id',
"template_id": 'template_id',
"page": 'pages/index/index',
"form_id": form_id,
"data":{
"keyword1":{
"value": "value"
}
}
"emphasis_keyword": ''
}
access_token = redis.get('ACCESS_TOKEN')
push_url = 'https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token={}'.format(access_token)
requests.post(push_url, json=data, timeout=3, verify=False)
来源:https://blog.csdn.net/qq_41637554/article/details/86614413
0
投稿
猜你喜欢
- 最近在接触一个Django项目,使用的是fbv( function-base views )模式,看起来特别不舒服,项目中有一个模型类117
- 之前的文章讲过用Tensorflow的object detection api训练MobileNetV2-SSDLite,然后发现训练的时候
- 最近在改一个嵌入在frame中的页面的时候,使用了jquery做效果,而页面本身也绑定了onload事件。改完后,Firefox下测试正常流
- 例题:假设你获取了250部电影的时长(列表a中),希望统计出这些电影时长的分布状态(比如时长为100分钟到120分钟电影的数量,出现的频率)
- 一、Python 切片的一些用法alist = [3,4,5,6,7,9,11,13,15,17]print(alist[::]) # 返回
- python使用函数改变list函数内改变外部的一个list如果这么写def rotate(nums, k): l
- TF-IDFTF-IDF(Term Frequencey-Inverse Document Frequency)指词频-逆文档频率,它属于数
- 这里列出了13种实现图片或网页内容 lightbox 效果的方法,大部分是链接到各种lightbox作者的英文页面,里面都有源代码下载。Th
- 实现CBOW模型类初始化:初始化方法的参数包括词汇个数 vocab_size 和中间层的神经元个数 hidden_size。首先生成两个权重
- 例子一:Python用WMI模块获取windowns系统的硬件信息:硬盘分区、使用情况,内存大小,CPU型号,当前运行的进程,自启动程序及位
- 颜色的变化跟人类的智慧一样,是无穷的,每个阶段都会有流行的色彩,有属于一个时代的颜色!WEB2.0是一个概念,它宣扬,定位了一些东西,以用户
- lambda/filter/map/reduce这几个函数面试中很肯定会用到,本篇主要介绍这几个函数的用法。1 lambda匿名函数,用法如
- 在SQL Server数据库中,主要是通过角色来继承相关的权限。但是,这个权限继承很容易造成权限上的冲突。如现在有个销售员账户SALE1,有
- 这将为我们的团队节省每天重复的数据处理时间......简介如果你目前在一个数据或商业智能团队工作,你的任务之一可能是制作一些每日、每周或每月
- 1. 数据抽取的概念2. 数据的分类3. JSON数据概述及解析3.1 JSON数据格式3.2 解析库jsonjson模块是Python内置
- 鸭子类型基本定义首先Python不支持多态,也不用支持多态,python是一种多态语言,崇尚鸭子类型。以下是 * 中对鸭子类型得论述:在程
- 使用场景我有两个GPU卡。我希望我两个GPU能并行运行两个网络模型。代码错误代码1:#对于0号GPUos.environ['CUDA
- 本文用python写了一个会员管理系统,供大家参考,具体内容如下:"""后台管理员前台会员信息系统1.后台管理
- hasOwnPropertyhasOwnProperty是javascript中用于检测对象是否包含某个属性的方法,返回一个布尔值。var
- 昨天面试上来就是一个算法,平时基本的算法还行,结果变个法就不会了。。。感觉应该刷一波Leecode冷静下。。。今天抽空看下。题目就是要求O(