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)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 【雨果唱片】中国管弦乐《鹿回头》WAV
- APM亚流新世代《一起冒险》[FLAC/分轨][106.77MB]
- 崔健《飞狗》律冻文化[WAV+CUE][1.1G]
- 罗志祥《舞状元 (Explicit)》[320K/MP3][66.77MB]
- 尤雅.1997-幽雅精粹2CD【南方】【WAV+CUE】
- 张惠妹.2007-STAR(引进版)【EMI百代】【WAV+CUE】
- 群星.2008-LOVE情歌集VOL.8【正东】【WAV+CUE】
- 罗志祥《舞状元 (Explicit)》[FLAC/分轨][360.76MB]
- Tank《我不伟大,至少我能改变我。》[320K/MP3][160.41MB]
- Tank《我不伟大,至少我能改变我。》[FLAC/分轨][236.89MB]
- CD圣经推荐-夏韶声《谙2》SACD-ISO
- 钟镇涛-《百分百钟镇涛》首批限量版SACD-ISO
- 群星《继续微笑致敬许冠杰》[低速原抓WAV+CUE]
- 潘秀琼.2003-国语难忘金曲珍藏集【皇星全音】【WAV+CUE】
- 林东松.1997-2039玫瑰事件【宝丽金】【WAV+CUE】