python实现微信小程序用户登录、模板推送


Posted in Python onAugust 28, 2019

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)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
实例讲解Python编程中@property装饰器的用法
Jun 20 Python
Python基于sftp及rsa密匙实现远程拷贝文件的方法
Sep 21 Python
Golang与python线程详解及简单实例
Apr 27 Python
Python列表list排列组合操作示例
Dec 18 Python
PyQt5+requests实现车票查询工具
Jan 21 Python
解决python测试opencv时imread导致的错误问题
Jan 26 Python
Python面向对象程序设计中类的定义、实例化、封装及私有变量/方法详解
Feb 28 Python
如何使用python把ppt转换成pdf
Jun 29 Python
Django上使用数据可视化利器Bokeh解析
Jul 31 Python
django 环境变量配置过程详解
Aug 06 Python
Python高级property属性用法实例分析
Nov 19 Python
给keras层命名,并提取中间层输出值,保存到文档的实例
May 23 Python
使用Python脚本zabbix自定义key监控oracle连接状态
Aug 28 #Python
django删除表重建的实现方法
Aug 28 #Python
Python Django 前后端分离 API的方法
Aug 28 #Python
django重新生成数据库中的某张表方法
Aug 28 #Python
PyQt5+Caffe+Opencv搭建人脸识别登录界面
Aug 28 #Python
关于Python核心框架tornado的异步协程的2种方法详解
Aug 28 #Python
python使用celery实现异步任务执行的例子
Aug 28 #Python
You might like
php与java通过socket通信的实现代码
2013/10/21 PHP
简单实现PHP留言板功能
2016/12/21 PHP
js 获取后台的字段 改变 checkbox的被选中的状态 代码
2013/06/05 Javascript
js跳转页面方法总结
2014/01/29 Javascript
JavaScript中数组成员的添加、删除介绍
2014/12/30 Javascript
javascript原始值和对象引用实例分析
2015/04/25 Javascript
JS实现响应鼠标点击动画渐变弹出层效果代码
2016/03/25 Javascript
AngularJS 依赖注入详解及示例代码
2016/08/17 Javascript
BootStrapTable服务器分页实例解析
2016/12/20 Javascript
用JavaScript实现让浏览器停止载入页面的方法
2017/01/19 Javascript
详解webpack es6 to es5支持配置
2017/05/04 Javascript
原生JS实现自定义滚动条效果
2020/10/27 Javascript
在Vue中使用echarts的方法
2018/02/05 Javascript
微信小程序如何实现在线客服功能
2019/10/16 Javascript
详细分析Node.js 模块系统
2020/06/28 Javascript
python检测空间储存剩余大小和指定文件夹内存占用的实例
2018/06/11 Python
Python多线程应用于自动化测试操作示例
2018/12/06 Python
用Python编写一个高效的端口扫描器的方法
2018/12/20 Python
python图形开发GUI库wxpython使用方法详解
2020/02/14 Python
Python greenlet和gevent使用代码示例解析
2020/04/01 Python
详解HTML5新增标签
2017/11/27 HTML / CSS
仿酷狗html5手机音乐播放器主要部分代码
2013/05/15 HTML / CSS
使用canvas实现黑客帝国数字雨效果
2020/01/02 HTML / CSS
高级3D打印市场:Gambody
2019/12/26 全球购物
瑞典最大的儿童用品网上商店:pinkorblue.se
2021/03/09 全球购物
优秀社区干部事迹材料
2014/02/03 职场文书
幼儿园教师自我鉴定
2014/03/20 职场文书
经典演讲稿汇总
2014/05/19 职场文书
党的群众路线对照检查材料
2014/09/22 职场文书
2014年个人委托书范本
2014/10/13 职场文书
质监局领导班子践行群众路线整改方案
2014/10/26 职场文书
学校运动会通讯稿
2015/07/18 职场文书
z-index不起作用
2021/03/31 HTML / CSS
解读Vue组件注册方式
2021/05/15 Vue.js
vue ant design 封装弹窗表单的使用
2022/06/01 Vue.js
Windows server 2012 NTP时间同步的实现
2022/06/25 Servers