支付宝小程序获取手机号码的的详细流程。(配置开发设置,具体流程)

支付宝小程序获取手机号码跟微信小程序的不一样,所以获取的流程也有很多的不同,所以第一步并不是直接写代码。

流程如下:

一、登录支付宝小程序开发管理平台 ->开发中心->小程序应用->选择你的小程序(点击查看)->设置->开发设置

 上图中的接口加签方式、IP白名单、应用网关、接口内容加密方式都需要设置。

二、接口加签方式,点击后需要授权短信验证码验证身份,然后如下图:

这里我模拟使用官方提供的支付宝密钥生成器生成密钥就行,步骤如下:

1.下载安装密钥生成器:传送门

 2.下载后直接傻瓜式安装就行,安装完毕后运行,进行如下设置:

这里我们使用的是默认的配置就行,直接点击生成密钥,等几秒钟密钥生成后,点击上传公钥。

我们的服务器会需要csr文件,直接点击获取csr文件获取,然后点击打开文件位置,将csr文件保存到服务器上面(后端验证签名和解密需要)。

这时我们就得到了密钥了,我们复制应用公钥回到上一步的接口加签方式页面。

三、将公钥粘贴到表单,然后点击保存设置

设置成功如下:

四、接下来我们需要配置IP白名单

点击设置->点击添加规则->选择配置全量接口

点击下一步->添加IP地址:

可添加多个IP地址,使用英文逗号隔开->确认添加->二次确认

配置ip白名单完成,接着进行下一步配置

五、配置应用网关

点击设置:

这里的网关可以使用域名,同样可以添加多个网关,使用英文逗号隔开,点击确定就OK了

六、设置接口内容加密方式

点击设置:

直接点击生成就行了。

全部设置后:

七、完成敏感信息申请

开发管理 -> 功能列表 -> 添加功能  -> 获取会员手机号 -> 用户信息申请

 

八、小程序获取手机号码

获取支付宝用户绑定的手机号。因为需要用户主动触发才能发起获取手机号,所以该功能不由 API 直接调用,需用 button 组件 的点击来触发。

///axml
<!-- 授权弹窗 -->
<view class="alert-author" a:if="{{alertPhone}}">
  <view class="alert-mask"></view>
  <view class="alert-content">
    <view class="alert-main">
      <view class="alert-title">授权信息</view>
      <view class="alert-describe">小程序需要您的授权才能获得更好的服务哦。</view>
    </view>
    <view class="alert-buttons">
      <button open-type="getAuthorize"  scope='phoneNumber' class="alert-button" hover-class="button-active" onGetAuthorize="getUserPhone">确定</button>
    </view>
  </view>
</view>
<!-- 授权弹窗 -->

///js
getUserPhone(e){
    let that = this;
    my.getPhoneNumber({
      success: (res) => {
        let encryptedData = res.response;
        that.setData({
          ['userInfo.phone']: "18290261572",
          alertPhone: false
        })
         my.request({
             url: '你的后端服务端',
             data: encryptedData,
                success: function(result){

             }
         });
      },
      fail: (res) => {
          console.log("获取失败",res);
      },
    });
  },

九、java后端解密数据

String response = "小程序前端提交的";

//1. 获取验签和解密所需要的参数
Map<String, String> openapiResult = JSON.parseObject(response,
            new TypeReference<Map<String, String>>() {
            }, Feature.OrderedField);
String signType = "RSA2";
String charset = "UTF-8";
String encryptType = "AES";
String sign = openapiResult.get("sign");
String content = openapiResult.get("response");

//如果密文的
boolean isDataEncrypted = !content.startsWith("{");
boolean signCheckPass = false;

//2. 验签
String signContent = content;
String signVeriKey = "你的小程序对应的支付宝公钥(为扩展考虑建议用appId+signType做密钥存储隔离)";
String decryptKey = "你的小程序对应的加解密密钥(为扩展考虑建议用appId+encryptType做密钥存储隔离)"
;
//如果是加密的报文则需要在密文的前后添加双引号
if (isDataEncrypted) {
    signContent = "\"" + signContent + "\"";
}
try {
    signCheckPass = AlipaySignature.rsaCheck(signContent, sign, signVeriKey, charset, signType);
} catch (AlipayApiException e) {
    //验签异常, 日志
}
if(!signCheckPass) {
    //验签不通过(异常或者报文被篡改),终止流程(不需要做解密)
    throw new Exception("验签失败");
}

//3. 解密
String plainData = null;
if (isDataEncrypted) {
    try {
        AlipayEncrypt.decryptContent(content, encryptType, decryptKey, charset);
    } catch (AlipayApiException e) {
        //解密异常, 记录日志
       throw new Exception("解密异常");
    }
} else {
    plainData = content;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章