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进行验证码识别的一些想法
Jan 25 Python
简介Python设计模式中的代理模式与模板方法模式编程
Feb 02 Python
python查询mysql,返回json的实例
Mar 26 Python
python3模块smtplib实现发送邮件功能
May 22 Python
matplotlib savefig 保存图片大小的实例
May 24 Python
Python爬虫运用正则表达式的方法和优缺点
Aug 25 Python
python实现七段数码管和倒计时效果
Nov 23 Python
Python+OpenCV+图片旋转并用原底色填充新四角的例子
Dec 12 Python
使用pytorch搭建AlexNet操作(微调预训练模型及手动搭建)
Jan 18 Python
什么是Python包的循环导入
Sep 08 Python
python快速安装OpenCV的步骤记录
Feb 22 Python
详解Go语言运用广度优先搜索走迷宫
Jun 23 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带密码功能并下载远程文件保存本地指定目录 修改加强版
2010/05/16 PHP
PHP Cookei记录用户历史浏览信息的代码
2016/02/03 PHP
将PHP程序中返回的JSON格式数据用gzip压缩输出的方法
2016/03/03 PHP
php实现搜索类封装示例
2016/03/31 PHP
根据key删除数组中指定的元素实现方法
2017/03/02 PHP
使用PHP开发留言板功能
2019/11/19 PHP
PHP设计模式概论【概念、分类、原则等】
2020/05/01 PHP
Javascript倒计时代码
2010/08/12 Javascript
jQuery中校验时间格式的正则表达式小结
2013/09/22 Javascript
解决js下referer兼容各大浏览器的方法
2014/11/03 Javascript
javascript滚轮控制模拟滚动条
2016/10/19 Javascript
JS实现复制功能
2017/03/01 Javascript
jQuery上传多张图片带进度条样式(DEMO)
2017/03/02 Javascript
Jquery-data的三种用法
2017/04/18 jQuery
JS实现简易的图片拖拽排序实例代码
2017/06/09 Javascript
JavaScript设计模式之工厂模式简单实例教程
2018/07/03 Javascript
Vuex 单状态库与多模块状态库详解
2018/12/11 Javascript
JavaScript 反射和属性赋值实例解析
2019/10/28 Javascript
js属性对象的hasOwnProperty方法的使用
2021/02/05 Javascript
Python中if __name__ == "__main__"详细解释
2014/10/21 Python
人工智能最火编程语言 Python大战Java!
2017/11/13 Python
Python实现的桶排序算法示例
2017/11/29 Python
python如何实现单链表的反转
2020/02/10 Python
python中pandas库中DataFrame对行和列的操作使用方法示例
2020/06/14 Python
python3中for循环踩过的坑记录
2020/12/14 Python
Python+Opencv实现把图片、视频互转的示例
2020/12/17 Python
美国在线面料商店:Fashion Fabrics Club
2020/01/31 全球购物
小米官方旗舰店:Xiaomi
2020/08/07 全球购物
机关领导干部作风整顿整改措施
2014/09/19 职场文书
免职通知
2015/04/23 职场文书
学雷锋感言
2015/08/03 职场文书
会计继续教育培训心得体会
2016/01/19 职场文书
英语版自我评价,35句话轻松搞定
2019/10/08 职场文书
修改MySQL的数据库引擎为INNODB的方法
2021/05/26 MySQL
基于MySql验证的vsftpd虚拟用户
2021/11/07 MySQL
ubuntu20.04虚拟机无法上网的问题及解决
2022/12/24 Servers