アプレットのログインフローマイクロチャネル

アプレットのログインフローマイクロチャネル

すべてのフロントエンド、バックエンドのための最初のパスコードの最初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があるため

どこappidsecretあなたがしています小程序账号中

背景のパラメータのための暗号化のプロセスパラメータを取得した後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ページ全体を対象としなければならない方法

おすすめ

転載: www.cnblogs.com/pythonywy/p/11580715.html