python登录微信小程序_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)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值