python实现微信小程序用户登录、模板推送
Python实现微信小程序的用户登录
小程序可以通过官方提供的登录邓丽来获取用户身份的标示,具体文档可以参考官方文档,通过流程时序可以看到,对于需要和前端配合的服务端开发,主要实现的就是通过小程序提供的code换取用户的openid和session_key,并用换取到的openid和secret_key作为自定义的登录态.分析后得知,作为小程序后端的开发,主要实现以下几部分内容:
- 提供一个HTTP接口,供小程序方使用,传递code;
- 换取用户身份标识;
- 维护一个自定义的登录态;
- 需要存储用户的openid,以备后续使用.
1.提供给小程序一个HTTP接口,接口而使用Tornado框架
简化阐述,代码没有做异常处理
classLoginHandler(RequestHandler):
defpost(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包请求微信的相关接口,获取数据
defget_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)
returnreq_result.json()
3.维护一个自定义的登录态,使用Redis
user_redis=StrictRedis.from_url('redis//localhost:6379')
classUser(object):
REDIS_EXPIRES=7*24*60*60
@classmethod
defsave_user_session(cls,user_uuid,openid,session_key):
user_session_value={
'openid':openid,
'session_key':session_key
}
user_session_key='US:'+user_uuid
withuser_redis.pipeline(transaction=False)aspipe:
pipe.hmset(user_session_key,user_session_value)
pipe.expire(user_session_key,cls.REDIS_EXPIRES)
pipe.execute()
4.存储用户信息,以备后用,ORM使用SQLAlchemy
fromsqlalchemyimportcreate_engine
fromsqlalchemy.ext.declarativeimportdeclarative_base
#mysql相关设置
engine=create_engine('mysql://root:pwd@localhost/wechat')
conn=engine.connect()
Base=declarative_base()
Base.metadata.reflect(engine)
tables=Base.metadata.tables
classUser(object):
table=tables['user']
@classmethod
defsave_user_info(cls,open_id):
#存储用户信心
sql=cls.table.insert().values(open_id=open_id)
conn.execute(sql)
SQL语句
CREATETABLE`user`( `id`int(20)unsignedNOTNULLAUTO_INCREMENT, `open_id`varchar(32)NOTNULLCOMMENT'用户open_id', `created_at`timestampNULLDEFAULTCURRENT_TIMESTAMPCOMMENT'创建时间', `updated_at`timestampNULLDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMPCOMMENT'更新时间', PRIMARYKEY(`id`), KEY`idx_oid`(`open_id`) )ENGINE=InnoDBdefaultCHARSET=utf8mb4;
Template:通过代码发送微信模板消息
importjson
importrequests
fromredisimportStrictRedis
fromtornado.webimportRequestHandler
redis=StrictRedis.from_url('redis//localhost:6379')
defget_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)
classFormHandler(RequestHandler):
defpost(self):
req_data=self.request.body
req_data=json.loads(req_data)
form_id=req_data.get('from_id')
remplate_push(form_id)#使用消息进行模板推送
deftemplate_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)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。