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中实现指定时间调用函数示例代码
Sep 08 Python
Python cookbook(数据结构与算法)对切片命名清除索引的方法
Mar 13 Python
python 筛选数据集中列中value长度大于20的数据集方法
Jun 14 Python
python 获取键盘输入,同时有超时的功能示例
Nov 13 Python
Python判断变量名是否合法的方法示例
Jan 28 Python
python支持多线程的爬虫实例
Dec 21 Python
python利用百度云接口实现车牌识别的示例
Feb 21 Python
浅谈keras中的batch_dot,dot方法和TensorFlow的matmul
Jun 18 Python
python 将列表里的字典元素合并为一个字典实例
Sep 01 Python
Python并发爬虫常用实现方法解析
Nov 19 Python
python 删除系统中的文件(按时间,大小,扩展名)
Nov 19 Python
解决PDF 转图片时丢文字的一种可能方式
Mar 04 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类的反射用法实例
2014/11/03 PHP
php实现源代码加密的方法
2015/07/11 PHP
php session实现多级目录存放实现代码
2016/02/03 PHP
php中使用GD库做验证码
2016/03/31 PHP
php查询操作实现投票功能
2016/05/09 PHP
php从数据库读取数据,并以json格式返回数据的方法
2018/08/21 PHP
jQuery中find()方法用法实例
2015/01/07 Javascript
开启Javascript中apply、call、bind的用法之旅模式
2015/10/28 Javascript
关于vue中的ajax请求和axios包问题
2018/04/19 Javascript
vue实现文件上传功能
2018/08/13 Javascript
微信小程序时间轴实现方法示例
2019/01/14 Javascript
bootstrap-treeview实现多级树形菜单 后台JSON格式如何组织?
2019/07/26 Javascript
利用webpack理解CommonJS和ES Modules的差异区别
2020/06/16 Javascript
在vue-cli3中使用axios获取本地json操作
2020/07/30 Javascript
JQuery使用数组遍历跳出each循环
2020/09/01 jQuery
跟老齐学Python之list和str比较
2014/09/20 Python
跟老齐学Python之编写类之三子类
2014/10/11 Python
python读取json文件并将数据插入到mongodb的方法
2015/03/23 Python
详尽讲述用Python的Django框架测试驱动开发的教程
2015/04/22 Python
Python实现简单的文件传输与MySQL备份的脚本分享
2016/01/03 Python
解读python logging模块的使用方法
2018/04/17 Python
python  创建一个保留重复值的列表的补码
2018/10/15 Python
Python语法垃圾回收机制原理解析
2020/03/25 Python
Django使用rest_framework写出API
2020/05/21 Python
python爬虫爬取网页数据并解析数据
2020/09/18 Python
CSS3中使用RGBa来调节透明度的教程
2016/05/09 HTML / CSS
html2canvas生成清晰的图片实现打印的示例代码
2019/09/30 HTML / CSS
新秀丽官方旗舰店:Samsonite拉杆箱、双肩包、皮具
2018/03/05 全球购物
英国大码女性时装零售商:Evans
2018/08/29 全球购物
消防安全责任书
2014/04/14 职场文书
2014年财务工作总结范文
2014/11/11 职场文书
2016同学毕业寄语大全
2015/12/04 职场文书
2016抗战胜利71周年红领巾广播稿
2015/12/18 职场文书
聊聊Lombok中的@Builder注解使用教程
2021/11/17 Java/Android
vue-cli3.0修改打包后的文件名和文件地址,打包后本地运行报错解决
2022/04/06 Vue.js
Python安装及建立虚拟环境的完整步骤
2022/06/25 Servers