アプレットのログインフローマイクロチャネル
すべてのフロントエンド、バックエンドのための最初のパスコードの最初A.
wx.login({
success(res) {
if (res.code) {
//发起网络请求
wx.request({
url: app.globalData.host+'login',
method:"post",
data: {
code: res.code
}
})
} else {
console.log('登录失败!' + res.errMsg)
}
}
})
二つの後端が要求コードを受信しました
#.......省略一下配置路由啥的
class Login(APIView):
def post(self,request):
code = request.data.get('code')
print(code,type(code))
#061HMtlG0hAQ6d2hOYkG0DlhlG0HMtlh <class 'str'>
III。バックエンド・コードは、公式マイクロ文字に関連するパラメータへのアクセスを得るための要求を開始した後
スポンサーリンク
GET https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
リクエストパラメータ
プロパティ | タイプ | デフォルト値 | 必須の | 説明 |
---|---|---|---|---|
APPID | 弦 | それはあります | アプレットAPPID | |
秘密の | 弦 | それはあります | アプレットappSecret | |
js_code | 弦 | それはあります | コードを取得してログインします | |
grant_type | 弦 | それはあります | ただauthorization_codeを埋める認証タイプ、 |
返却値
オブジェクト
パケットは、JSONを返さ
プロパティ | タイプ | 説明 |
---|---|---|
OpenIDの | 弦 | ユーザーを一意に識別します |
SESSION_KEY | 弦 | セッションキー |
unionid | 弦 | ユーザーは、オープンプラットフォームのユニークな識別子は、会議のUnionIDは条件を出しながら、戻るでしょうメカニズムを説明UnionID。 |
ERRCODE | 数 | エラーコード |
ERRMSG | 弦 | エラーメッセージ |
正当な値のERRCODE
値 | 説明 | 最小バージョン |
---|---|---|
-1 | システムがこの時点でビジー状態である、後で再開発を試してみてください | |
0 | リクエストが成功 | |
40029 | コード無効 | |
45011 | 周波数限界、各ユーザー毎分100拍 |
上記の内容に続いて、我々は彼が必要とするパスにスプライス
import requests
class Login(APIView):
def post(self,request):
code = request.data.get('code')
#https: // api.weixin.qq.com / sns / jscode2session?appid = {} & secret ={} & js_code = {} & grant_type = authorization_code
url= f"https://api.weixin.qq.com/sns/jscode2session?appid=xxxx&secret=xxxx&js_code={code}&grant_type=authorization_code"
#appid与secret不同的开发者不一样
reponse=requests.get(url)
#因为返回值是json的形式
data=reponse.json()
print(data)
APPIDあなたはAPPIDに設定されている小さなプログラムを参照してください
対応する秘密APPIDがあるため
どこappid
とsecret
あなたがしています小程序账号中
背景のパラメータのための暗号化のプロセスパラメータを取得した後IV。
import hashlib
class Login(APIView):
........
if data.get("openid") and data.get("session_key"):
md5 = hashlib.md5()
md5.update(data['openid'].encode("utf-8"))
md5.update(data['session_key'].encode("utf-8"))
key = md5.hexdigest()
val =data['session_key']+"&"+data['openid']
print(key,val)
以上の処理が成功した場合V.、それはその後の同定作業を容易にするための遠位端を返します
from rest_framework.response import Response
from django.core.cache import cache
class Login(APIView):
........
cache.set(key,val) #存缓存中较少对于数据库的压力
has_user=models.Wxuser.objects.filter(openid=data['openid']).first() #将唯一标识进行存储
if not has_user:
models.Wxuser.objects.create(openid=data['openid'])
return Response({
"code": 200,
"msg": "ok",
"data":{'login_key':key} #发送login_key其目的是为了后续可以直接去缓存取对于信息
})
VI。問題なく前方の前端識別情報を受信します
ユーザ情報のその後の検索を容易にするために既に署名し得る識別を識別する目的
var that = this
wx.login({
success(res) {
if (res.code) {
//发起网络请求
wx.request({
url: app.globalData.host + 'login',
method: "post",
data: {
code: res.code
},
success(res) {
console.log(res.data.data.login_key)
console.log(that)
that.setData({
login_key: res.data.data.login_key
}
)
},
})
}else {
console.log('登录失败!' + res.errMsg)
}
}
})
其中setData
ページ全体を対象としなければならない方法