支付宝小程序:代开发模式接入获取会员手机号

小编:啊南 1841阅读 2020.12.28

简介

获取会员手机号旨在帮助商家便捷获取用户联系方式,在获得用户充分授权和认可,且充分保护用户隐私的前提下快速创建会员体系或开展其他业务。更多能力的介绍,请参见?获取会员手机号。

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

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

收费模式

免费。

接入流程

代开手机号.png

重要说明:

  • 代开发模式需 ISV 引导商户 入驻开放平台 并 创建小程序 应用。

  • ISV 需在第三方应用 功能管理 > 能力列表 页面添加 获取会员手机号 和 应用AES密钥管理 功能,再向商家发起 ?代开发授权。

  • ISV 代商家申请用户信息前,需代商家 设置 AES 密钥设置小程序主营类目

  • ISV 在小程序端调用 my.getPhoneNumber 代商家获取用户手机号信息时需传入 isvAppID 参数(即第三方应用 APPID)。

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

第一步:创建应用商户创建小程序应用

代开发模式中 ISV 需引导商户或商户自主完成 入驻开放平台 并在开放平台中 创建小程序 应用。

服务商创建第三方应用
  1. ISV 需根据 创建第三方应用 指引 创建、配置并绑定第三方应用,完成后可在第三方应用 功能管理 > 能力列表 页面添加 获取会员手机号 和 应用AES密钥管理 功能。

  2. ISV 需为第三方应用配置 接口内容加密方式(即 AES 密钥)。Image 1.png

  1. 添加功能并完成配置第三方应用后,ISV 可 发起代开发授权 获取商户应用授权。

    image

  2. 完成授权后,ISV 调用接口 alipay.open.app.members.create (需传入授权 app_auth_token),添加 ISV 侧开发人员的支付宝账号为商家小程序应用的开发者。

第二步:代商家配置应用

ISV 可通过第三方应用自调用(即不传 app_auth_token)方式代商家设置其小程序应用 接口内容加密方式(即 AES 密钥),用于后续解密手机号。

配置 AES 密钥设置 AES 密钥

若商家应用未设置 接口内容加密方式(即 AES 密钥)或 AES 密钥需要更新,ISV 可调用 alipay.open.auth.app.aes.set (授权应用 AES 密钥设置接口)代商家为其小程序设置或者更新 AES 密钥。详情参见 设置/更新 AES 密钥。

注意:

  • ISV 在构造 alipayClient 时,构造方法中需传入 encryptKey 和 encryptType,encryptKey 为当前三方应用的 AES 密钥,encryptType 为固定值 AES。

  • 无需传入 app_auth_token(第三方应用授权令牌)。

  • ISV 需谨慎设置或更新商家应用密钥;若商家应用已上线,更新商家应用的密钥可能会影响商家的线上业务。

示例代码(以 Java 语言为例):

// encryptKey填入当前第三方应用的AES密钥,encryptType为"AES" AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do","第三方应用APPID","第三方应用 private_key","json","GBK","alipay_public_key","RSA2","encryptKey","encryptType");AlipayOpenAuthAppAesSetRequest request = new AlipayOpenAuthAppAesSetRequest();request.setBizContent ("{"   +       //为商家小程序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 密钥

若商家小程序已设置 接口内容加密方式(即 AES 密钥),ISV 可调用 alipay.open.auth.app.aes.get (授权应用 AES 密钥查询接口)查询商家小程序的 AES 密钥。详情参见 查询商家 AES 密钥。

示例代码(以 Java 语言为例):

//encryptKey填入当前第三方应用的AES密钥,encryptType为"AES" AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do","第三方应用APPID","第三方应用 private_key","json","GBK","alipay_public_key","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( "调用失败" );}
配置主营行业

申请用户信息前需配置商家小程序主营行业类目,否则商户小程序后台不会展示用户信息申请入口且 ISV 的代申请用户信息将被驳回。

  1. ISV 可代调用 alipay.open.mini.category.query(小程序类目树查询)接口,查询商家小程序可用主营行业类目。

    示例代码:

    AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do","app_id","your private_key","json","GBK","alipay_public_key","RSA2");AlipayOpenMiniCategoryQueryRequest request = new AlipayOpenMiniCategoryQueryRequest();request.putOtherTextParam("app_auth_token", "your_app_auth_token"); //授权tokenrequest.setBizContent("{" +""is_filter":true" +"  }");AlipayOpenMiniCategoryQueryResponse response = alipayClient.execute(request);if(response.isSuccess()){System.out.println("调用成功");} else {System.out.println("调用失败");}

    重要参数说明:

    is_filter:是否过滤小程序不可用类目,传入 Boolean 值 true

    更多参数及响应详情参见 alipay.open.mini.category.query(小程序类目树查询)接口文档。

  1. ISV 可代调用 alipay.open.mini.baseinfo.modify(小程序修改基础信息)接口,为商家小程序添加 mini_category_ids(小程序前台类目)即小程序主营行业。

    AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do","app_id","your private_key","json","GBK","alipay_public_key","RSA2");AlipayOpenMiniBaseinfoModifyRequest request = new AlipayOpenMiniBaseinfoModifyRequest();request.putOtherTextParam("app_auth_token", "your_app_auth_token");//授权tokenrequest.setAppName("小程序demo");request.setAppEnglishName("demoexample");request.setAppSlogan("这是一个小程序示例");FileItem AppLogo = new FileItem("C:/Downloads/ooopic_963991_7eea1f5426105f9e6069/16365_1271139700.jpg");request.setAppLogo(AppLogo);request.setAppDesc("这是一个小程序的描述这是一个小程序的描述这是一个小程序的描述这是一个小程序的描述");request.setServicePhone("13110101010");request.setServiceEmail("[email protected]");request.setMiniCategoryIds("XS1001_XS2001_XS3002;XS1011_XS2089;XS1002_XS2008_XS3024");AlipayOpenMiniBaseinfoModifyResponse response = alipayClient.execute(request);if(response.isSuccess()){System.out.println("调用成功");} else {System.out.println("调用失败");}

    重要参数说明:

    • app_english_name:可选,小程序应用英文名称。若小程序应用未设置该项内容时必传,若小程序应用已设置且无需修改则无需传入。

    • app_slogan:可选,小程序应用简介,一句话描述小程序功能。若小程序应用未设置该项内容时必传,若小程序应用已设置且无需修改则无需传入。

    • app_desc:可选,小程序应用描述,20~200 个字。若小程序应用未设置该项内容时必传,若小程序应用已设置且无需修改则无需传入。

    • service_phone:可选,小程序客服电话。若小程序应用未设置该项内容时必传,若小程序应用已设置且无需修改则无需传入。

    • service_email:可选,小程序客服邮箱。若小程序应用未设置该项内容时必传,若小程序应用已设置且无需修改则无需传入。

    • mini_category_ids:新小程序前台类目(即主营行业类目),获取会员手机号场景必填。格式为第一个一级类目_第一个二级类目;第二个一级类目_第二个二级类目_第二个三级类目。详细类目可以通过 alipay.open.mini.category.query(小程序类目树查询)接口查询 mini_category_list。

    更多参数及响应详情参见 alipay.open.mini.baseinfo.modify(小程序修改基础信息)接口文档。

代申请用户信息
  1. 登录 支付宝开放平台,进入 控制台 > 第三方应用详情 > 功能管理 > 获取会员手机号,点击 代申请用户信息

    image

  1. 选择需要申请用户信息的商家小程序。

    image

  2. 选择类目和用户信息,点击 下一步

    image

  3. 阅读了解相关规范,并如实详细填写申请信息。确认无误后,点击 提交申请

    image

  4. 审核时长约为 2~3 个工作日,审核通过后可获得该信息字段的权限。可登录 支付宝开放平台,进入 控制台 > 第三方应用详情 > 功能管理 > 获取会员手机号,点击 代申请用户信息 ,点击 已提交的申请,进入页面后,查看 状态 列,即可获取当前审核状态。image

第三步:小程序端开发

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

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');   },});
第四步:服务端解密

ISV 通过 获取应用 AES 密钥 功能,按照文档指引使用response.getAesKey()获取商户小程序的 AES 密钥。后续 ISV 可通过商户的 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"; // 商户小程序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}
扩展功能

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

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

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

    AlipayMarketingCardFormtemplateSetRequest request = new AlipayMarketingCardFormtemplateSetRequest();rrequest.putOtherTextParam("app_auth_token", "your_app_auth_token"); //授权toke
    rrequest.setBizContent("{" +r   //会员卡模板id。使用会员卡模板创建接口(alipay.marketing.card.template.create)返回的结果r   ""template_id":"20200507000000002285737000300291"," +r   ""fields":{" +r   ""required":"{"common_fields":["OPEN_FORM_FIELD_NAME","OPEN_FORM_FIELD_CITY"]}"," +r   ""optional":"{"common_fields":["OPEN_FORM_FIELD_GENDER","OPEN_FORM_FIELD_EMAIL","OPEN_FORM_FIELD_MOBILE"]}"" +r   "}" +r   "}");r   AlipayMarketingCardFormtemplateSetResponse response;r   try {r    response = alipayClient.execute(request);r    if(response.isSuccess()){r     System.out.println("调用成功");r     System.out.println(response.getBody());r    } else {r     System.out.println("调用失败");r    }r   } catch (AlipayApiException e) {r    // TODO Auto-generated catch blockr    e.printStackTrace();r   }
  3. 配置完成后开发者需调用 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},
  4. 用户填写完信息提交开卡申请后,开发者调用 alipay.marketing.card.activateform.query (查询用户提交的会员卡表单信息接口)获取填写信息,连同用户授权后获取到的手机号信息一同传入 alipay.marketing.card.open(会员卡开卡接口)中完成会员卡开卡操作。用户即使不填写手机号会员卡中也会附带会员手机号信息。开卡接口示例代码如下:

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