欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

微信小程序登錄會(huì)話(huà)密鑰session失效解決方案

 更新時(shí)間:2022年04月19日 10:07:44   作者:Jeff的技術(shù)棧  
這篇文章主要為大家介紹了微信小程序登錄會(huì)話(huà)密鑰session失效解決方案,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

一、登錄會(huì)話(huà)密鑰 session_key 有效性

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

開(kāi)發(fā)者如果遇到因?yàn)?session_key 不正確而校驗(yàn)簽名失敗或解密失敗,請(qǐng)關(guān)注下面幾個(gè)與 session_key 有關(guān)的注意事項(xiàng)。

  • wx.login 調(diào)用時(shí),用戶(hù)的 session_key 可能會(huì)被更新而致使舊 session_key 失效(刷新機(jī)制存在最短周期,如果同一個(gè)用戶(hù)短時(shí)間內(nèi)多次調(diào)用 wx.login,并非每次調(diào)用都導(dǎo)致 session_key 刷新)。開(kāi)發(fā)者應(yīng)該在明確需要重新登錄時(shí)才調(diào)用 wx.login,及時(shí)通過(guò) auth.code2Session 接口更新服務(wù)器存儲(chǔ)的 session_key。
  • 微信不會(huì)把 session_key 的有效期告知開(kāi)發(fā)者。我們會(huì)根據(jù)用戶(hù)使用小程序的行為對(duì) session_key 進(jìn)行續(xù)期。用戶(hù)越頻繁使用小程序,session_key 有效期越長(zhǎng)。
  • 開(kāi)發(fā)者在 session_key 失效時(shí),可以通過(guò)重新執(zhí)行登錄流程獲取有效的 session_key。使用接口 wx.checkSession可以校驗(yàn) session_key 是否有效,從而避免小程序反復(fù)執(zhí)行登錄流程。
  • 當(dāng)開(kāi)發(fā)者在實(shí)現(xiàn)自定義登錄態(tài)時(shí),可以考慮以 session_key 有效期作為自身登錄態(tài)有效期,也可以實(shí)現(xiàn)自定義的時(shí)效性策略。

二、解決登錄session_key 的問(wèn)題

通過(guò)wx.checkSession判斷是否過(guò)期。

第一步:在生命周期中onLaunch調(diào)用一次寫(xiě)的登錄方法

第二步:在其他地方通過(guò)wx.checkSession判斷是否過(guò)期,如果過(guò)期再次調(diào)用登錄方法,更新session_key 

案例:解決session_key 過(guò)期問(wèn)題,發(fā)送個(gè)人信息后臺(tái)解密

# app.js中:
//app.js
App({
  /*
    當(dāng)小程序初始話(huà)完成,會(huì)觸發(fā)onlaunch(全局只觸發(fā)一次)
  */
  onLaunch: function () {
    // 登錄
    this.my_login()
  },
  my_login:function(){
    let that = this
    wx.login({
      success: res => {
        // 發(fā)送 res.code 到后臺(tái)換取 openId, sessionKey, unionId
        console.log(res.code)
        wx.request({
          url: that.globalData.baseurl + "login/",
          data: { "code": res.code },
          method: "POST",
          success(e) {
            wx.setStorageSync('token', e.data.data.token)
          }
        })
      }
    })
  },
  globalData: {
    userInfo: null,
    baseurl:"http://127.0.0.1:8000/"
  }
})
# 頁(yè)面js中:
// 先拿到app全局對(duì)象
const app = getApp()
user1:function (e) {
    wx.getSetting({
      success(res) {
        if (res.authSetting['scope.userInfo']) {
          wx.getUserInfo({
            success: (res) => {
              console.log("res",res) //這個(gè)res就是用戶(hù)的信息
              // 將數(shù)據(jù)發(fā)送后端
              wx.request({
                // 發(fā)送iv,encryptedData
                url: app.globalData.baseurl + "getinfo/",
                data:{
                  iv:res.iv,
                  encryptedData: res.encryptedData,
                  token:wx.getStorageSync("token")
                },
                method:"POST",
                success:(e) =>{
                  console.log('后臺(tái)返回的數(shù)據(jù)',e)
                }
              })
            },
          })
          // 判斷是否過(guò)期
          wx.checkSession({
            success() {
              //session_key 未過(guò)期,并且在本生命周期一直有效
            },
            fail() {
              // session_key 已經(jīng)失效,需要重新執(zhí)行登錄流程
              app.my_login() // 重新登錄,更新session_key
              wx.getUserInfo({
                success: (res) => {
                  console.log("res啦啦啦", res) //這個(gè)res就是用戶(hù)的信息
                  // 將數(shù)據(jù)發(fā)送后端
                  wx.request({
                    // 發(fā)送iv,encryptedData
                    url: 'url',
                  })
                },
              })
            }
          })
        }
      }
    })
  }

后端解密信息,存入數(shù)據(jù)庫(kù)

# 登錄:略
# urls.py
path('getinfo/', user.Info.as_view()),
# user.py
from django.core.cache import cache
from api.models import Wxuser
from api.wx import WXBizDataCrypt
from api.my_ser import wx_user_ser
from rest_framework.response import Response
class Info(APIView):
    def post(self, request):
        param = request.data
        if param['iv'] and param.get("token") and param.get("encryptedData"):
            iv = param['iv']
            encryptedData = param.get("encryptedData")
            session_key_openid = cache.get(param.get("token"))
            if session_key_openid:
                sessionKey, openid = session_key_openid.split("&")
                # 解密
                user_info = WXBizDataCrypt.WXBizDataCrypt.get_info(sessionKey, encryptedData, iv)
                print('user_info', user_info)
                save_data = {
                    "name": user_info['nickName'],
                    "avatar": user_info['avatarUrl'],
                    "language": user_info['language'],
                    "province": user_info['province'],
                    "city": user_info['city'],
                    "country": user_info['country'],
                }
                # 把用戶(hù)信息存入數(shù)據(jù)庫(kù)
                Wxuser.objects.filter(openid=openid).update(**save_data)
                # 測(cè)試:把童虎信息返回給前臺(tái)
                user = Wxuser.objects.filter(openid=openid).first()
                user = wx_user_ser(instance=user, many=False).data
                return Response({
                    "status": 0,
                    "msg": "ok",
                    "data": user
                })
            else:
                return Response({"code": 2, "msg": "無(wú)效的token"})
        else:
            return Response({"code": 1, "msg": "缺少參數(shù)"})
            # 檢測(cè)對(duì)字典排序
# WXBizDataCrypt文件,下載的解密,然后二次封裝的
import base64
import json
from Crypto.Cipher import AES
from api.wx import settings
class WXBizDataCrypt:
    def __init__(self, appId, sessionKey):
        self.appId = appId
        self.sessionKey = sessionKey
    def decrypt(self, encryptedData, iv):
        # base64 decode
        sessionKey = base64.b64decode(self.sessionKey)
        encryptedData = base64.b64decode(encryptedData)
        iv = base64.b64decode(iv)
        cipher = AES.new(sessionKey, AES.MODE_CBC, iv)
        decrypted = json.loads(self._unpad(cipher.decrypt(encryptedData)))
        if decrypted['watermark']['appid'] != self.appId:
            raise Exception('Invalid Buffer')
        return decrypted
    def _unpad(self, s):
        return s[:-ord(s[len(s)-1:])]
    @classmethod
    def get_info(cls,sessionKey,encryptedData,iv):
        # appId = settings.AppId
        # sessionKey = sessionKey
        # encryptedData = encryptedData
        # iv = iv
        #
        # # 實(shí)例化這個(gè)類(lèi) WXBizDataCrypt
        # pc = cls(appId, sessionKey)
        # return pc.decrypt(encryptedData, iv)
        # 簡(jiǎn)化為:
        return cls(settings.AppId, sessionKey).decrypt(encryptedData, iv)

mysql數(shù)據(jù)庫(kù)存表情設(shè)置

1.mysql數(shù)據(jù)庫(kù)類(lèi)型

2.配置:默認(rèn)是utf8,3個(gè)字節(jié)。表情是4個(gè)字節(jié)

需要設(shè)置:'OPTIONS': {'charset': 'utf8mb4'}

import pymysql
pymysql.install_as_MySQLdb()
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'python13',
        'USER': 'root',
        'PASSWORD': '123',
        'HOST': 'localhost',
        'PORT': 3306,
        'OPTIONS': {'charset': 'utf8mb4'},
    }
}

三、后端,如何解析wx.getUserInfor中的用戶(hù)信息。

1 我們用encryptedData和iv,進(jìn)行解密,必須要用到session_key,所以用必須是登入狀態(tài)。

2 但是session_key是有有效期。而且session_key的有效期,不是一個(gè)固定值,他是通過(guò)用戶(hù)行為來(lái)決定,session_key的有效期時(shí)間。

3 但是我們可以通過(guò)wx.checkSession來(lái)判斷有沒(méi)有過(guò)期。

4 保證session_key沒(méi)有過(guò)期的情況下。我們將iv,encryptedData,token(登入憑證)發(fā)送到后端.

5 后端使用官方提供的sdk,進(jìn)行解密。

6 解密成功以后保存到數(shù)據(jù),數(shù)據(jù)庫(kù)的字符集一定要是utf8mb4,才能保存表情包

如官方的sdk沒(méi)有Crypto包用下面的方法解決:

pip install pycryptodome 

用戶(hù)信息官方文檔

https://developers.weixin.qq.com/miniprogram/dev/api/open-api/user-info/wx.getUserInfo.html

數(shù)據(jù)加密官方文檔

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

以上就是微信小程序登錄會(huì)話(huà)密鑰session失效解決方案的詳細(xì)內(nèi)容,更多關(guān)于微信小程序登錄會(huì)話(huà)密鑰session的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 基于javascript實(shí)現(xiàn)彩票隨機(jī)數(shù)生成(簡(jiǎn)單版)

    基于javascript實(shí)現(xiàn)彩票隨機(jī)數(shù)生成(簡(jiǎn)單版)

    這篇文章主要介紹了基于javascript實(shí)現(xiàn)彩票隨機(jī)數(shù)生成的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-01-01
  • JS中雙擊和單擊事件沖突的解決方法

    JS中雙擊和單擊事件沖突的解決方法

    這篇文章主要為大家詳細(xì)介紹了JS中雙擊和單擊事件沖突的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • javascript Blob對(duì)象實(shí)現(xiàn)文件下載

    javascript Blob對(duì)象實(shí)現(xiàn)文件下載

    這篇文章主要為大家介紹了vue組件通信的幾種方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-12-12
  • 深入理解js generator數(shù)據(jù)類(lèi)型

    深入理解js generator數(shù)據(jù)類(lèi)型

    下面小編就為大家?guī)?lái)一篇深入理解js generator數(shù)據(jù)類(lèi)型。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-08-08
  • js判斷文本框剩余可輸入字?jǐn)?shù)的方法

    js判斷文本框剩余可輸入字?jǐn)?shù)的方法

    這篇文章主要介紹了js判斷文本框剩余可輸入字?jǐn)?shù)的方法,可實(shí)現(xiàn)直觀顯示文本框可輸入字?jǐn)?shù)的功能,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-02-02
  • 微信小程序npm引入vant-weapp的踩坑記錄

    微信小程序npm引入vant-weapp的踩坑記錄

    這篇文章主要給大家介紹了關(guān)于微信小程序npm引入vant-weapp的踩坑記錄,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用微信小程序具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • JS驗(yàn)證全角與半角及相互轉(zhuǎn)化的介紹

    JS驗(yàn)證全角與半角及相互轉(zhuǎn)化的介紹

    全角:是一種電腦字符,是指一個(gè)全角字符占用兩個(gè)標(biāo)準(zhǔn)字符(或兩個(gè)半角字符)的位置。全角占兩個(gè)字節(jié)。半角:是指一個(gè)字符占用一個(gè)標(biāo)準(zhǔn)的字符位置。半角占一個(gè)字節(jié)。接下來(lái)通過(guò)本文給大家介紹JS驗(yàn)證全角與半角及相互轉(zhuǎn)化的知識(shí),需要的朋友參考下吧
    2017-05-05
  • BootStrap Tooltip插件源碼解析

    BootStrap Tooltip插件源碼解析

    這篇文章主要為大家詳細(xì)解析了BootStrap的Tooltip插件源碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • 使用webpack/gulp構(gòu)建TypeScript項(xiàng)目的方法示例

    使用webpack/gulp構(gòu)建TypeScript項(xiàng)目的方法示例

    這篇文章主要介紹了使用webpack/gulp構(gòu)建TypeScript項(xiàng)目的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • 微信小程序用戶(hù)位置權(quán)限的獲取方法(拒絕后提醒)

    微信小程序用戶(hù)位置權(quán)限的獲取方法(拒絕后提醒)

    這篇文章主要介紹了微信小程序用戶(hù)位置權(quán)限的獲取方法(拒絕后提醒),文中給大家介紹了微信小程序獲取用戶(hù)當(dāng)前位置的三個(gè)方式,授權(quán)方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-11-11

最新評(píng)論