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)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。