侯体宗的博客
  • 首页
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

python实现微信小程序用户登录、模板推送

Python  /  管理员 发布于 7年前   302

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_enginefrom 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.tablesclass 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 jsonimport requestsfrom redis import StrictRedisfrom tornado.web import RequestHandlerredis = 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 lambda表达式在sort函数中的使用详解
    下一条:
    使用Python脚本zabbix自定义key监控oracle连接状态
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在go语言中实现字符串可逆性压缩及解压缩功能(0个评论)
    • 使用go + gin + jwt + qrcode实现网站生成登录二维码在app中扫码登录功能(0个评论)
    • 在windows10中升级go版本至1.24后LiteIDE的Ctrl+左击无法跳转问题解决方案(0个评论)
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客