前端代码组件
html
<button
v-if="!isFromOrderList"
class="get-phone-btn"
open-type="getPhoneNumber"
@getphonenumber="onGetPhoneNumber"
>
一键获取
</button>
javascript
// 获取手机号回调
onGetPhoneNumber(e) {
var that = this
tt.login({
force: true,
success(res) {
console.log('获取手机号回调', e)
if (e.detail.errMsg === 'getPhoneNumber:ok') {
// 获取成功,调用后端接口解密手机号
that.decryptPhoneNumber(res.code,e.detail.iv,e.detail.encryptedData)
} else {
uni.showToast({
title: '获取手机号失败',
icon: 'none'
})
}
},
fail(res) {
console.log(`login 调用失败`);
},
});
},
// 解密手机号 后端PHP进行解密
async decryptPhoneNumber(code,iv,encryptedData) {
try {
const res = await orderApi.decryptPhone({
code: code,
iv: iv,
encryptedData: encryptedData
})
if (res.code === 1 && res.data && res.data.phone) {
this.phone = res.data.phone
} else {
throw new Error(res.msg || '获取手机号失败')
}
} catch (error) {
console.error('解密手机号失败:', error)
uni.showToast({
title: error.message || '获取手机号失败',
icon: 'none'
})
}
}
后端使用的PHP去实现 思路首先通过前端的code换取sessionkey 然后通过 sessionkey解密前端手机号加密信息
php
/**
* 获取抖音小程序手机号
* @param $code
* @param $iv
* @param $encryptedData
* @return \think\response\Json
* @throws \GuzzleHttp\Exception\GuzzleException
*/
public function get_mobile($code, $iv, $encryptedData)
{
$result = $this->code2Session($code);
//解密
$phone = openssl_decrypt(base64_decode($encryptedData, true), 'AES-128-CBC', base64_decode($result['session_key']), OPENSSL_RAW_DATA, base64_decode($iv));
$phone = json_decode($phone, 1);
if (isset($phone['phoneNumber']) && $phone['phoneNumber']) {
return json([
'code' => 1,
'msg' => '获取成功',
'data' => [
'phone' => $phone['phoneNumber']
],
]);
} else {
return json([
'code' => 0,
'msg' => '获取失败',
'data' => [
],
]);
}
}
/**
* 通过code换取 session_key
* @param $code
* @return array
* @throws \GuzzleHttp\Exception\GuzzleException
*/
public function code2Session($code)
{
$uri = 'https://developer.toutiao.com/api/apps/v2/jscode2session';
$options = [
'body' => json_encode([
'appid' => config('xinghuo_mp.appid'),
'secret' => config('xinghuo_mp.appsecret'),
'code' => $code,
'anonymous_code' => ''
]),
'headers' => [
'Content-Type' => 'application/json'
]
];
$response = (new \GuzzleHttp\Client)->post($uri, $options);
$stringBody = (string)$response->getBody();
$result = json_decode($stringBody, true);
return ['openid' => $result['data']['openid'], 'session_key' => $result['data']['session_key']];
}