QQ小程序 用戶(hù)信息

2020-07-03 14:44 更新

小程序登錄

小程序可以通過(guò)QQ官方提供的登錄能力方便地獲取QQ提供的用戶(hù)身份標(biāo)識(shí),快速建立小程序內(nèi)的用戶(hù)體系。

登錄流程時(shí)序

說(shuō)明:

  1. 調(diào)用 qq.login() 獲取 臨時(shí)登錄憑證code ,并回傳到開(kāi)發(fā)者服務(wù)器。
  2. 調(diào)用 code2Session 接口,換取 用戶(hù)唯一標(biāo)識(shí) OpenID 和 會(huì)話(huà)密鑰 session_key。

之后開(kāi)發(fā)者服務(wù)器可以根據(jù)用戶(hù)標(biāo)識(shí)來(lái)生成自定義登錄態(tài),用于后續(xù)業(yè)務(wù)邏輯中前后端交互時(shí)識(shí)別用戶(hù)身份。

注意:

  1. 會(huì)話(huà)密鑰 session_key 是對(duì)用戶(hù)數(shù)據(jù)進(jìn)行 加密簽名 的密鑰。為了應(yīng)用自身的數(shù)據(jù)安全,開(kāi)發(fā)者服務(wù)器不應(yīng)該把會(huì)話(huà)密鑰下發(fā)到小程序,也不應(yīng)該對(duì)外提供這個(gè)密鑰。
  2. 臨時(shí)登錄憑證 code 只能使用一次

UnionID 機(jī)制說(shuō)明

如果開(kāi)發(fā)者擁有多個(gè)移動(dòng)應(yīng)用、網(wǎng)站應(yīng)用、小程序,可通過(guò) UnionID 來(lái)區(qū)分用戶(hù)的唯一性,因?yàn)橹灰荙Q互聯(lián)帳號(hào)下的移動(dòng)應(yīng)用、網(wǎng)站應(yīng)用、小程序,用戶(hù)的 UnionID 是唯一的。換句話(huà)說(shuō),同一用戶(hù),對(duì)同一個(gè)QQ互聯(lián)平臺(tái)下的不同應(yīng)用,unionid是相同的。

UnionID獲取途徑

綁定了開(kāi)發(fā)者帳號(hào)的小程序,可以通過(guò)以下途徑獲取 UnionID。

  1. 調(diào)用接口 qq.getUserInfo,從解密數(shù)據(jù)中獲取 UnionID。注意本接口需要用戶(hù)授權(quán),請(qǐng)開(kāi)發(fā)者妥善處理用戶(hù)拒絕授權(quán)后的情況。

授權(quán)

部分接口需要經(jīng)過(guò)用戶(hù)授權(quán)同意才能調(diào)用。我們把這些接口按使用范圍分成多個(gè) scope ,用戶(hù)選擇對(duì) scope 來(lái)進(jìn)行授權(quán),當(dāng)授權(quán)給一個(gè) scope 之后,其對(duì)應(yīng)的所有接口都可以直接使用。 部分接口需要獲得用戶(hù)授權(quán)同意后才能調(diào)用。此類(lèi)接口調(diào)用時(shí):

  • 如果用戶(hù)未接受或拒絕過(guò)此權(quán)限,會(huì)彈窗詢(xún)問(wèn)用戶(hù),用戶(hù)點(diǎn)擊同意后方可調(diào)用接口;
  • 如果用戶(hù)已授權(quán),可以直接調(diào)用接口;
  • 如果用戶(hù)已拒絕授權(quán),則不會(huì)出現(xiàn)彈窗,而是直接進(jìn)入接口 fail 回調(diào)。請(qǐng)開(kāi)發(fā)者兼容用戶(hù)拒絕授權(quán)的場(chǎng)景。

獲取用戶(hù)授權(quán)設(shè)置

開(kāi)發(fā)者可以使用 qq.getSetting 獲取用戶(hù)當(dāng)前的授權(quán)狀態(tài)。

打開(kāi)設(shè)置界面

用戶(hù)可以在小程序設(shè)置界面(「右上角」 - 「關(guān)于」 - 「右上角」 - 「設(shè)置」)中控制對(duì)該小程序的授權(quán)狀態(tài)。 開(kāi)發(fā)者可以調(diào)用 qq.openSetting 打開(kāi)設(shè)置界面,引導(dǎo)用戶(hù)開(kāi)啟授權(quán)。

提前發(fā)起授權(quán)請(qǐng)求 開(kāi)發(fā)者可以使用 qq.authorize 在調(diào)用需授權(quán) API 之前,提前向用戶(hù)發(fā)起授權(quán)請(qǐng)求。

scope 列表

scope 對(duì)應(yīng)接口 描述
scope.userInfo qq.getUserInfo 用戶(hù)信息
scope.userLocation qq.getLocation, qq.chooseLocation 地理位置
scope.address qq.chooseAddress 通訊地址
scope.invoiceTitle qq.chooseInvoiceTitle 發(fā)票抬頭
scope.invoice qq.chooseInvoice 獲取發(fā)票
scope.qqrun qq.getQQRunData QQ運(yùn)動(dòng)步數(shù)
scope.record qq.startRecord 錄音功能 scope.writePhotosAlbum qq.saveImageToPhotosAlbum, qq.saveVideoToPhotosAlbum 保存到相冊(cè)
scope.camera <camera /> 組件 攝像頭
setting.appMsgSubscribed qq.subscribeAppMsg 訂閱消息(833以下版本使用scope.appMsgSubscribed,833及以上版本使用setting.appMsgSubscribed)
setting.addFriend 主動(dòng)調(diào)用qq.authorize接口進(jìn)行授權(quán)

注意事項(xiàng)

  1. qq.authorize({scope: "scope.userInfo"}),不會(huì)彈出授權(quán)窗口,請(qǐng)使用 <button open-type="getUserInfo"/>
  2. 需要授權(quán) scope.userLocation 時(shí)必須配置地理位置用途說(shuō)明。

開(kāi)放數(shù)據(jù)校驗(yàn)與解密

小程序可以通過(guò)各種前端接口獲取QQ提供的開(kāi)放數(shù)據(jù)。考慮到開(kāi)發(fā)者服務(wù)器也需要獲取這些開(kāi)放數(shù)據(jù),QQ會(huì)對(duì)這些數(shù)據(jù)做簽名和加密處理。開(kāi)發(fā)者后臺(tái)拿到開(kāi)放數(shù)據(jù)后可以對(duì)數(shù)據(jù)進(jìn)行校驗(yàn)簽名和解密,來(lái)保證數(shù)據(jù)不被篡改。 簽名校驗(yàn)以及數(shù)據(jù)加解密涉及用戶(hù)的會(huì)話(huà)密鑰 session_key。 開(kāi)發(fā)者應(yīng)該事先通過(guò) qq.login 登錄流程獲取會(huì)話(huà)密鑰 session_key 并保存在服務(wù)器。為了數(shù)據(jù)不被篡改,開(kāi)發(fā)者不應(yīng)該把 session_key 傳到小程序客戶(hù)端等服務(wù)器外的環(huán)境。

數(shù)據(jù)簽名校驗(yàn)

為了確保開(kāi)放接口返回用戶(hù)數(shù)據(jù)的安全性,QQ會(huì)對(duì)明文數(shù)據(jù)進(jìn)行簽名。開(kāi)發(fā)者可以根據(jù)業(yè)務(wù)需要對(duì)數(shù)據(jù)包進(jìn)行簽名校驗(yàn),確保數(shù)據(jù)的完整性。

  1. 通過(guò)調(diào)用接口(如 qq.getUserInfo)獲取數(shù)據(jù)時(shí),接口會(huì)同時(shí)返回 rawData、signature,其中 signature = sha1( rawData + session_key )
  2. 開(kāi)發(fā)者將 signature、rawData 發(fā)送到開(kāi)發(fā)者服務(wù)器進(jìn)行校驗(yàn)。服務(wù)器利用用戶(hù)對(duì)應(yīng)的 session_key 使用相同的算法計(jì)算出簽名 signature2 ,比對(duì) signature 與 signature2 即可校驗(yàn)數(shù)據(jù)的完整性。

如 qq.getUserInfo的數(shù)據(jù)校驗(yàn): 接口返回的rawData:

{
  "nickName": "Band",
  "gender": 1,
  "language": "zh_CN",
  "city": "Guangzhou",
  "province": "Guangdong",
  "country": "CN",
  "avatarUrl": "http://thirdqq.qlogo.cn/qqapp/55107C3B8501CD7CBD90AEE4626E6D17/40"
}

用戶(hù)的 session-key:

HyVFkGl5F5OQWJZZaNzBBg==

用于簽名的字符串為:

{"nickName":"Band","gender":1,"language":"zh_CN","city":"Guangzhou","province":"Guangdong","country":"CN","avatarUrl":"http://thirdqq.qlogo.cn/qqapp/55107C3B8501CD7CBD90AEE4626E6D17/40"}HyVFkGl5F5OQWJZZaNzBBg==

使用sha1得到的結(jié)果為

75e81ceda165f4ffa64f4068af58c64b8f54b88c

加密數(shù)據(jù)解密算法 接口如果涉及敏感數(shù)據(jù)(如qq.getUserInfo當(dāng)中的 openId 和 unionId),接口的明文內(nèi)容將不包含這些敏感數(shù)據(jù)。開(kāi)發(fā)者如需要獲取敏感數(shù)據(jù),需要對(duì)接口返回的加密數(shù)據(jù)(encryptedData) 進(jìn)行對(duì)稱(chēng)解密。 解密算法如下:

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

另外,為了應(yīng)用能校驗(yàn)數(shù)據(jù)的有效性,會(huì)在敏感數(shù)據(jù)加上數(shù)據(jù)水印( watermark )

watermark參數(shù)說(shuō)明:

|參數(shù)|類(lèi)型|說(shuō)明| |appid|String|敏感數(shù)據(jù)歸屬 appId,開(kāi)發(fā)者可校驗(yàn)此參數(shù)與自身 appId 是否一致| |timestamp|Int|敏感數(shù)據(jù)獲取的時(shí)間戳, 開(kāi)發(fā)者可以用于數(shù)據(jù)時(shí)效性校驗(yàn)|

如接口 qq.getUserInfo 敏感數(shù)據(jù)當(dāng)中的 watermark:

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

注:

  1. 解密后得到的json數(shù)據(jù)根據(jù)需求可能會(huì)增加新的字段,舊字段不會(huì)改變和刪減,開(kāi)發(fā)者需要預(yù)留足夠的空間

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

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

獲取手機(jī)號(hào)

暫不支持,后續(xù)版本將進(jìn)行更新

生物認(rèn)證

暫不支持,后續(xù)版本將進(jìn)行更新

以上內(nèi)容是否對(duì)您有幫助:
在線(xiàn)筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)