支付寶小程序獲取用戶手機(jī)號

記錄下支付寶小程序獲取會員手機(jī)號的踩坑過程。

使用限制

  • 基礎(chǔ)庫 1.16.4 或更高版本;支付寶客戶端 10.1.35 或更高版本,若版本較低,建議采取兼容處理。
  • 此 API 暫僅支持企業(yè)支付寶賬戶使用。
  • IDE 模擬器暫不支持調(diào)試,請以真機(jī)調(diào)試結(jié)果為準(zhǔn)。
  • 目前該功能需要在開發(fā)者后臺完成敏感信息申請才可以使用此功能,入口為開發(fā)管理 > 功能列表 > 添加功能 > 獲取會員手機(jī)號 > 用戶信息申請,此功能需謹(jǐn)慎使用,若支付寶發(fā)現(xiàn)信息存在超出約定范圍使用或者不合理使用等情況,支付寶有權(quán)永久回收該小程序的該接口權(quán)限。
  • 需要將 <button> 組件 open-type 的值設(shè)置為 getAuthorize,當(dāng)用戶點(diǎn)擊并同意之后,可以通過 my.getPhoneNumber() 接口獲取到支付寶服務(wù)器返回的加密數(shù)據(jù), 然后在第三方服務(wù)端結(jié)合簽名算法和 AES 密鑰進(jìn)行解密獲取手機(jī)號,方法詳見敏感信息加解密方法,若用戶未授權(quán),直接調(diào)用my.getPhoneNumber() 接口,則無法返回正確信息。

配置工作

  • 請檢查小程序后臺已添加獲取會員手機(jī)號功能包,并已在隱私內(nèi)容申請申請手機(jī)號(若在小程序后臺看不到用戶信息申請的入口,請使用主賬號登錄)。申請路徑為:小程序后臺 > 開發(fā)管理 > 功能列表添加功能 > 獲取會員手機(jī)號 > 用戶信息申請

  • 請確保已在小程序后臺 > 設(shè)置 > 開發(fā)設(shè)置中,設(shè)置支付寶公鑰、aes 密鑰應(yīng)用網(wǎng)關(guān)。aes 相關(guān)信息可參見內(nèi)容加密接入指引。(若缺失這三個設(shè)置,在調(diào)用 my.getPhoneNumber() 時可能只返回 response 不會返回 sign)。

前端工作

my.getPhoneNumber 是獲取支付寶用戶綁定的手機(jī)號 API。因?yàn)樾枰脩糁鲃佑|發(fā)才能發(fā)起獲取手機(jī)號,所以該功能不由 API 直接調(diào)用,需用 button 組件 的點(diǎn)擊來觸發(fā)。

<button
  open-type="getAuthorize"
  scope="phoneNumber"
  onGetAuthorize="getPhoneNumber"
  onError="getPhoneNumberError"
>
  獲取手機(jī)號碼
</button>
Page({
  /**
   * 獲取手機(jī)號碼,用戶點(diǎn)擊并同意回調(diào)函數(shù)
   *
   * @param {object} e 授權(quán)成功回調(diào)信息 { type: 'getAuthorize', target, currentTarget, timeStamp }
   */
  async getPhoneNumber(e) {
    my.getPhoneNumber({
      success: res => {
        // 獲取到支付寶服務(wù)器返回的加密數(shù)據(jù)
        // 其中 response 為 JSON 字符串,結(jié)構(gòu)為:'{"response":"xxxxx","sign":"xxx"}'
        const { respone, ariverRpcTraceId } = res

        // 將加密數(shù)據(jù)傳給后端,結(jié)合簽名算法和AES密鑰進(jìn)行解密獲取手機(jī)號
        my.request({
          url: '后端服務(wù)端 URL',
          data: respone,
          success: res => {
            // 解密成功返回
          },
          fail: err => {
            console.warn('my.request fail: ', err)
          }
        })
      },
      fail: err => {
        console.warn('my.getPhoneNumber fail: ', err)
      }
    })
  },

  /**
   * 獲取手機(jī)號異常,包括用戶拒絕和系統(tǒng)異常
   * @param {object} e 授權(quán)失敗回調(diào)信息
   */
  getPhoneNumberError(e) {
    console.warn('getPhoneNumberError fail: ', e)
    // 異常信息如下:
    // {
    //   type: 'error',
    //   timeStamp: 1610937854940,
    //   target: {
    //     targetDataset: {},
    //     tagName: 'button',
    //     dataset: {}
    //   },
    //   currentTarget: {
    //     tagName: 'button',
    //     dataset: {}
    //   },
    //   detail: {
    //     errorMessage: '用戶取消授權(quán)',
    //     type: 'getAuthorize'
    //   }
    // }
  }
})

后端解密

由于對后端不是很了解,具體看內(nèi)容加密指引。

常見問題

  1. 調(diào)用 my.getPhoneNumber(),報錯 isv.insufficient-isv-permissions(ISV 權(quán)限不足)。
{
  "code":"40006",
  "msg":"Insufficient Permissions",
  "subCode":"isv.insufficient-isv-permissions",
  "subMsg":"ISV權(quán)限不足,建議在開發(fā)者中心檢查對應(yīng)功能是否已經(jīng)添加,解決辦法詳見:https://docs.open.alipay.com/common/isverror"
}

原因可能是,沒有添加“獲取會員手機(jī)號”功能包或者沒有“申請用戶信息”。
解決方法:

  1. 小程序開發(fā)管理后臺能力列表中,點(diǎn)擊添加能力;
  2. 添加獲取會員手機(jī)號功能包;
  3. 點(diǎn)擊用戶信息申請;(這一步不能忽略)
  4. 申請權(quán)限中申請用戶手機(jī)號;
  5. 填寫申請原因、使用場景等信息,提交申請,等待審核。

關(guān)于添加了相關(guān)能力之后,沒有“用戶信息申請”的入口,可以看這里。

我就遇到過這個坑,是小程序一些基礎(chǔ)信息未設(shè)置,完善信息保存之后,入口就出來了。

相關(guān)鏈接

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容