中国机械加工网19易0下6拉en,seo在线外链,360免费网站建设,wordpress 接入外网就快小程序可以通过官方提供的登录能力来获取用户身份的标示#xff0c;具体文档可以参考 这里#xff0c;通过流程时序可以看到#xff0c;对于需要和前端配合的服务端开发#xff0c;主要实现的就是通过小程序提供的 code 换取用户的 openid 和 session_key#xff0c;并用换… 小程序可以通过官方提供的登录能力来获取用户身份的标示具体文档可以参考 这里通过流程时序可以看到对于需要和前端配合的服务端开发主要实现的就是通过小程序提供的 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_codejs_code)openid user_info[openid]session_key user_info[session_key]user_uuid str(uuid.uuid4()) # 暴露给小程序端的用户标示# 用来维护用户的登录态User.save_user_session(user_uuiduser_uuid,openidopenid,session_keysession_key)# 微信小程序不能设置cookie把用户信息存在了 headers 中self.set_header(Authorization, user_uuid)# 存储用户信息User.save_user_info(open_idopenid)self.set_status(204) 2. 换取用户身份标示直接使用 Requests 请求微信的相关接口获取数据 1 def get_user_info(js_code):2 3 req_params {4 appid: app_id, # 小程序的 ID5 secret: secret, # 小程序的 secret6 js_code: js_code,7 grant_type: authorization_code8 }9 req_result requests.get(https://api.weixin.qq.com/sns/jscode2session,
10 paramsreq_params, timeout3, verifyFalse)
11 return req_result.json() 3. 维护一个自定义的登录态使用了 Redis 1 user_redis StrictRedis.from_url(redis//localhost:6379)2 3 4 class User(object):5 6 REDIS_EXPIRES 7 * 24 * 60 * 607 8 classmethod9 def save_user_session(cls, user_uuid, openid, session_key):
10 user_session_value {
11 openid: openid,
12 session_key: session_key
13 }
14 user_session_key US: user_uuid
15 with user_redis.pipeline(transactionFalse) as pipe:
16 pipe.hmset(user_session_key, user_session_value)
17 pipe.expire(user_session_key, cls.REDIS_EXPIRES)
18 pipe.execute() 4. 存储用户信息以备后用这里使用了 MySQLORM 使用的是 SQLAlchemy 1 from sqlalchemy import create_engine2 from sqlalchemy.ext.declarative import declarative_base3 4 # mysql 相关设置5 engine create_engine(mysql://root:localhost/wechat)6 conn engine.connect()7 8 Base declarative_base()9 Base.metadata.reflect(engine)
10 tables Base.metadata.tables
11
12 class User(object):
13 table tables[user]
14
15 classmethod
16 def save_user_info(cls, open_id):
17 # 存储用户信息
18 sql cls.table.insert().values(open_idopen_id)
19 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)
) ENGINEInnoDB DEFAULT CHARSETutf8mb4; 全部代码可以点击 这里 获取转载于:https://www.cnblogs.com/qiaojushuang/p/9171680.html