codecamp

支付宝小程序API 获取会员手机号

my.getPhoneNumber

版本要求:基础库 1.16.4 或更高版本;支付宝客户端 10.1.35 或更高版本,若版本较低,建议做 兼容处理

注意: 此 API 暂仅支持企业支付宝账户使用。

获取支付宝用户绑定的手机号。因为需要用户主动触发才能发起获取手机号,所以该功能不由 API 直接调用,需用 button 组件 的点击来触发。

相关问题请参见下文 获取会员手机号 FAQ。

使用说明:目前该功能需要在开发者后台完成敏感信息申请才可以使用此功能,入口为 开发管理 > 功能列表 > 添加功能 > 获取会员手机号 > 用户信息申请,此功能需谨慎使用,若支付宝发现信息存在超出约定范围使用或者不合理使用等情况,支付宝有权永久回收该小程序的该接口权限。

使用注意

需要将 <button> 组件 open-type 的值设置为 getAuthorize,当用户点击并同意之后,可以通过my.getPhoneNumber() 接口获取到支付宝服务器返回的加密数据, 然后在第三方服务端结合签名算法和AES密钥进行解密获取手机号,若用户未授权,直接调用my.getPhoneNumber() 接口,则无法返回正确信息。

示例代码

唤起授权框,推荐兼容方案。

<button a:if="{{canIUseAuthButton}}" open-type="getAuthorize"
        onGetAuthorize="onGetAuthorize" onError="onAuthError" scope='phoneNumber'>
    授权手机号
</button>

Button属性说明

属性 说明
open-type getAuthorize 为授权组件。
scope phoneNumber
onGetAuthorize 授权成功回调(在回调里可以调用获取信息的接口)。
onError 授权失败回调(包括用户拒绝和系统异常)。

用户点击同意后,即可通过my.getPhoneNumber()获取用户绑定的手机号。

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

返回结果说明

res.response 为完整的报文数据,前端需要将该报文发送到开发者服务端做验签和解密处理,服务端解密后的明文示例如下:

正常响应

{
  "code": "10000",
  "msg": "Success",
  "mobile": "1597671905"
}
异常响应

{
  "code": "40003",
  "msg": "Insufficient Conditions",
  "subCode": "isv.invalid-auth-relations",
  "subMsg": "无效的授权关系"
}
{
  "code": "20000",
  "msg": "Service Currently Unavailable",
  "subCode": "aop.unknow-error",
  "subMsg": "系统繁忙"
}
{
  "code": "40001",
  "msg": "Missing Required Arguments",
  "subCode": "isv.missing-default-signature-type",
  "subMsg": "应用未设置默认签名类型"
}
// 解决方案:重新保存下开发者的密钥,或者设置下小程序的应用网关地址
{
  "code": "40002",
  "msg": "Invalid Arguments",
  "subCode": "isv.invalid-encrypt",
  "subMsg": "加密异常"
}
// 解决方案:按文档重新设置AES密钥

故障排查

调用 my.getPhoneNumber 获取手机号报错时,请检查以下配置内容:

  • 请检查小程序后台已添加 获取会员手机号 功能包,并已在 隐私内容申请申请手机号(若在小程序后台看不到敏感信息申请的入口,请使用主账号登录)。申请路径为:小程序后台 > 开发管理 > 功能列表添加功能 > 获取会员手机号 > 敏感信息申请。

  • 请确保小程序添加了 JSAPI 基础包 (否则会报无权限)。

  • 请确保前端 AXML 中按照 button 授权方式,先获取用户授权然后使用 my.getPhoneNumber 进行获取(否则会报无效的授权关系)。

<button a:if="{{canIUseAuthButton}}" open-type="getAuthorize" onGetAuthorize="onGetAuthorize" onError="onAuthError" scope='phoneNumber'>    授权手机号</button>
  • 请确保已在 小程序后台 > 设置 > 开发设置 中,设置 支付宝公钥aes 密钥应用网关。(若缺失这三个设置,在调用 my.getPhoneNumber 时可能只返回 response 不会返回sign)。

应用网关用于接收支付宝异步通知,例如口碑开店中,需要配置此网关来接收开发者门店被动通知 。且一个 APPID 只能配置一个对应的应用网关,应用网关以 https:// 或 http://开头

获取会员手机号 FAQ

调用 my.getPhoneNumber,报错“无效的授权关系”,如何处理?

  • 用户 主动触发 才能发起获取手机号请求,不能由 API 直接获取用户手机号,需使用 button 组件 的“点击”动作来触发操作。需要将 <button> 组件 open-type 的值设置为 getAuthorize,并将 scope 设置为 phoneNumber 。示例代码如下:

<!-- .axml -->
<button a:if="{{canIUseAuthButton}}" open-type="getAuthorize"
        onGetAuthorize="onGetAuthorize" onError="onAuthError" scope='phoneNumber'>
    授权手机号
</button>
  • 当用户点击并同意之后,可以通过 my.getPhoneNumber() 接口获取到支付宝服务器返回的加密数据, 然后在第三方服务端结合签名算法和AES密钥进行解密获取手机号,若用户未授权,直接调用 my.getPhoneNumber() 接口,则无法返回正确信息。

操作流程:

\1. 将 button 组件 open-type 的值设置为 getAuthorize。

示例代码:

<button a:if="{{canIUseAuthButton}}" open-type="getAuthorize"
        onGetAuthorize="onGetAuthorize" onError="onAuthError" scope='phoneNumber'>
    授权手机号
</button>

Button属性说明:

属性 说明
open-type 此处设置为 getAuthorize ,用于授权。
scope 此处设置为 phoneNumber ,手机号码。
onGetAuthorize 授权成功回调(在回调里可以调用获取信息的接口)。
onError 授权失败回调(包括用户拒绝和系统异常)。

\2. 用户点击并同意授权后,可以通过 my.getPhoneNumber 获取到支付宝服务器返回的加密数据, 然后在第三方服务端结合签名算法和AES密钥进行解密获取手机号。

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

调用 my.getPhoneNumber,报错“ISV权限不足”,如何处理?

报错“ISV权限不足”是由于未添加“获取会员手机号”功能包。请至小程序管理后台添加功能包。

\1. 在 小程序开发管理后台功能列表 中,点击 添加功能

添加功能.png

\2. 添加 获取会员手机号 功能包。

image.png

\3. 点击 用户信息申请

image.png

\4. 在 申请权限 中申请用户手机号。

image.png

\5. 填写申请原因、使用场景等信息,提交申请,等待审核。

image.png

返回错误码 20000/40001/40002/40003,如何处理?

错误码 错误详情 解决方案
20000 系统繁忙 稍后再试。
40001 应用未设置默认签名类型 在 小程序开发管理后台 > 设置 > 开发设置 中,设置 支付宝公钥 和 应用网关
40002 加密异常 在 小程序开发管理后台 > 设置 > 开发设置 中,设置 aes 密钥
40003 无效的授权关系 用户未同意授权,或授权已失效,可稍后再试。

返回的数据是密钥和签名,并没有获取到手机号,怎么回事?

my.getPhoneNumber 获取的是支付宝服务器返回的加密数据。

在第三方服务端结合签名算法和 AES 密钥进行解密可获取手机号。

服务端解密后的明文示例如下:

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

获取用户手机号为何没有返回 sign?

请确保已设置支付宝公钥,aes 密钥、应用网关。若缺失这三个设置任一,在调用 my.getPhoneNumber 时可能只返回 response。

支付宝小程序API 运动数据
支付宝小程序API 先享后付款
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

支付宝小程序开发文档

支付宝小程序 快速示例

支付宝小程序 小程序快速示例

支付宝小程序 框架

支付宝小程序 组件

支付宝小程序组件 基础组件

支付宝小程序组件 无障碍访问

支付宝小程序 扩展组件

支付宝小程序扩展组件 UI组件

支付宝小程序 API

支付宝小程序 开发工具

支付宝小程序 云服务

支付宝小程序 Serverless

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }