支付寶小程序API 獲取會(huì)員手機(jī)號(hào)

2020-09-16 15:50 更新

my.getPhoneNumber

版本要求:基礎(chǔ)庫(kù) 1.16.4 或更高版本;支付寶客戶端 10.1.35 或更高版本,若版本較低,建議做 兼容處理。

注意: 此 API 暫僅支持企業(yè)支付寶賬戶使用。

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

相關(guān)問(wèn)題請(qǐng)參見(jiàn)下文 獲取會(huì)員手機(jī)號(hào) FAQ。

使用說(shuō)明:目前該功能需要在開(kāi)發(fā)者后臺(tái)完成敏感信息申請(qǐng)才可以使用此功能,入口為 開(kāi)發(fā)管理 > 功能列表 > 添加功能 > 獲取會(huì)員手機(jī)號(hào) > 用戶信息申請(qǐng),此功能需謹(jǐn)慎使用,若支付寶發(fā)現(xiàn)信息存在超出約定范圍使用或者不合理使用等情況,支付寶有權(quán)永久回收該小程序的該接口權(quán)限。

使用注意

需要將 <button> 組件 open-type 的值設(shè)置為 getAuthorize,當(dāng)用戶點(diǎn)擊并同意之后,可以通過(guò)my.getPhoneNumber() 接口獲取到支付寶服務(wù)器返回的加密數(shù)據(jù), 然后在第三方服務(wù)端結(jié)合簽名算法和AES密鑰進(jìn)行解密獲取手機(jī)號(hào),若用戶未授權(quán),直接調(diào)用my.getPhoneNumber() 接口,則無(wú)法返回正確信息。

示例代碼

喚起授權(quán)框,推薦兼容方案。

<button a:if="{{canIUseAuthButton}}" open-type="getAuthorize"
        onGetAuthorize="onGetAuthorize" onError="onAuthError" scope='phoneNumber'>
    授權(quán)手機(jī)號(hào)
</button>

Button屬性說(shuō)明

屬性 說(shuō)明
open-type getAuthorize 為授權(quán)組件。
scope phoneNumber
onGetAuthorize 授權(quán)成功回調(diào)(在回調(diào)里可以調(diào)用獲取信息的接口)。
onError 授權(quán)失敗回調(diào)(包括用戶拒絕和系統(tǒng)異常)。

用戶點(diǎn)擊同意后,即可通過(guò)my.getPhoneNumber()獲取用戶綁定的手機(jī)號(hào)。

my.getPhoneNumber({
    success: (res) => {
        let encryptedData = res.response;
        my.request({
            url: '你的后端服務(wù)端',
            data: encryptedData,
        });
    },
    fail: (res) => {
        console.log(res);
        console.log('getPhoneNumber_fail');
    },
});

返回結(jié)果說(shuō)明

res.response 為完整的報(bào)文數(shù)據(jù),前端需要將該報(bào)文發(fā)送到開(kāi)發(fā)者服務(wù)端做驗(yàn)簽和解密處理,服務(wù)端解密后的明文示例如下:

正常響應(yīng)

{
  "code": "10000",
  "msg": "Success",
  "mobile": "1597671905"
}
異常響應(yīng)

{
  "code": "40003",
  "msg": "Insufficient Conditions",
  "subCode": "isv.invalid-auth-relations",
  "subMsg": "無(wú)效的授權(quán)關(guān)系"
}
{
  "code": "20000",
  "msg": "Service Currently Unavailable",
  "subCode": "aop.unknow-error",
  "subMsg": "系統(tǒng)繁忙"
}
{
  "code": "40001",
  "msg": "Missing Required Arguments",
  "subCode": "isv.missing-default-signature-type",
  "subMsg": "應(yīng)用未設(shè)置默認(rèn)簽名類型"
}
// 解決方案:重新保存下開(kāi)發(fā)者的密鑰,或者設(shè)置下小程序的應(yīng)用網(wǎng)關(guān)地址
{
  "code": "40002",
  "msg": "Invalid Arguments",
  "subCode": "isv.invalid-encrypt",
  "subMsg": "加密異常"
}
// 解決方案:按文檔重新設(shè)置AES密鑰

故障排查

調(diào)用 my.getPhoneNumber 獲取手機(jī)號(hào)報(bào)錯(cuò)時(shí),請(qǐng)檢查以下配置內(nèi)容:

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

  • 請(qǐng)確保小程序添加了 JSAPI 基礎(chǔ)包 (否則會(huì)報(bào)無(wú)權(quán)限)。

  • 請(qǐng)確保前端 AXML 中按照 button 授權(quán)方式,先獲取用戶授權(quán)然后使用 my.getPhoneNumber 進(jìn)行獲取(否則會(huì)報(bào)無(wú)效的授權(quán)關(guān)系)。

<button a:if="{{canIUseAuthButton}}" open-type="getAuthorize" onGetAuthorize="onGetAuthorize" onError="onAuthError" scope='phoneNumber'>    授權(quán)手機(jī)號(hào)</button>
  • 請(qǐng)確保已在 小程序后臺(tái) > 設(shè)置 > 開(kāi)發(fā)設(shè)置 中,設(shè)置 支付寶公鑰,aes 密鑰應(yīng)用網(wǎng)關(guān)。(若缺失這三個(gè)設(shè)置,在調(diào)用 my.getPhoneNumber 時(shí)可能只返回 response 不會(huì)返回sign)。

應(yīng)用網(wǎng)關(guān)用于接收支付寶異步通知,例如口碑開(kāi)店中,需要配置此網(wǎng)關(guān)來(lái)接收開(kāi)發(fā)者門(mén)店被動(dòng)通知 。且一個(gè) APPID 只能配置一個(gè)對(duì)應(yīng)的應(yīng)用網(wǎng)關(guān),應(yīng)用網(wǎng)關(guān)以 https:// 或 http://開(kāi)頭

獲取會(huì)員手機(jī)號(hào) FAQ

調(diào)用 my.getPhoneNumber,報(bào)錯(cuò)“無(wú)效的授權(quán)關(guān)系”,如何處理?

  • 用戶 主動(dòng)觸發(fā) 才能發(fā)起獲取手機(jī)號(hào)請(qǐng)求,不能由 API 直接獲取用戶手機(jī)號(hào),需使用 button 組件 的“點(diǎn)擊”動(dòng)作來(lái)觸發(fā)操作。需要將 <button> 組件 open-type 的值設(shè)置為 getAuthorize,并將 scope 設(shè)置為 phoneNumber 。示例代碼如下:

<!-- .axml -->
<button a:if="{{canIUseAuthButton}}" open-type="getAuthorize"
        onGetAuthorize="onGetAuthorize" onError="onAuthError" scope='phoneNumber'>
    授權(quán)手機(jī)號(hào)
</button>
  • 當(dāng)用戶點(diǎn)擊并同意之后,可以通過(guò) my.getPhoneNumber() 接口獲取到支付寶服務(wù)器返回的加密數(shù)據(jù), 然后在第三方服務(wù)端結(jié)合簽名算法和AES密鑰進(jìn)行解密獲取手機(jī)號(hào),若用戶未授權(quán),直接調(diào)用 my.getPhoneNumber() 接口,則無(wú)法返回正確信息。

操作流程:

\1. 將 button 組件 open-type 的值設(shè)置為 getAuthorize。

示例代碼:

<button a:if="{{canIUseAuthButton}}" open-type="getAuthorize"
        onGetAuthorize="onGetAuthorize" onError="onAuthError" scope='phoneNumber'>
    授權(quán)手機(jī)號(hào)
</button>

Button屬性說(shuō)明:

屬性 說(shuō)明
open-type 此處設(shè)置為 getAuthorize ,用于授權(quán)。
scope 此處設(shè)置為 phoneNumber ,手機(jī)號(hào)碼。
onGetAuthorize 授權(quán)成功回調(diào)(在回調(diào)里可以調(diào)用獲取信息的接口)。
onError 授權(quán)失敗回調(diào)(包括用戶拒絕和系統(tǒng)異常)。

\2. 用戶點(diǎn)擊并同意授權(quán)后,可以通過(guò) my.getPhoneNumber 獲取到支付寶服務(wù)器返回的加密數(shù)據(jù), 然后在第三方服務(wù)端結(jié)合簽名算法和AES密鑰進(jìn)行解密獲取手機(jī)號(hào)。

my.getPhoneNumber({
    success: (res) => {
        let encryptedData = res.response;
        my.httpRequest({
            url: '你的后端服務(wù)端',
            data: encryptedData,
        });
    },
    fail: (res) => {
        console.log(res);
        console.log('getPhoneNumber_fail');
    },
});

調(diào)用 my.getPhoneNumber,報(bào)錯(cuò)“ISV權(quán)限不足”,如何處理?

報(bào)錯(cuò)“ISV權(quán)限不足”是由于未添加“獲取會(huì)員手機(jī)號(hào)”功能包。請(qǐng)至小程序管理后臺(tái)添加功能包。

\1. 在 小程序開(kāi)發(fā)管理后臺(tái)功能列表 中,點(diǎn)擊 添加功能。

添加功能.png

\2. 添加 獲取會(huì)員手機(jī)號(hào) 功能包。

image.png

\3. 點(diǎn)擊 用戶信息申請(qǐng)

image.png

\4. 在 申請(qǐng)權(quán)限 中申請(qǐng)用戶手機(jī)號(hào)。

image.png

\5. 填寫(xiě)申請(qǐng)?jiān)?、使用?chǎng)景等信息,提交申請(qǐng),等待審核。

image.png

返回錯(cuò)誤碼 20000/40001/40002/40003,如何處理?

錯(cuò)誤碼 錯(cuò)誤詳情 解決方案
20000 系統(tǒng)繁忙 稍后再試。
40001 應(yīng)用未設(shè)置默認(rèn)簽名類型 在 小程序開(kāi)發(fā)管理后臺(tái) > 設(shè)置 > 開(kāi)發(fā)設(shè)置 中,設(shè)置 支付寶公鑰 和 應(yīng)用網(wǎng)關(guān)。
40002 加密異常 在 小程序開(kāi)發(fā)管理后臺(tái) > 設(shè)置 > 開(kāi)發(fā)設(shè)置 中,設(shè)置 aes 密鑰。
40003 無(wú)效的授權(quán)關(guān)系 用戶未同意授權(quán),或授權(quán)已失效,可稍后再試。

返回的數(shù)據(jù)是密鑰和簽名,并沒(méi)有獲取到手機(jī)號(hào),怎么回事?

my.getPhoneNumber 獲取的是支付寶服務(wù)器返回的加密數(shù)據(jù)。

在第三方服務(wù)端結(jié)合簽名算法和 AES 密鑰進(jìn)行解密可獲取手機(jī)號(hào)。

服務(wù)端解密后的明文示例如下:

{
  "code": "10000",
  "msg": "Success",
  "mobile": "18818181818"
}

獲取用戶手機(jī)號(hào)為何沒(méi)有返回 sign?

請(qǐng)確保已設(shè)置支付寶公鑰,aes 密鑰、應(yīng)用網(wǎng)關(guān)。若缺失這三個(gè)設(shè)置任一,在調(diào)用 my.getPhoneNumber 時(shí)可能只返回 response。

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

掃描二維碼

下載編程獅App

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

編程獅公眾號(hào)