产品介绍
简介
获取会员手机号旨在帮助商家便捷获取用户联系方式,在获得用户充分授权和认可且充分保护用户隐私的前提下,快速创建会员体系或开展其他业务。有关获取会员手机号能力的详细介绍,请参见 获取会员手机号。
准入条件
开发者需充分尊重用户个人隐私,妥善使用手机号码的使用范围,不得随意打扰用户。若发现信息存在超出约定范围使用或者不合理使用等情况,平台有权永久收回接口权限。
为进一步规约和确认安全资质,开发者需加入 蚂蚁数据安全与隐私保障联盟,并严格遵守《支付宝开放平台用户信息处理规范》、《开放平台第三方应用安全开发指南》。
收费模式
免费。
接入流程
接入准备
第一步:创建应用及模板
系统服务商(ISV)需 创建第三方应用 并 创建小程序模板 后才可接入获取会员手机号能力。
第二步:添加能力
登录 开放平台控制台 >选择相应的第三方应用并点击进入管理后台 > 在 能力列表 中点击 添加能力 > 选择添加 获取会员手机号 和 应用AES密钥管理 能力。
第三步:配置应用
接入获取会员手机号能力前,ISV 需为模板所属第三方应用配置 应用网关、接口内容加密方式 。
1. 配置应用网关
登录 开放平台控制台 >选择相应的第三方应用并点击进入管理后台 > 开发管理,在 开发信息 > 应用网关 中,点击 设置。
输入 ISV 服务器的网关,选择加签方式,点击 确定。应用网关应符合以下要求:
支持所设置的加签方式;
外网可访问;
可接收 post 数据 。
2. 配置接口内容加密方式
登录 开放平台控制台 >选择相应的第三方应用并点击进入管理后台 > 设置 > 开发信息 > 在 接口内容加密方式 中,点击 设置。
确认提示内容,点击 生成新密钥,即完成配置。
模板开发
第一步:接口调用
1. 小程序端获取信息
ISV 在小程序端调用 my.getPhoneNumber 接口,在用户授权后获取加密的手机号信息。再将接口返回的结果通过 my.request 接口传入第三方应用的网关地址。
注意:
ISV 代商家获取用户手机号信息时需传入 isvAppID(第三方应用 AppID)。
使用 protocols 要求 基础库 版本为 1.22.0 及以上;支付宝客户端版本为 10.1.72 及以上。请使用
my.canIUse('getPhoneNumber.object.protocols')
进行 兼容处理。
示例代码:
my.canIUse('getPhoneNumber.object.protocols')//兼容性处理my.getPhoneNumber({ protocols:{ // 小程序模板所属的第三方应用APPID isvAppId: '第三方应用APPID' }, success: (res) => { let encryptedData = res.response; // 手机号及签名加密信息 my.request({ url: 'ISV服务端地址', data: encryptedData, }); }, fail: (res) => { console.log(res); console.log('getPhoneNumber_fail'); },});
2. 服务端解密
ISV 需在服务端解密小程序端返回的手机号信息,JAVA 解密示例如下(更多语言验签及解密示例详情参见 内容加密指引)。
注意:
服务端解密时,需使用商家小程序 AES 密钥。
调试小程序模板时,使用模板 AES 密钥。
示例代码:
public void decryptPhoneNum(){ String response ="";// 前端接口返回的加密信息 //1. 获取解密所需要的参数 Map<String, String> openapiResult = JSON.parseObject(response, new TypeReference<Map<String, String>>() { }, Feature.OrderedField); String charset = "UTF-8"; String encryptType = "AES"; String content = openapiResult.get("response"); // 判断是否为加密内容 boolean isDataEncrypted = !content.startsWith("{"); String decryptKey = "B_AES_KEY"; // 商家小程序 AES 密钥 //AES密钥,这里参数不能写成固定的,开发阶段需传入模板的AES密钥,实例化后应传入商家小程序的AES密钥 // 解密 String plainData = null; if (isDataEncrypted) { try { System.out.println("AlipayEncrypt"); plainData = AlipayEncrypt.decryptContent(content, encryptType, decryptKey,charset); System.out.println("AlipayEncrypt Trance done"); } catch (AlipayApiException e) { //解密异常, 记录日志 try { throw new Exception("解密异常"); } catch (Exception e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } } else { plainData = content; } System.out.println(plainData);}
第二步:模板调试
ISV 完成模板开发后,在提审模板前需在本地进行功能调试,完成调试后即可提审发布为服务,供商家订购使用。
1. 模板授权
ISV 将小程序模板授权给第三方应用,详情参见 将模板授权给所属第三方应用。
2. 配置 AES 密钥
ISV 需调用 alipay.open.auth.app.aes.set(授权应用aes密钥设置) 接口,以第三方应用自调用(即不传 app_auth_token)方式为小程序模板设置 接口内容加密方式(即 AES 密钥)。
示例代码:
//encryptKey填入当前第三方应用的AES密钥,encryptType为"AES" AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do","第三方应用APPID","第三方应用私钥","json","GBK","第三方应用的支付宝公钥","RSA2","encryptKey","encryptType");AlipayOpenAuthAppAesSetRequest request = new AlipayOpenAuthAppAesSetRequest();request.setBizContent ("{" + //为模板设置就填写小程序模板APPID,为商家设置就填写商家小程序APPID "\"merchant_app_id\":\"20191223601234500\"" + "}");AlipayOpenAuthAppAesSetResponse response = alipayClient.execute(request);if (response.isSuccess ()){ System.out.println ( response.getAesKey()); System.out.println ("调用成功");} else { System.out.println ("调用失败");}
注意:
配置 AES 密钥场景构造 alipayClient 时,构造方法中需传入 encryptKey 和 encryptType,encryptKey 为当前第三方应用的 AES 密钥,encryptType 为固定值 AES。
merchant_app_id:应用的 APPID,代模板设置时传入小程序模板 APPID,代商家小程序设置时传入商家小程序 APPID。
ISV 还可调用 alipay.open.auth.app.aes.get(授权应用aes密钥查询)接口(不传 app_auth_token),查询已授权给第三方应用的小程序模板或小程序应用的 AES 密钥。
//encryptKey填入当前第三方应用的AES密钥,encryptType为"AES" AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do","第三方应用APPID","第三方应用私钥","json","GBK","第三方应用的支付宝公钥","RSA2","encryptKey","encryptType");AlipayOpenAuthAppAesGetRequest request = new AlipayOpenAuthAppAesGetRequest();request.setBizContent ("{" + "\"merchant_app_id\":\"20191223601234500\"" + //填写需查询密钥的应用APPID "}" );AlipayOpenAuthAppAesGetResponse response = alipayClient.execute(request);if (response.isSuccess ()){ System.out.println(response.getAesKey()); System.out.println( "调用成功" );} else { System.out.println( "调用失败" );}
3. 代模板申请用户信息
代模板申请用户信息后,模板才有权限获取会员手机号。
注意:会员手机号信息仅支持部分行业类目及使用场景申请,其余行业及场景申请将被驳回。支持行业详情参见 用户信息申请主营行业&使用场景汇总表。
登录 开放平台控制台 >选择相应的第三方应用并点击进入管理后台 > 功能管理 > 获取会员手机号,点击 代申请用户信息。
选择需要申请用户信息的小程序模板,点击 下一步。
选择类目和用户信息,点击 下一步。
阅读了解相关规范,并如实详细填写申请信息。确认无误后,点击 提交申请。
审核时长约为 2~3 个工作日,审核通过后可获得该信息字段的权限。可登录 支付宝开放平台,进入 控制台 > 第三方应用详情 > 功能管理 > 获取会员手机号,点击代申请用户信息 ,点击 已提交的申请,进入页面后,查看 状态 列,即可获取当前审核状态。
4. 测试功能
完成上述步骤后,服务商可将小程序模板模拟作普通小程序, 真机调试 获取用户手机号信息并在服务端解密。
功能验证通过后即可提审上架。
代商家接入
ISV 需代商家申请用户信息、设置商家小程序 AES 密钥后,再 构建商家小程序版本,否则商家小程序将无法正常运行获取会员手机号能力。
设置商家小程序 AES 密钥的操作,请参见 模板代码实现。
第一步:商家订购
商家订购小程序模板后,服务商可根据如下流程代商家接入本功能。
注意:ISV 需代商家申请用户信息、设置商家小程序 AES 密钥后,再 构建商家小程序版本,否则商家小程序将无法正常运行获取会员手机号能力。设置商家小程序 AES 密钥的操作,详见 模板代码实现。
第二步:构建商家小程序版本
开发者需为商家小程序设置 内容加密方式(即 AES 密钥)再 构建商家小程序版本,否则商家小程序将无法正常运行获取会员手机号能力。
AES 密钥配置详情参见上文 模板开发 > 第二步:模板调试 > 配置 AES 密钥。
构建商家小程序版本详情参见 构建商家小程序版本。
第三步:配置小程序类目
ISV 代商家小程序申请用户信息前,需调用 alipay.open.mini.category.query(小程序类目树查询)接口查询商家小程序可用类目,再调用 alipay.open.mini.baseinfo.modify(小程序修改基础信息)接口,代商家小程序设置 mini_category_ids(前台类目即小程序主营行业类目)。详情参见上文 模板开发 > 第二步:模板调试 > 配置模板前台类目。
说明:会员手机号信息申请仅开放给部分行业类目及场景,其余行业及场景申请将被驳回,详情参见 用户信息申请主营行业&使用场景汇总表。
商家小程序后台效果:
第四步:代商家小程序申请用户信息
登录 开放平台控制台 > 选择相应的第三方应用并点击进入管理后台 > 功能管理 > 获取会员手机号,点击 代申请用户信息。
选择需要申请用户信息的商家小程序,后续步骤与上文 模板开发 > 第二步:模板调试 > 代模板申请用户信息 一致。
第五步:进行测试
实例化商家小程序 后,在体验版中测试商家小程序是否能成功获取会员手机号,如不能,可参见下方 FAQ。若体验版正常无误,可进行 提审商家小程序。
FAQ
Q1:一个第三方应用最多只能代多少个授权的商家应用获取手机号?
A:ISV 在界面申请时单次最多可代 50 个已授权的应用申请用户信息,其余无数量限制。
Q2:提示 isv.missing-encrypt-key 缺少加密配置的报错?
A:需要调用 alipay.open.auth.app.aes.set 接口给模板小程序设置 AES 密钥。
Q3:代商户获取手机号,获取手机号时,没有传回 sign,是什么原因?
A:检查小程序后台是否配置接口加签方式、AES 密钥、应用网关。
Q4:模板代申请用户手机号屡次被拒,驳回原因应用名称被释放,如何解决?
A:建议提交审核时做修改。或登录 商家中心,点击首页右侧浮窗在线咨询。
Q5:代商户申请手机号,有的商户不可以申请,什么原因?
A:并不是所有小程序都可以获取用户手机号的,和小程序行业、商家风险等相关。