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实现sublime3的less编译插件示例
Apr 27 Python
Python多线程编程(五):死锁的形成
Apr 05 Python
python基于pyDes库实现des加密的方法
Apr 29 Python
python微信跳一跳系列之色块轮廓定位棋盘
Feb 26 Python
Python实现去除图片中指定颜色的像素功能示例
Apr 13 Python
Django缓存系统实现过程解析
Aug 02 Python
Python队列RabbitMQ 使用方法实例记录
Aug 05 Python
Django文件上传与下载(FileFlid)
Oct 06 Python
python xlsxwriter模块的使用
Dec 24 Python
Python中json.dumps()函数的使用解析
May 17 Python
Python数据可视化之Seaborn的安装及使用
Apr 19 Python
Python实现仓库管理系统
May 30 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下实现一个阿拉伯数字转中文数字的函数
2008/07/10 PHP
yii2.0整合阿里云oss删除单个文件的方法
2017/09/19 PHP
jQuery数据显示插件整合实现代码
2011/10/24 Javascript
javascript学习笔记(十四) window对象使用介绍
2012/06/20 Javascript
Jquery写一个鼠标拖动效果实现原理与代码
2012/12/24 Javascript
JS中Iframe之间传值及子页面与父页面应用
2013/03/11 Javascript
javaScript中两个等于号和三个等于号之间的区别介绍
2014/06/27 Javascript
简单谈谈jQuery(function(){})与(function(){})(jQuery)
2014/12/19 Javascript
jQuery老黄历完整实现方法
2015/01/16 Javascript
jQuery实现的数值范围range2dslider选取插件特效多款代码分享
2015/08/27 Javascript
AngularJS中的指令全面解析(必看)
2016/05/20 Javascript
json格式的javascript对象用法分析
2016/07/04 Javascript
jquery实现图片列表鼠标移入微动
2016/12/01 Javascript
微信小程序实战之仿android fragment可滑动底部导航栏(4)
2020/04/16 Javascript
JS+canvas动态绘制饼图的方法示例
2017/09/12 Javascript
ng-zorro-antd 入门初体验
2018/12/03 Javascript
vue项目打包后上传至GitHub并实现github-pages的预览
2019/05/06 Javascript
vue实现按需加载组件及异步组件功能
2019/05/27 Javascript
简单谈谈javascript高级特性
2019/09/04 Javascript
layui 数据表格复选框实现单选功能的例子
2019/09/19 Javascript
微信小程序实现3D轮播图效果(非swiper组件)
2019/09/21 Javascript
原生js实现文件上传、下载、封装等实例方法
2020/01/05 Javascript
[01:56]生活中的妖精之七夕特别档
2016/08/09 DOTA
[01:03:33]Alliance vs TNC 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
python中join()方法介绍
2018/10/11 Python
详解Python3网络爬虫(二):利用urllib.urlopen向有道翻译发送数据获得翻译结果
2019/05/07 Python
python2和python3在处理字符串上的区别详解
2019/05/29 Python
Python装饰器实现方法及应用场景详解
2020/03/26 Python
Python下载网易云歌单歌曲的示例代码
2020/08/12 Python
python开发入门——列表生成式
2020/09/03 Python
最新党员思想汇报
2014/01/01 职场文书
艺术学院毕业生自我评价
2014/03/02 职场文书
销售职业生涯规划范文
2014/03/14 职场文书
地道战观后感400字
2015/06/04 职场文书
导游词之蓬莱长岛
2019/12/17 职场文书
python opencv人脸识别考勤系统的完整源码
2021/04/26 Python