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中的ConfigParser模块使用详解
May 04 Python
python采用django框架实现支付宝即时到帐接口
May 17 Python
全面了解Python环境配置及项目建立
Jun 30 Python
Python urls.py的三种配置写法实例详解
Apr 28 Python
Python基于回溯法子集树模板实现8皇后问题
Sep 01 Python
Windows下安装Scrapy
Oct 17 Python
浅析python中while循环和for循环
Nov 19 Python
Django Form and ModelForm的区别与使用
Dec 06 Python
Python3 assert断言实现原理解析
Mar 02 Python
matplotlib 画双轴子图无法显示x轴的解决方法
Jul 27 Python
Scrapy基于scrapy_redis实现分布式爬虫部署的示例
Sep 29 Python
Python词云的正确实现方法实例
May 08 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
FleaPHP的安全设置方法
2008/09/15 PHP
PHP中数组的分组排序实例
2014/06/01 PHP
PHP和javascript常用正则表达式及用法实例
2014/07/01 PHP
PHP实现Session入库/存入redis的方法
2017/05/04 PHP
php微信开发之关键词回复功能
2018/06/13 PHP
JS 无法通过W3C验证的处理方法
2010/03/09 Javascript
js getElementsByTagName的简写方式
2010/06/27 Javascript
JavaScript自定义事件介绍
2013/08/29 Javascript
JS判断变量是否为空判断是否null
2014/07/25 Javascript
Node.js中使用Buffer编码、解码二进制数据详解
2014/08/16 Javascript
node.js中的http.response.writeHead方法使用说明
2014/12/14 Javascript
深入浅析JS是按值传递还是按引用传递(推荐)
2016/09/18 Javascript
JS中parseInt()和map()用法分析
2016/12/16 Javascript
原生js实现吸顶效果
2017/03/13 Javascript
AngularJS实现进度条功能示例
2017/07/05 Javascript
php 解压zip压缩包内容到指定目录的实例
2018/01/23 Javascript
vue-cli 打包使用history模式的后端配置实例
2018/09/20 Javascript
AngularJS实现的鼠标拖动画矩形框示例【可兼容IE8】
2019/05/17 Javascript
Vue 页面权限控制和登陆验证功能的实例代码
2019/06/20 Javascript
使用webpack/gulp构建TypeScript项目的方法示例
2019/12/18 Javascript
node.js 微信开发之定时获取access_token
2020/02/07 Javascript
JS数据类型判断的几种常用方法
2020/07/07 Javascript
windows10 pycharm下安装pyltp库和加载模型实现语义角色标注的示例代码
2020/05/07 Python
python中关于数据类型的学习笔记
2020/07/19 Python
css3弹性盒模型实例介绍
2013/05/27 HTML / CSS
详解使用canvas保存网页为pdf文件支持跨域
2018/11/23 HTML / CSS
兼职学生的自我评价
2013/11/24 职场文书
高中毕业的自我鉴定
2013/12/09 职场文书
在校大学生的职业生涯规划书
2014/03/14 职场文书
事业单位考核材料
2014/05/21 职场文书
元旦趣味活动方案
2014/08/22 职场文书
2015年建筑工作总结报告
2015/05/04 职场文书
行政处罚告知书
2015/07/01 职场文书
2016年七夕爱情寄语
2015/12/04 职场文书
Nginx中使用Lua脚本与图片的缩略图处理的实现
2022/03/18 Servers
电脑只能进入安全模式无法正常启动的解决办法
2022/04/08 数码科技