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用于url解码和中文解析的小脚本(python url decoder)
Aug 11 Python
python读写二进制文件的方法
May 09 Python
python统计日志ip访问数的方法
Jul 06 Python
python爬虫入门教程--正则表达式完全指南(五)
May 25 Python
python实现类之间的方法互相调用
Apr 29 Python
利用Python如何生成便签图片详解
Jul 09 Python
解决Python安装时报缺少DLL问题【两种解决方法】
Jul 15 Python
python numpy 反转 reverse示例
Dec 04 Python
python动态文本进度条的实例代码
Jan 22 Python
利用Python优雅的登录校园网
Oct 21 Python
pytorch学习教程之自定义数据集
Nov 10 Python
Pytest之测试命名规则的使用
Apr 16 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
VFP与其他应用程序的集成
2006/10/09 PHP
PHP_MySQL教程-第一天
2007/03/18 PHP
PHP 变量定义和变量替换的方法
2009/07/30 PHP
一个PHP针对数字的加密解密类
2014/03/20 PHP
php Imagick获取图片RGB颜色值
2014/07/28 PHP
解决php-fpm.service not found问题的办法
2017/06/06 PHP
PHP排序二叉树基本功能实现方法示例
2018/05/26 PHP
PHP命名空间定义与用法实例分析
2019/08/14 PHP
js下用gb2312编码解码实现方法
2009/12/31 Javascript
在JavaScript中监听IME键盘输入事件
2011/05/29 Javascript
中国地区三级联动下拉菜单效果分析
2012/11/15 Javascript
Node.js 制作实时多人游戏框架
2015/01/08 Javascript
JavaScript函数的一些注意要点小结及js匿名函数
2015/11/10 Javascript
详解Matlab中 sort 函数用法
2016/03/20 Javascript
AngularJS通过$http和服务器通信详解
2016/09/21 Javascript
Bootstrap导航条鼠标悬停下拉菜单
2017/01/04 Javascript
JQuery EasyUI的一些常用组件
2017/07/12 jQuery
JS中跳出循环的示例代码
2017/09/14 Javascript
旺旺在线客服代码 旺旺客服代码生成器
2018/01/09 Javascript
JS实现的3des+base64加密解密算法完整示例
2018/05/18 Javascript
vue通过点击事件读取音频文件的方法
2018/05/30 Javascript
解决vue attr取不到属性值的问题
2018/09/18 Javascript
如何在JavaScript中谨慎使用代码注释
2019/06/21 Javascript
JS中封装axios来管控api的2种方式
2019/09/11 Javascript
微信小程序实现watch监听
2020/06/04 Javascript
Python松散正则表达式用法分析
2016/04/29 Python
Python字符串内置函数功能与用法总结
2019/04/16 Python
python 通过可变参数计算n个数的乘积方法
2019/06/13 Python
Python进程间通信 multiProcessing Queue队列实现详解
2019/09/23 Python
django列表筛选功能的实现代码
2020/03/27 Python
理肤泉美国官网:La Roche-Posay
2018/01/17 全球购物
如何高效率的查找一个月以内的数据
2012/04/15 面试题
业务员的岗位职责
2014/03/15 职场文书
法律进社区实施方案
2014/03/21 职场文书
幼儿园六一活动总结
2014/08/27 职场文书
医药公司采购员岗位职责
2014/09/12 职场文书