实现思路:
- 目前该功能需要在开发者后台完成敏感信息申请才可以使用此功能,入口为 开发管理 > 功能列表 > 添加功能 > 获取会员手机号 > 用户信息申请
- 需要将 <button> 组件:
- open-type 此处设置为 getAuthorize ,用于授权。
- scope 此处设置为 phoneNumber ,手机号码。
- onGetAuthorize 授权成功回调(在回调里可以调用获取信息的接口)。
- onError 授权失败回调(包括用户拒绝和系统异常)。
- 当用户点击并同意之后,可以通过my.getPhoneNumber() 接口获取到支付宝服务器返回的加密数据
- 然后在第三方服务端结合签名算法和AES密钥进行解密获取手机号
- 请确保已在 小程序后台>设置>开发设置中,设置[支付宝公钥\aes 密钥\应用网关],(若缺失这三个设置,在调用 my.getPhoneNumber 时可能只返回 response 不会返回sign)。
注意:支付宝原生组件中onGetAuthorize、onError在uniapp中无法条件编译成功,改为 @getAuthorize、@error才可以,下面的代码是不起作用的。
<button open-type="getAuthorize"
onGetAuthorize="onGetAuthorize"
onError="onAuthError"
scope='phoneNumber'>
授权手机号
</button>
有效的代码示例如下:
<template>
<view>
<button
type="ghost"
open-type="getAuthorize"
scope='userInfo'
@getAuthorize="onGetAuthorize"
@error="onAuthError"> 授权手机号
</button>
<view> 手机号:{{tel}}</view>
</view>
</template>
<script>
export default {
data() {
return {
tel: '11111111111',
}
},
methods: {
/* 授权成功事件*/
onGetAuthorize() {
// 判断是否支持小程序授权
// let flag=my.canIUse('button.open-type.getAuthorize')
my.getPhoneNumber({
success: (res) => {
let encryptedData = res.response;
let params={
encryptedData:res.response,
sign:res.sign
}
this.getPhoneNumberAli(params);
},
fail: (res) => {
this.$request.setErrorMessage("获取用户手机号失败")
},
});
},
/*** 授权失败事件*/
onAuthError(err){
this.$request.setErrorMessage(err.detail.errorMessage)
},
// 解密获取手机号
getPhoneNumberAli(params) {
this.$request.setRequest('/huoqushoujihao', params)
.then(res => {
if (res.data.status == 1) { //成功
this.tel = res.data.data.mobile;
} else if (res.data.status < 1) {
this.$request.setErrorMessage(res.data.msg)
} else {
this.$request.setErrorMessage()
}
})
},
},
}
</script>
<style lang="scss" scoped>
</style>