支付寶小程序獲取手機號碼跟微信小程序的不一樣,所以獲取的流程也有很多的不同,所以第一步並不是直接寫代碼。
流程如下:
一、登錄支付寶小程序開發管理平臺 ->開發中心->小程序應用->選擇你的小程序(點擊查看)->設置->開發設置
上圖中的接口加簽方式、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;
}