image.png
官方流程說(shuō)明
- 調(diào)用 wx.login() 獲取 臨時(shí)登錄憑證code 亡容,并回傳到開(kāi)發(fā)者服務(wù)器名扛。
- 調(diào)用 auth.code2Session 接口箱沦,換取 用戶(hù)唯一標(biāo)識(shí) OpenID 和 會(huì)話密鑰 session_key谈秫。
之后開(kāi)發(fā)者服務(wù)器可以根據(jù)用戶(hù)標(biāo)識(shí)來(lái)生成自定義登錄態(tài)抚岗,用于后續(xù)業(yè)務(wù)邏輯中前后端交互時(shí)識(shí)別用戶(hù)身份或杠。
注意:
- 會(huì)話密鑰
session_key
是對(duì)用戶(hù)數(shù)據(jù)進(jìn)行 加密簽名 的密鑰。為了應(yīng)用自身的數(shù)據(jù)安全宣蔚,開(kāi)發(fā)者服務(wù)器不應(yīng)該把會(huì)話密鑰下發(fā)到小程序向抢,也不應(yīng)該對(duì)外提供這個(gè)密鑰。 - 臨時(shí)登錄憑證 code 只能使用一次
白話文
1.調(diào)用wx.login
拿到code
發(fā)給服務(wù)器
2.服務(wù)器拿到code
, appid
, appsecret
向微信發(fā)起登錄憑證校驗(yàn)請(qǐng)求auth.code2Session
3.拿到openid
, session_key
, 建立后臺(tái)用戶(hù)關(guān)系與登錄狀態(tài)胚委,比如返回token
4.將token返回給客戶(hù)端, 客戶(hù)端請(qǐng)求時(shí)需要攜帶token挟鸠,服務(wù)器需校驗(yàn)客戶(hù)端攜帶的token, 正確則正常返回?cái)?shù)據(jù), 錯(cuò)誤則無(wú)法通過(guò)校驗(yàn)
服務(wù)器端
from flask import Flask, request
import requests
app = Flask(__name__)
# 處理小程序的登錄請(qǐng)求
@app.route('/login', methods=['POST'])
def login():
# 接收小程序發(fā)來(lái)的code
code = request.form.get('code')
# 向微信發(fā)起請(qǐng)求,拿到openid, session_key
appid = '你的appid'
secret = '你的secret'
grant_type = 'authorization_code'
url = """https://api.weixin.qq.com/sns/jscode2session?appid={appid}&secret={secret}&js_code={js_code}&grant_type={grant_type}""".format(appid=appid, secret=secret, js_code=code, grant_type=grant_type)
print(url)
resp = requests.get(url)
print(resp.json())
return resp.json()
if __name__ == '__main__':
app.run(debug=True)
uni-app端
<template>
<view class="content">
<button @click="login">登錄</button>
</view>
</template>
<script>
export default {
data() {
return {
title: 'Hello'
}
},
onLoad() {
},
methods: {
login(){
uni.login({
provider: 'weixin',
success: function (loginRes){
// 拿到code
console.log(loginRes.code);
// 將code發(fā)給后端
uni.request({
url: 'http://127.0.0.1:5000/login',
method: "POST",
header:{
"content-type": "application/x-www-form-urlencoded"
},
data: {
"code": loginRes.code
},
success: res =>{
console.log("res->", res);
}
})
}
});
}
}
}
</script>
<style scoped>
</style>