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使用mailbox打印电子邮件的方法
Apr 30 Python
Python学习教程之常用的内置函数大全
Jul 14 Python
Python开发中爬虫使用代理proxy抓取网页的方法示例
Sep 26 Python
10个Python小技巧你值得拥有
Sep 29 Python
为什么str(float)在Python 3中比Python 2返回更多的数字
Oct 16 Python
Python facenet进行人脸识别测试过程解析
Aug 16 Python
postman传递当前时间戳实例详解
Sep 14 Python
python os.path.isfile()因参数问题判断错误的解决
Nov 29 Python
Pandas时间序列:时期(period)及其算术运算详解
Feb 25 Python
python3通过qq邮箱发送邮件以及附件
May 20 Python
Django rest framework分页接口实现原理解析
Aug 21 Python
用python对excel查重
Dec 07 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
上海永华YH-R296(华普R-96)12波段立体声收音机的分析和打理
2021/03/02 无线电
使用PHP实现密保卡功能实现代码<打包下载直接运行>
2011/10/09 PHP
Zend Studio去除编辑器的语法警告设置方法
2012/10/24 PHP
php递归遍历删除文件的方法
2015/04/17 PHP
PHP Socket网络操作类定义与用法示例
2017/08/30 PHP
IE与Firefox在JavaScript上的7个不同写法小结
2009/09/14 Javascript
简略的前端架构心得&&基于editor为例子的编码小技巧
2010/11/25 Javascript
动态加载外部javascript文件的函数代码分享
2011/07/28 Javascript
50款非常棒的 jQuery 插件分享
2012/03/29 Javascript
查找页面中所有类为test的结点的方法
2014/03/28 Javascript
JavaScript实现自动变换表格边框颜色
2015/05/08 Javascript
js判断手机访问或者PC的几个例子(常用于手机跳转)
2015/12/15 Javascript
前端实现文件的断点续传(前端文件提交+后端PHP文件接收)
2016/11/04 Javascript
React创建组件的三种方式及其区别
2017/01/12 Javascript
详解如何在Vue里建立长按指令
2018/08/20 Javascript
原生JS实现动态添加新元素、删除元素方法
2019/05/05 Javascript
python里对list中的整数求平均并排序
2014/09/12 Python
用Python代码来绘制彭罗斯点阵的教程
2015/04/03 Python
python2.6.6如何升级到python2.7.14
2018/04/08 Python
解决PyCharm的Python.exe已经停止工作的问题
2018/11/29 Python
Python3之字节串bytes与字节数组bytearray的使用详解
2019/08/27 Python
解决django FileFIELD的编码问题
2020/03/30 Python
python编程的核心知识点总结
2021/02/08 Python
html5 worker 实例(一) 为什么测试不到效果
2013/06/24 HTML / CSS
可爱的童装和鞋子:Fabkids
2019/08/16 全球购物
Tea Collection官网:一家位于旧金山的童装公司
2020/08/07 全球购物
Can a struct inherit from another struct? (结构体能继承结构体吗)
2016/09/25 面试题
某/etc/fstab文件中的某行如下: /dev/had5 /mnt/dosdata msdos defaults,usrquota 1 2 请解释其含义
2013/04/11 面试题
园林施工员岗位职责
2013/12/11 职场文书
小学毕业寄语大全
2014/04/03 职场文书
经济信息系毕业生自荐信
2014/06/02 职场文书
欢迎家长标语
2014/10/08 职场文书
二审代理词范文
2015/05/25 职场文书
《黄山奇石》教学反思
2016/02/18 职场文书
创业计划书之奶茶店开店方案范本!
2019/08/06 职场文书
Spring JPA 增加字段执行异常问题及解决
2022/06/10 Java/Android