小程序可以通過官方提供的登錄鄧麗來獲取用戶身份的標示, 具體文檔可以參考 官方文檔, 通過流程時序可以看到, 對於需要和前端配合的服務端開發, 主要實現的就是通過小程序提供的 code 換取用戶的 openid 和 session_key, 並用換取到的 openid 和 secret_key 作為自定義的登錄態. 分析後得知, 作為小程序後端的開發, 主要實現以下幾部分內容:
- 提供一個 HTTP 接口, 供小程序方使用, 傳遞code;
- 換取用戶身份標識;
- 維護一個自定義的登錄態;
- 需要存儲用戶的 openid , 以備後續使用.
1.提供給小程序一個 HTTP 接口, 接口而使用 Tornado 框架
簡化闡述, 代碼沒有做異常處理
<code>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 )self
.set_header('Authorization'
, user_uuid) User.save_user_info(open_id=openid)self
.set_status(204
)/<code>
2.換取用戶身份標示, 直接使用 Requests包 請求微信的相關接口, 獲取數據
<code>def
get_user_info
(js_code)
: req_params = {"appid"
:'app_id'
,"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()/<code>
3.維護一個自定義的登錄態, 使用 Redis
<code>user_redis = StrictRedis.from_url('redis//localhost:6379'
)class
User
(object)
: REDIS_EXPIRES =7
*24
*60
*60
def
save_user_session
(cls, user_uuid, openid, session_key)
: user_session_value = {'openid'
:openid,'session_key'
:session_key } user_session_key ='US:'
+ user_uuidwith
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()/<code>
4.存儲用戶信息, 以備後用, ORM使用 SQLAlchemy
<code>from
sqlalchemyimport
create_enginefrom
sqlalchemy.ext.declarativeimport
declarative_base engine = create_engine('mysql://root:pwd@localhost/wechat'
) conn = engine.connect() Base = declarative_base() Base.metadata.reflect(engine) tables = Base.metadata.tablesclass
User
(object)
: table = tables['user'
]def
save_user_info
(cls, open_id)
: sql = cls.table.insert().values(open_id=open_id) conn.execute(sql)/<code>
SQL 語句
<code>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
'更新時間'
, PRIMARYKEY
(`id`
),KEY
`idx_oid`
(`open_id`
) )ENGINE
=InnoDB
default
CHARSET
=utf8mb4;/<code>
Template: 通過代碼發送微信模板消息
<code>import
jsonimport
requestsfrom
redisimport
StrictRedisfrom
tornado.webimport
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
)/<code>
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持我們。