午夜91福利视频,午夜成人在线观看,午夜在线视频免费观看,午夜福利短视频,精品午夜成人免费视频APP

小程序模板網

小程序的登陸和授權

發布時間:2020-05-20 10:00 所屬欄目:小程序開發教程

1.小程序登錄

登入官方說明

小程序(xu)可以通過(guo)微信(xin)官方提(ti)供(gong)的登(deng)錄能力方便地獲(huo)取微信(xin)提(ti)供(gong)的用戶(hu)身份標識,快速建立小程序(xu)內的用戶(hu)體系。

登錄流程時序

說明:

  1. 調用 wx.login() 獲取 臨時登錄憑證code ,并回傳到開發者服務器。
  2. 調用 code2Session 接口,換取 用戶唯一標識 OpenID 和 會話密鑰 session_key 。

之后開發者服務器(qi)可(ke)以根據用戶(hu)標(biao)識來生成自(zi)定義(yi)登錄態,用于后續(xu)業務邏輯中前后端交互時(shi)識別用戶(hu)身份。

注意:

  1. 會話密鑰 session_key 是對用戶數據進行 加密簽名 的密鑰。為了應用自身的數據安全,開發者服務器 不應該把會話密鑰下發到小程序,也不應該對外提供這個密鑰 。
  2. 臨時登錄憑證 code 只能使用一次

兄弟們,是不是很簡單,一看就會?我知道你們的回答如下圖,但是不要慌,我們詳細講每一步

小程序端執行wx.login后在回調函數中就能拿到上圖的code,然后把這個code傳給我們后端程序,后端拿到這個這個code后,可以請求code2Session接口拿到用的openid和session_key,openid是用戶在微信中唯一標識,我們就可以把這個兩個值(val)存起來,然后返回一個鍵(key)給小程序端,下次小程序請求我們后端的時候,帶上這個key,我們就能找到這個val,就可以,這樣就把登入做好了。

1.1wx.login(Object object)

調用(yong)接口獲取(qu)登(deng)錄憑證(code)。通過憑證進而換取(qu)用(yong)戶(hu)登(deng)錄態信息,包(bao)括(kuo)用(yong)戶(hu)的唯一標識(openid)及本次登(deng)錄的會話密鑰(yao)(session_key)等(deng)。用(yong)戶(hu)數(shu)據的加解密通訊(xun)需要(yao)依(yi)賴會話密鑰(yao)完成(cheng)。更(geng)多使用(yong)方法詳見 小程序登(deng)錄 。

參數

Object object

屬性 類型 默認值 必填 說明 最低版本
timeout number   超時時間,單位ms 1.9.90
success function   接口調用成功的回調函數  
fail function   接口調用失敗的回調函數  
complete function   接口調用結束的回調函數(調用成功、失敗都會執行)  

object.success 回調函數

參數

Object res

屬性 類型 說明
code string 用戶登錄憑證(有效期五分鐘)。開發者需要在開發者服務器后臺調用 code2Session ,使用 code 換取 openid 和 session_key 等信息

示例代碼

wx.login({
  success(res) {
    if (res.code) {
      // 發起網絡請求
      wx.request({
        url: '//test.com/onLogin',
        data: {
          code: res.code
        },
        success: function (res) {
              wx.setStorageSync('login_key', res.data.data.login_key);
        }
      })
    } else {
      console.log('登錄失敗!' + res.errMsg)
    }
  }
})

1.2code2Session

本(ben)接口應在服(fu)務器端(duan)(duan)調用(yong),詳細說明參見 服(fu)務端(duan)(duan)API 。

登(deng)錄(lu)(lu)憑證(zheng)校驗。通過 wx.login() 接口(kou)獲得臨時登(deng)錄(lu)(lu)憑證(zheng) code 后傳(chuan)到開發者服(fu)務器(qi)調用(yong)此接口(kou)完成登(deng)錄(lu)(lu)流程。更多使(shi)用(yong)方法詳見 小程序登(deng)錄(lu)(lu) 。

請求地址

GET //api.weixin.qq.com/sns/jscode2sessionappid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code

請求參數

屬性 類型 默認值 必填 說明
appid string   小程序 appId
secret string   小程序 appSecret
js_code string   登錄時獲取的 code
grant_type string   授權類型,此處只需填寫 authorization_code

返回值

Object

返回的 JSON 數據包

屬性 類型 說明
openid string 用戶唯一標識
session_key string 會話密鑰
unionid string 用戶在開放平臺的唯一標識符,在滿足 UnionID 下發條件的情況下會返回,詳見 UnionID 機制說明 。
errcode number 錯誤碼
errmsg string 錯誤信息

errcode 的合法值

說明
-1 系統繁忙,此時請開發者稍候再試
0 請求成功
40029 code 無效
45011 頻率限制,每個用戶每分鐘100次

說完上面的登入后,我們是不是還沒有用到上面的session_key?這個就是在用戶授權的時候用的,用來解密用戶的數據,還要解密?是的你沒有聽錯,不要慌,下面給你解釋

2.微信授權獲取用戶信

后端獲取微信用戶信息流程

微信官方:忘了告訴你,session_key還會過期的,是的,沒錯就是這樣坑爹。

我的回復:我就是頭鐵,我不管session_key過期,會帶來什么樣的后果呢?

微信官方:對不起,你頭鐵沒有,你后端程序無法用戶授權的數據,就問你氣不氣?

我的回復:好的,你牛逼,我可以接收你session_key過期,但是你要告訴我怎么判斷他是過期的吧?怎么獲取新的session_key吧?

微信官方:還是要按照我的要求來吧?看你這么可憐,告訴你吧,用wx.checkSession判斷是否過期,如果過期就重寫登入吧!獲取新的code,后端在去請求code2Session獲取新的session_key

我的回復:好的,謝謝你sb

判斷session_key有(you)沒有(you)過(guo)期(qi)

2.1wx.checkSession(Object object)

檢查登錄態(tai)是否過期。

通過 wx.login 接(jie)口(kou)獲(huo)得的用(yong)戶(hu)(hu)登(deng)(deng)錄(lu)(lu)態(tai)擁(yong)有一定的時(shi)效(xiao)性。用(yong)戶(hu)(hu)越久未(wei)使(shi)用(yong)小(xiao)程序(xu),用(yong)戶(hu)(hu)登(deng)(deng)錄(lu)(lu)態(tai)越有可(ke)能失效(xiao)。反(fan)之如(ru)果用(yong)戶(hu)(hu)一直(zhi)在使(shi)用(yong)小(xiao)程序(xu),則(ze)用(yong)戶(hu)(hu)登(deng)(deng)錄(lu)(lu)態(tai)一直(zhi)保持有效(xiao)。具體時(shi)效(xiao)邏(luo)輯由微信(xin)維(wei)護(hu),對開發者(zhe)透明。開發者(zhe)只需要調(diao)用(yong) wx.checkSession 接(jie)口(kou)檢(jian)測當前用(yong)戶(hu)(hu)登(deng)(deng)錄(lu)(lu)態(tai)是否有效(xiao)。

登(deng)錄(lu)(lu)態過期(qi)后開發(fa)者可(ke)以(yi)再調用(yong) wx.login 獲取新的用(yong)戶登(deng)錄(lu)(lu)態。調用(yong)成功說(shuo)明當前 session_key 未過期(qi),調用(yong)失敗說(shuo)明 session_key 已過期(qi)。更(geng)多使用(yong)方(fang)法詳(xiang)見 小程序登(deng)錄(lu)(lu) 。

參數

Object object

屬性 類型 默認值 必填 說明
success function   接口調用成功的回調函數
fail function   接口調用失敗的回調函數
complete function   接口調用結束的回調函數(調用成功、失敗都會執行)

示例代碼

wx.checkSession({
  success() {
    // session_key 未過期,并且在本生命周期一直有效
  },
  fail() {
    // session_key 已經失效,需要重新執行登錄流程
    wx.login() // 重新登錄
  }
})

微信官方:你要獲取用的信息?我告訴你哈,如果要獲取的話,要經過用戶同意的。

我的回復:sb,我怎么知道他是否授權過呢?如果沒有授權,我怎么讓他授權?

**微信官方:你(ni)好,你(ni)可以調用(yong)wx.getSetting來(lai)判(pan)斷,用(yong)戶是否授(shou)權(quan),如果沒有授(shou)權(quan),你(ni)要讓他(ta)點擊(ji)按鈕,調起(qi)授(shou)權(quan)頁面(mian)。用(yong)戶點擊(ji)同意(yi)授(shou)權(quan)以后*,你(ni)就可以調用(yong)wx.getUserInfo接口獲取數(shu)據了**

我的回復:媽的,怎么這么麻煩?

微信官方:對不起,大佬,沒有辦法啊,我們要保護用戶的信息安全啊

我的回復:哦

2.2wx.getSetting(Object object)

基礎(chu)庫 1.2.0 開(kai)始支(zhi)持,低版(ban)本需做 兼(jian)容處理 。

獲取用(yong)戶的當前(qian)設(she)置。 返回值中只會出現小程(cheng)序已(yi)經(jing)向用(yong)戶請求過的權限(xian) 。

參數

Object object

屬性 類型 默認值 必填 說明
success function   接口調用成功的回調函數
fail function   接口調用失敗的回調函數
complete function   接口調用結束的回調函數(調用成功、失敗都會執行)

object.success 回調函數

參數

Object res

屬性 類型 說明
authSetting AuthSetting 用戶授權結果

示例代碼

wx.getSetting({
  success(res) {
    console.log(res.authSetting)
    //部分結果,如果為true,則表示該用戶對這項權限以及授權,如果沒有授權,我們這需要通過button按鈕讓用戶授權
    // res.authSetting = {
    //   "scope.userInfo": true,
    //   "scope.userLocation": true
    // }
  }
})

注意事項

  1. wx.authorize({scope: "scope.userInfo"}) ,不會彈出授權窗口,請使用 <button_open-type="getUserInfo">
  2. 需要授權 scope.userLocation 時必須 配置地理位置用途說明 。

微信官方:當你小程序端調用我們wx.getUserInfo的時候,我們會返回你用的基本信息。

我的回復:什么是基本信息,哪些是敏感信息?我后端怎么獲取呢?

微信官方:比如openid這些,大佬,你又兩種方法,第一:你可以將這些基本信息傳到后端,第二: 你可以講getUserInfo中的 iv,encryptedData傳給后端解密,機密后就能獲取到用戶的敏感信息了

我的回復:好的,我后端怎么解密呢?用什么解密呢?

微信官方:你登入的時候不是,后端不是存了session_key嗎?加上這些數據,就可以解密了

我的回復:哦

2.3wx.getUserInfo(Object object)

獲取用戶信息

調用前需要 用戶授權(quan) scope.userInfo。

獲(huo)取用(yong)戶(hu)信息。

參數

Object object

屬性 類型 默認值 必填 說明
withCredentials boolean   是否帶上登錄態信息。當 withCredentials 為 true 時,要求此前有調用過 wx.login 且登錄態尚未過期,此時返回的數據會包含 encryptedData, iv 等敏感信息;當 withCredentials 為 false 時,不要求有登錄態,返回的數據不包含 encryptedData, iv 等敏感信息。
lang string en 顯示用戶信息的語言
success function   接口調用成功的回調函數
fail function   接口調用失敗的回調函數
complete function   接口調用結束的回調函數(調用成功、失敗都會執行)

object.lang 的合法值

說明
en 英文
zh_CN 簡體中文
zh_TW 繁體中文

object.success 回調函數

參數

Object res

屬性 類型 說明
userInfo UserInfo 用戶信息對象,不包含 openid 等敏感信息
rawData string 不包括敏感信息的原始數據字符串,用于計算簽名
signature string 使用 sha1( rawData + sessionkey ) 得到字符串,用于校驗用戶信息,詳見 用戶數據的簽名驗證和加解密
encryptedData string 包括敏感數據在內的完整用戶信息的加密數據,詳見 用戶數據的簽名驗證和加解密
iv string 加密算法的初始向量,詳見 用戶數據的簽名驗證和加解密

接口調整說明

在用(yong)戶(hu)未授權(quan)過的情況下調用(yong)此(ci)接口(kou),將(jiang)不再出現授權(quan)彈窗(chuang),會直接進入(ru) fail 回(hui)調(詳見 《公告》 )。在用(yong)戶(hu)已授權(quan)的情況下調用(yong)此(ci)接口(kou),可成(cheng)功(gong)獲取用(yong)戶(hu)信息。

示例代碼

// 必須是在用戶已經授權的情況下調用
wx.getUserInfo({
  success(res) {
    const userInfo = res.userInfo
    const nickName = userInfo.nickName
    const avatarUrl = userInfo.avatarUrl
    const gender = userInfo.gender // 性別 0:未知、1:男、2:女
    const province = userInfo.province
    const city = userInfo.city
    const country = userInfo.country
  }
})

 encryptedData 解密(mi)后為以下 json 結(jie)構(gou),詳見 加密(mi)數據解密(mi)算法

{
  "openId": "OPENID",
  "nickName": "NICKNAME",
  "gender": GENDER,
  "city": "CITY",
  "province": "PROVINCE",
  "country": "COUNTRY",
  "avatarUrl": "AVATARURL",
  "unionId": "UNIONID",
  "watermark": {
    "appid": "APPID",
    "timestamp": TIMESTAMP
  }
}

示例代碼

<!-- 如果只是展示用戶頭像昵稱,可以使用 <open-data /> 組件 -->
<open-data type="userAvatarUrl"></open-data>
<open-data type="userNickName"></open-data>
<!-- 需要使用 button 來授權登錄 -->
<button
  wx:if="{{canIUse}}"
  open-type="getUserInfo"
  bindgetuserinfo="bindGetUserInfo"
>
  授權登錄
</button>
<view wx:else>請升級微信版本</view>

Page({
  data: {
    canIUse: wx.canIUse('button.open-type.getUserInfo')
  },
  onLoad() {
    // 查看是否授權
    wx.getSetting({
      success(res) {
        if (res.authSetting['scope.userInfo']) {
          // 已經授權,可以直接調用 getUserInfo 獲取頭像昵稱
          wx.getUserInfo({
            success(res) {
              console.log(res.userInfo)
               wx.request({
                  url: url,
                  data: {
                    'iv': res.iv,
                    'encryptedData': res.encryptedData,
                    'login_key':登入標識
                  },
                  method: "POST",
                  header: {
                    'content-type': 'application/json' // 默認值
                  },
                  success: function (res) {
                    //解密后數據
                    console.log(res);
                  }
                });
            }
          })
        }
      }
    })
  },
  bindGetUserInfo(e) {
    console.log(e.detail.userInfo)
  }
})

叫你解密大法

2.4開放數據校驗與解密

小(xiao)程序(xu)可以通過各種前(qian)端(duan)接口獲取微(wei)信提供的(de)開(kai)(kai)放數據(ju)(ju)。考(kao)慮到(dao)(dao)開(kai)(kai)發(fa)者服(fu)務器也(ye)需要獲取這些開(kai)(kai)放數據(ju)(ju),微(wei)信會對這些數據(ju)(ju)做簽(qian)名(ming)和加密處理(li)。開(kai)(kai)發(fa)者后臺拿(na)到(dao)(dao)開(kai)(kai)放數據(ju)(ju)后可以對數據(ju)(ju)進行校驗簽(qian)名(ming)和解密,來(lai)保證數據(ju)(ju)不被(bei)篡改。

簽名校驗以(yi)及數據(ju)加解密(mi)涉及用戶的(de)會話密(mi)鑰 session_key。 開發者應該事先通過 wx.login 登錄流(liu)程(cheng)獲取會話密(mi)鑰 session_key 并保存在服務器。為(wei)了數據(ju)不被(bei)篡(cuan)改,開發者不應該把 session_key 傳(chuan)到(dao)小程(cheng)序客戶端等服務器外的(de)環(huan)境(jing)。

數據簽名校驗

為了確保(bao)開放接(jie)口返回(hui)用戶數(shu)據(ju)的安全性(xing),微信會對明文數(shu)據(ju)進行簽(qian)名(ming)。開發者(zhe)可以根據(ju)業(ye)務需要對數(shu)據(ju)包進行簽(qian)名(ming)校驗(yan),確保(bao)數(shu)據(ju)的完整(zheng)性(xing)。

  1. 通過調用接口(如 wx.getUserInfo )獲取數據時,接口會同時返回 rawData、signature,其中 signature = sha1( rawData + session_key )
  2. 開發者將 signature、rawData 發送到開發者服務器進行校驗。服務器利用用戶對應的 session_key 使用相同的算法計算出簽名 signature2 ,比對 signature 與 signature2 即可校驗數據的完整性。

如 wx.getUserInfo的數據校驗:

接口返回的rawData:

{
  "nickName": "Band",
  "gender": 1,
  "language": "zh_CN",
  "city": "Guangzhou",
  "province": "Guangdong",
  "country": "CN",
  "avatarUrl": "//wx.qlogo.cn/mmopen/vi_32/1vZvI39NWFQ9XM4LtQpFrQJ1xlgZxx3w7bQxKARol6503Iuswjjn6nIGBiaycAjAtpujxyzYsrztuuICqIM5ibXQ/0"
}

用戶(hu)的 session-key:

HyVFkGl5F5OQWJZZaNzBBg==

用于簽名的字(zi)符串為:

{"nickName":"Band","gender":1,"language":"zh_CN","city":"Guangzhou","province":"Guangdong","country":"CN","avatarUrl":"//wx.qlogo.cn/mmopen/vi_32/1vZvI39NWFQ9XM4LtQpFrQJ1xlgZxx3w7bQxKARol6503Iuswjjn6nIGBiaycAjAtpujxyzYsrztuuICqIM5ibXQ/0"}HyVFkGl5F5OQWJZZaNzBBg==

使用sha1得到的結果為

75e81ceda165f4ffa64f4068af58c64b8f54b88c

加密數據解密算法

接(jie)(jie)口(kou)如(ru)果涉及敏(min)感數(shu)據(如(ru) wx.getUserInfo 當中的(de)(de) openId 和 unionId),接(jie)(jie)口(kou)的(de)(de)明文內容(rong)將不包含這些敏(min)感數(shu)據。開發者如(ru)需要獲(huo)取敏(min)感數(shu)據,需要對(dui)接(jie)(jie)口(kou)返回的(de)(de) 加密(mi)數(shu)據(encryptedData) 進行對(dui)稱(cheng)解密(mi)。 解密(mi)算法如(ru)下:

  1. 對稱解密使用的算法為 AES-128-CBC,數據采用PKCS#7填充。
  2. 對稱解密的目標密文為 Base64_Decode(encryptedData)。
  3. 對稱解密秘鑰 aeskey = Base64_Decode(session_key), aeskey 是16字節。
  4. 對稱解密算法初始向量 為Base64_Decode(iv),其中iv由數據接口返回。

微信官方提供(gong)了多種編程語言(yan)的示例代碼( 點擊下(xia)載 )。每種語言(yan)類(lei)型(xing)的接口名字(zi)均一致。調(diao)用方式可以參照示例。

另(ling)外,為(wei)了(le)應(ying)用能(neng)校(xiao)驗數(shu)據(ju)(ju)的有效(xiao)性,會在敏感數(shu)據(ju)(ju)加上數(shu)據(ju)(ju)水印(yin)( watermark )

watermark參數說明:

參數 類型 說明
appid String 敏感數據歸屬 appId,開發者可校驗此參數與自身 appId 是否一致
timestamp Int 敏感數據獲取的時間戳, 開發者可以用于數據時效性校驗

如接口 wx.getUserInfo 敏感(gan)數據當中(zhong)的 watermark:

{
  "openId": "OPENID",
  "nickName": "NICKNAME",
  "gender": GENDER,
  "city": "CITY",
  "province": "PROVINCE",
  "country": "COUNTRY",
  "avatarUrl": "AVATARURL",
  "unionId": "UNIONID",
  "watermark": {
    "appid": "APPID",
    "timestamp": TIMESTAMP
  }
}

注:

  1. 解密后得到的json數據根據需求可能會增加新的字段,舊字段不會改變和刪減,開發者需要預留足夠的空間

會話密鑰 session_key 有效性

開(kai)發者(zhe)如果遇到因為(wei) session_key 不正確而(er)校驗簽(qian)名(ming)失(shi)敗(bai)或(huo)解密(mi)失(shi)敗(bai),請關(guan)注下面幾個與 session_key 有關(guan)的注意事項。

  1. wx.login 調用時,用戶的 session_key 可能 會被更新而致使舊 session_key 失效(刷新機制存在最短周期,如果同一個用戶短時間內多次調用 wx.login ,并非每次調用都導致 session_key 刷新)。開發者應該在明確需要重新登錄時才調用 wx.login ,及時通過 code2Session接口更新服務器存儲的 session_key。
  2. 微信不會把 session_key 的有效期告知開發者。我們會根據用戶使用小程序的行為對 session_key 進行續期。用戶越頻繁使用小程序,session_key 有效期越長。
  3. 開發者在 session_key 失效時,可以通過重新執行登錄流程獲取有效的 session_key。使用接口 wx.checkSession 可以校驗 session_key 是否有效,從而避免小程序反復執行登錄流程。
  4. 當開發者在實現自定義登錄態時,可以考慮以 session_key 有效期作為自身登錄態有效期,也可以實現自定義的時效性策略。
  5.  


易優小程序(企業版)+靈活api+前后(hou)代碼開源 碼云倉庫(ku):
本文地址://www.jinyoudianli.com/wxmini/doc/course/25232.html 復制鏈接 如需定制(zhi)請聯系易優客服(fu)咨詢:

工作日 8:30-12:00 14:30-18:00
周六及部(bu)分節假(jia)日提供值班服務

易小優
轉人工(gong) ×