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

2020-09-16 15:50 更新

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。

以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号