支付宝小程序:ISV 代商户获取会员手机号

小编:啊南 163阅读 2020.12.28

为简化广大商户的接入流程,同时丰富第三方服务开发者(即系统服务商,下称 ISV)的代调用场景,支付宝开放平台目前支持第三方服务开发者代商户获取用户手机号。 在代商户获取手机号前,第三方服务开发者需要选择 模板开发模式 或者 代开发模式 两种方式之一代商户开发小程序。以下分别介绍在两种模式下,第三方服务开发者代商户获取手机号的步骤。

注意:

  • ISV 代商户获取用户信息前,需为商户小程序添加小程序经营类目(否则不会展示 申请用户信息 入口)。

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

小程序模板开发模式

请参见 模板模式接入获取会员手机号。

代开发模式一、创建应用
  1. 创建应用:商户在 ISV 引导下或者商户自主创建小程序,并添加 ISV 的开发人员为小程序开发者,详情参见 详细步骤;

  2. 添加功能:ISV 创建第三方应用,并在第三方应用的 功能管理 页面添加 获取会员手机号 和 应用AES密钥管理 功能;

  3. 申请信息:ISV 按照如上模板开发模式图示指引,在第三方应用的管理中心替代商户提交相关材料(如使用场景、使用流程和 demo 等),ISV 可以通过自有渠道或系统在商户订购时向商户收集这些资料;ISV 也可以引导商户在商户的小程序管理中心添加 获取会员手机号 功能并 申请用户信息;

  4. 应用授权:在用户信息申请审批通过后(约为一个工作日)ISV 发起授权,商户同意后将小程序授权给 ISV 的第三方应用,详见 代开发授权 指引,详见 授权步骤指引。

二、代开发
  1. 小程序端开发:ISV 帮助商户在小程序开发工具(IDE)内完成 获取会员手机号 功能开发,调用 my.getPhoneNumber 接口时需入参 protocols#isvAppId (即第三方应用 appId),再将接口返回的结果通过 my.request 接口传入 ISV 第三方应用的网关。

注意:使用 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: '你的服务端地址',            data: encryptedData,        });    },    fail: (res) => {        console.log(res);        console.log('getPhoneNumber_fail');   },});
  1. 服务端解密:ISV 通过 获取应用 AES 密钥 功能,按照文档指引使用 response.getAesKey() 获取商户小程序的 AES 密钥。后续 ISV 可通过商户的 AES 密钥解密第三方应用网关收到的返回值,即可代商户解密用户手机号,解密参见文末 解密手机号。

    • 若商户小程序未设置 AES 密钥 ISV 需代商家 设置/更新 AES 密钥。

    • 若商户小程序已设置 AES 密钥 ISV 需 查询商家 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 = "your_AES_KEY"; // 商户小程序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);}
扩展功能

开发者根据需求获取到用户手机号信息后可用于自身业务。例如:在 商户会员卡 功能中,用户开取会员卡时自动获取用户手机号信息无需用户手动填写,为用户提供便利、提升用户体验。参考流程如下(更多场景需开发者根据自身情况接入):

  1. 开发者调用?alipay.marketing.card.template.create(会员卡模板创建接口)创建好会员卡模板;

  2. 用户授权商户获取其手机号场景下开发者可调用 alipay.marketing.card.formtemplate.set (会员卡开卡表单模板配置接口?)配置该模板无需用户填写手机号。

示例代码

AlipayMarketingCardFormtemplateSetRequest request = new AlipayMarketingCardFormtemplateSetRequest();rtttrequest.setBizContent("{" +rttt//会员卡模板id。使用会员卡模板创建接口(alipay.marketing.card.template.create)返回的结果rttt""template_id":"20200507000000002285737000300291"," +rttt""fields":{" +rttt""required":"{"common_fields":["OPEN_FORM_FIELD_NAME","OPEN_FORM_FIELD_CITY"]}"," +rttt""optional":"{"common_fields":["OPEN_FORM_FIELD_GENDER","OPEN_FORM_FIELD_EMAIL","OPEN_FORM_FIELD_MOBILE"]}"" +rttt"}" +rttt"}");rtttAlipayMarketingCardFormtemplateSetResponse response;rttttry {rttttresponse = alipayClient.execute(request);rttttif(response.isSuccess()){rtttttSystem.out.println("调用成功");rtttttSystem.out.println(response.getBody());rtttt} else {rtttttSystem.out.println("调用失败");rtttt}rttt} catch (AlipayApiException e) {rtttt// TODO Auto-generated catch blockrtttte.printStackTrace();rttt}
  1. 配置完成后开发者需调用?alipay.marketing.card.activateurl.apply( 获取会员卡领卡投放链接接口)生成该会员卡模板领卡链接 apply_card_url ,在小程序端调用?my.addCardAuth 接口传入 decode 后的 apply_card_url 参数唤起开卡页面。

小程序端示例代码如下:

onOpenCard(){r  my.addCardAuth({r// alipay.marketing.card.activateurl.apply 接口返回值需decode后再入参r  url: 'https://memberprod.alipay.com/account/openform/activecard.htm?app_id=201911156900000&template_id=202005070000000000000000&__webview_options__=canPullDown%3dNO%26transparentTitle%3dauto&out_string=20192839300001&follow_id=20150000000000000',r  success: (res) => {r    console.log(JSON.stringify(res));r  },r  fail: (res) => {r    console.log(JSON.stringify(res));r  },r});r},
  1. 用户填写完信息提交开卡申请后,开发者调用?alipay.marketing.card.activateform.query?(查询用户提交的会员卡表单信息接口)获取填写信息,连同用户授权后获取到的手机号信息一同传入?alipay.marketing.card.open(会员卡开卡接口)中完成会员卡开卡操作。用户即使不填写手机号会员卡中也会附带会员手机号信息。

开卡接口示例代码如下:

AlipayMarketingCardOpenRequest request = new AlipayMarketingCardOpenRequest();rttrttrequest.setBizContent("{" +rtt""out_serial_no":"202006120000002545454"," +r// 外部商户流水号(商户需要确保唯一性控制,类似request_id唯一请求标识)rtt""card_template_id":"20191126000000002143823000300299"," +rtt""card_user_info":{" +rtt//20880016667403408024050432912929rtt""user_uni_id":"2088531802445291"," +rtt""user_uni_id_type":"UID""+rtt"}," +rtt ""card_ext_info":{"external_card_no":"DEMO001","// 商户会员卡卡号rt        + ""open_date":"2019-10-08 14:20:00","valid_date":"2022-02-20 21:20:46","level":"VIP1","point":"88","balance":"124.89"}," rt        +""member_ext_info":{"name":"支小宝","city":"杭州","cell":"18111111111"}}");rttAlipayMarketingCardOpenResponse response;rtttry {rttt//accessTokenrtttresponse = alipayClient.execute(request,"composeB2c5a108b82d14e39945c493959703D29");rtttif(response.isSuccess()){rttttSystem.out.println(response.getBody());rttttSystem.out.println("调用成功");rttt} else {rttttSystem.out.println("调用失败");rttt}rtt} catch (AlipayApiException e) {rttt// TODO Auto-generated catch blockrttte.printStackTrace();rtt}
关联标签: