記錄下支付寶小程序獲取會員手機(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)容加密指引。
常見問題
- 調(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ī)號”功能包或者沒有“申請用戶信息”。
解決方法:
- 在小程序開發(fā)管理后臺的能力列表中,點(diǎn)擊添加能力;
- 添加獲取會員手機(jī)號功能包;
- 點(diǎn)擊用戶信息申請;(這一步不能忽略)
- 在申請權(quán)限中申請用戶手機(jī)號;
- 填寫申請原因、使用場景等信息,提交申請,等待審核。
關(guān)于添加了相關(guān)能力之后,沒有“用戶信息申請”的入口,可以看這里。
我就遇到過這個坑,是小程序一些基礎(chǔ)信息未設(shè)置,完善信息保存之后,入口就出來了。