首頁 > 軟體

python程式碼實現小程式登入流程時序總結

2022-04-12 19:00:15

官方檔案

https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html

小程式登入

小程式可以通過微信官方提供的登入能力方便地獲取微信提供的使用者身份標識,快速建立小程式內的使用者體系。

登入流程時序

說明:

  • 呼叫wx.login()獲取臨時登入憑證code,並回傳到開發者伺服器。
  • 呼叫auth.code2Session介面,換取使用者唯一標識 OpenID和對談金鑰 session_key。

之後開發者伺服器可以根據使用者標識來生成自定義登入態,用於後續業務邏輯中前後端互動時識別使用者身份。

注意:

  • 對談金鑰session_key是對使用者資料進行加密簽名的金鑰。為了應用自身的資料安全,開發者伺服器不應該把對談金鑰下發到小程式,也不應該對外提供這個金鑰。
  • 臨時登入憑證 code 只能使用一次

小程式的登入總結

1 小程式端執行wx.login()獲取code

2 將1中的code傳送到後端,後端呼叫auth.code2Session這個介面,得到openid和session_key

3 自定義登入狀態,我們生成一個key與openid和session_key相繫結。把key返回到小程式中

4 小程式端儲存,然後下次請求需要登入的介面的時候,把key帶上。

案例

# app.js的onLaunch中   因為登入是使用者感覺不到的
App({
  onLaunch: function () {
    let that = this
    // 登入
    wx.login({
      success: res => {
        // 傳送 res.code 到後臺換取 openId, sessionKey, unionId
        console.log(res.code)   //拿到code
        wx.request({
          url:that.globalData.baseurl+"/login/",
          data:{'code':res.code},
          method:'POST',
          success(e){
            console.log(e.data)
            // wx.setStorageSync("token", e.data.data.token)
            
          }
        })
      }
    }),
    globalData: {
    userInfo: null,
    baseurl:"http://127.0.0.1:8000"
  }
# dango後臺中
# urls.py 路由中
path('login/', user.Login.as_view()),
# user.py中
from rest_framework.views import APIView
from rest_framework.response import Response
from api.wx import wx_login
import hashlib, time
from django.core.cache import cache
from api.models import Wxuser
class Login(APIView):
    def post(self, request):
        param = request.data
        print(request.data)
        if not param.get('code'):
            return Response({"status": 1, "msg": '缺少引數'})
        else:
            code = param.get("code")
            user_data = wx_login.get_login_info(code)
            if user_data:
                val = user_data['session_key'] + "&" + user_data['openid']
                md5 = hashlib.md5()
                md5.update(str(time.clock()).encode("utf-8"))
                key = md5.hexdigest()
                cache.set(key, val)  # 放進記憶體redis庫中,把key傳給前端當token.下次前臺帶著key就能拿到val
                has_user = Wxuser.objects.filter(openid=user_data['openid']).first()  # 判斷openid是否存在
                if not has_user:
                    Wxuser.objects.create(openid=user_data['openid'])
                return Response({
                    "status": 0,
                    "msg": "ok",
                    "data": {"token": key}
                })
            else:
                return Response({"status": 2, "data": "無效的code"})
# models.py中:
from django.db import models
class Wxuser(models.Model):
    id = models.AutoField(primary_key=True)
    openid=models.CharField(max_length=255)
    name = models.CharField(max_length=50)
    avatar = models.CharField(max_length=200)
    language = models.CharField(max_length=50)
    province = models.CharField(max_length=50)
    city = models.CharField(max_length=50)
    country = models.CharField(max_length=50)
    #gender = models.CharField(max_length=50)
    creat_time = models.DateTimeField(auto_now_add=True)
    update_time = models.DateTimeField(auto_now=True)
    def __str__(self):
        return self.openid
# settings.py中:自己註冊的微信小程式資訊
AppId=""
AppSecret=""
code2Session="https://api.weixin.qq.com/sns/jscode2session?appid={}&secret={}&js_code={}&grant_type=authorization_code"
# wx_login.py中:
from api.wx import settings
import requests
def get_login_info(code):
    # 拼接路徑
    code_url = settings.code2Session.format(settings.AppId,settings.AppSecret,code)
    response = requests.get(code_url)  # 返回的是json資料
    json_response = response.json()    # 把json資料轉換為字典
    if json_response.get('session_key'):
        return json_response
    else:
        return False
# cache快取設定redis資料庫

以上就是python程式碼實現小程式登入流程時序總結的詳細內容,更多關於python小程式登入時序總結的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com