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函数式编程指南(四):生成器详解
Jun 24 Python
Python 批量合并多个txt文件的实例讲解
May 08 Python
spark: RDD与DataFrame之间的相互转换方法
Jun 07 Python
Python实现输入二叉树的先序和中序遍历,再输出后序遍历操作示例
Jul 27 Python
详解Python sys.argv使用方法
May 10 Python
python实现猜拳小游戏
Apr 05 Python
python实现文件批量编码转换及注意事项
Oct 14 Python
python nohup 实现远程运行不宕机操作
Apr 16 Python
python属于哪种语言
Aug 16 Python
详解Pycharm与anaconda安装配置指南
Aug 25 Python
Python 利用flask搭建一个共享服务器的步骤
Dec 05 Python
python pandas 解析(读取、写入)CSV 文件的操作方法
Dec 24 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
win7 wamp 64位 php环境开启curl服务遇到的问题及解决方法
2018/09/16 PHP
location.search在客户端获取Url参数的方法
2010/06/08 Javascript
向当前style sheet中插入一个新的style实现方法
2013/04/01 Javascript
js去字符串前后空格5种实现方法及比较
2013/04/03 Javascript
jQuery实现返回顶部效果的方法
2015/05/29 Javascript
基于jquery实现智能提示控件intellSeach.js
2016/03/17 Javascript
JS判断元素是否在数组内的实现代码
2016/03/30 Javascript
AngularJS ng-app 指令实例详解
2016/07/30 Javascript
Vue.js实现一个自定义分页组件vue-paginaiton
2016/09/05 Javascript
详解nodejs微信公众号开发——6.自定义菜单
2017/04/13 NodeJs
js绑定事件和解绑事件
2017/04/27 Javascript
jQuery简单绑定单个事件的方法示例
2017/06/10 jQuery
Vue 2.0在IE11中打开项目页面空白的问题解决
2017/07/16 Javascript
jQuery选择器中的特殊符号处理方法
2017/09/08 jQuery
jquery多级树形下拉菜单的实例代码
2019/07/09 jQuery
简单介绍Python中的readline()方法的使用
2015/05/24 Python
Python字符串处理实例详解
2017/05/18 Python
Python DataFrame设置/更改列表字段/元素类型的方法
2018/06/09 Python
python爬虫 execjs安装配置及使用
2019/07/30 Python
Python 模拟生成动态产生验证码图片的方法
2020/02/01 Python
python 命名规范知识点汇总
2020/02/14 Python
Python Tkinter Entry和Text的添加与使用详解
2020/03/04 Python
python tkinter GUI绘制,以及点击更新显示图片代码
2020/03/14 Python
python实现批量修改文件名
2020/03/23 Python
Python如何telnet到网络设备
2021/02/18 Python
从Pytorch模型pth文件中读取参数成numpy矩阵的操作
2021/03/04 Python
HTML5 Canvas 实现圆形进度条并显示数字百分比效果示例
2017/08/18 HTML / CSS
公司财务自我评价分享
2013/12/17 职场文书
农业局学习党的群众路线教育实践活动心得体会
2014/03/07 职场文书
家电业务员岗位职责
2014/03/10 职场文书
领导干部作风建设剖析材料
2014/10/11 职场文书
实习科室评语
2015/01/04 职场文书
一年级数学下册复习计划
2015/01/17 职场文书
担保贷款承诺书
2015/04/30 职场文书
《秋思》教学反思
2016/02/23 职场文书
Window server中安装Redis的超详细教程
2021/11/17 Redis