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

小编:啊南 1938阅读 2020.12.28

产品介绍简介

获取会员手机号旨在帮助开发者便捷获取联系方式,在获得用户充分授权和认可,且充分保护用户隐私的前提下快速创建开发者的会员体系或开展其他业务。

获取会员手机号功能提供了一套基于国际标准的 OAuth2.0 授权机制的 JSAPI,在用户授权的情况下,得到用于换取用户信息的令牌,通过调用获取会员手机号接口并获取相关信息。避免了开发者需要对接支付宝网关的成本。

使用限制
  • 用户点击并同意授权后,商户可以通过 my.getPhoneNumber 获取到支付宝服务器返回的加密数据, 并通过 AES 密钥进行解密获取手机号,方法详见 敏感信息加解密方法。

  • 如果开发者需要获取除了手机号之外的其他信息,可以参考 获取会员基础信息 功能。两项功能需要单独进行,不能在用户一次授权中同时进行。

  • 解密时使用的 decryptKey 解密密钥就是 AES 密钥 。应用案例

  1. 在用户进行需要手机号的场景操作时(如外卖下单、快递送货)使用该能力获取手机号;

  2. 用户点击行动按钮,系统唤起手机号授权弹框;

  3. 用户同意授权后,即可通过接口获取用户绑定的手机号。

    注意:通过用户信息授权方式获取用户手机号是只一种快捷的填写方式,需要对用户拒绝的情况做充分的兜底措施(如引导用户手动填写)。image.png

准入条件
  • 该能力仅对企业支付宝账户开放。

  • 开发者需充分尊重用户个人隐私,妥善使用手机号码的使用范围,不得随意打扰用户。若发现信息存在超出约定范围使用或者不合理使用等情况,平台有权永久收回接口权限。

  • 为进一步规约和确认安全资质,开发者需加入 蚂蚁数据安全与隐私保障联盟,并严格遵守《支付宝开放平台用户信息处理规范》、《开放平台第三方应用安全开发指南》。

计费模式

免费。

接入指引第一步:创建小程序

要在您的小程序内使用?获取会员手机号,您需要首先完成?开发者入驻?并?创建小程序。

注意:接入获取会员手机号功能前,开发者需要在小程序后台配置 接口内容加密方式(即 AES 密钥)?。

第二步:添加能力

小程序创建完成后,开发者登录?开放平台控制台?> 找到已创建的小程序 > 点击进入小程序管理后台 > 在 版本管理 页面的 能力列表 部分点击添加能力 > 勾选 获取会员手机号 能力并点击 确定 完成能力添加。添加完成的能力状态显示为 已生效 即可使用该能力。但还需 申请用户信息 获得用户手机号获取权限。

,需如实填写相关信息(如使用场景、使用流程和 demo 等)完成申请。

支付宝会对您提交的用户信息申请进行审核,还请耐心等待,审核时间为一个工作日左右,在审核完成后,功能的状态会变为 已获取。

注意:

  • 请确认当前登陆的账号为主账号,否则功能列表无法显示?申请用户信息?入口。

  • 创建小程序时若未指定小程序类目需在对应小程序详情页?小程序信息?中补充?主营行业?,否则功能列表无法显示?申请用户信息?入口。

  • 若已配置小程序类目但仍无 申请用户信息 入口,表示该类目不支持申请此用户信息。类目.png

第四步:调用接口获取加密手机号

开发者在用户信息申请通过后,通过调用?my.getPhoneNumber 在用户授权后获取加密后的手机号信息。

示例代码
my.getPhoneNumber({r    success: (res) => {r        let encryptedData = res.response;r        my.request({r            url: '你的后端服务端',r            data: encryptedData,r        });r    },r    fail: (res) => {r        console.log(res);r        console.log('getPhoneNumber_fail');r    },r});r
解密手机号

商户得到的返回数据需要通过 AES 密钥进行解密获取手机号,方法详见 敏感信息加解密方法。

解密及验签示例
public void decryptPhoneNum(){r        String response ="";// 前端接口返回的加密信息        r//1. 获取解密所需要的参数        rMap openapiResult = JSON.parseObject(response,r      new TypeReference>() {r        }, Feature.OrderedField);r        String charset = "UTF-8";r        String encryptType = "AES";r        String content = openapiResult.get("response");r        // 判断是否为加密内容       r        boolean isDataEncrypted = !content.startsWith("{");r        String decryptKey = "your_AES_KEY";r    //AES密钥,这里参数不能写成固定的,开发阶段需传入应用的AES密钥,实例化后应传入商家小程序的AES密钥r        // 解密        r        String plainData = null;r        if (isDataEncrypted) {r            try {r                System.out.println("AlipayEncrypt");r                plainData = AlipayEncrypt.decryptContent(content, encryptType, decryptKey,charset);r                System.out.println("AlipayEncrypt Trance done");r            } catch (AlipayApiException e) {r                //解密异常, 记录日志                r                try {r                    throw new Exception("解密异常");r                } catch (Exception e1) {r                    // TODO Auto-generated catch block                    r                    e1.printStackTrace();r                }r            }r        } else {r            plainData = content;r        }r        System.out.println(plainData);r}r

API 列表

接口名称 接口描述
my.getPhoneNumber 获取会员手机号码

如果您在调用 API 时出现报错:


  • 欢迎前往?开放社区?提问、留言。

  • 在?公共错误码?中根据错误码的类型,查找相关错误码及解决方案。

  • 在?蚂蚁问答?问答页面直接输入您遇到的错误码。

  • 在?云排查?中排查遇到的问题。

  • 您还可以在?文档中心?直接搜索您要的答案。


常见问题Q:开发者可以在小程序的一个授权弹窗内同时授权获取会员手机号和基础信息吗?

A:不可以。获取会员基础信息和会员手机号通过两个 JSAPI 调用,分别获取;同时为了充分尊重用户的知情权和个人信息,建议开发者在业务需要的情况下再唤起授权,不要获取与业务无关的信息。

Q:调用 my.getPhoneNumber,报错“isv.insufficient-isv-permissions(ISV 权限不足)”,如何处理??

A: 报错原因分析:

ISV 权限不足 是可能是由于未添加 获取会员手机号 功能包或未 申请用户信息

解决方案:

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

  2. 添加?获取会员手机号?功能包;

  3. 点击 用户信息申请

  4. 申请权限 中申请用户手机号;

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

注意:

请确认后端代码中传入的 APPID 与 PID 需要对应添加功能包且申请用户信息的小程序与账号信息。

Q:已添加获取会员手机号功能包后调用接口获取会员手机号报错 "isv.insufficient-isv-permissions(ISV 权限不足)"是怎么回事?

A:获取会员手机号功能在 添加功能包 后还需 申请用户信息

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

A: 常见错误码如下表:

错误码

错误详情

解决方案

20000

系统繁忙

稍后再试。

40001

应用未设置默认签名类型

在?小程序开发管理后台?> 设置 > 开发设置?中,设置?支付宝公钥?和?应用网关

40002

加密异常

在?小程序开发管理后台?> 设置 > 开发设置?中,设置?AES 密钥,AES相关信息可参见?内容加密接入指引。

40003

无效的授权关系

用户未同意授权,或授权已失效,可稍后再试。

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

A: 用户主动触发才能发起获取手机号请求,不能由 API 直接获取用户手机号,需使用 button 组件?的“点击”动作来触发操作。

操作流程:

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

示例代码:







Button 属性说明:

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

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




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




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

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

在第三方服务端结合签名算法和 AES 密钥进行解密可获取手机号,方法详见?敏感信息加解密方法。

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




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




Q:申请“获取会员手机号”功能包总是被驳回,怎么回事?

A:?因为企业提交的资料不合格,或者没说清业务场景。

Q:调用接口时报错“Missing Required Arguments”

A:开发者需要配置 AES 密钥进行解密,方法详见 敏感信息加解密方法。

Q:获取用户手机号时报错 “解密出错,Invalid AES key length: 1218 bytes” 怎么办?

A:出现原因可能是使用的 AES 密钥错误,需要在小程序后台中获取正确的 AES 密钥 (参见 安全设置 > AES密钥获取)。

Q:小程序获取手机号解密 decryptKey 解密密钥指的是什么?

A:decryptKey 解密密钥就是 AES 密钥 。

Q:获取用户手机号码返回的手机有没有区号?

A:没有,获取到的加密信息解密后为正常的 11 位手机号码。

Q:三方应用可以获取会员手机号吗?

A:三方应用暂不支持获取会员手机号功能。

Q:为什么获取到用户手机号加密信息解密结果为 null ?r

A:

  1. 添加获取会员手机号后还需申请用户信息才能解密成功r;

  2. 检查解密方法是否正确,方法详见 敏感信息加解密方法。

Q:为什么获取用户手机号的返回值没有 sign r?

A:在 小程序后台 > 设置 > 开发设置 中设置支付宝公钥、AES 秘钥、应用网关。缺失这三个设置在调用 my.getPhoneNumber 时可能只返回 response 不会返回 sign。r


关联标签: