注意:(个人号不可获取手机号,可以通过测试号获取手机号)
1.小程序页面(wxml)
<button open-type="getPhoneNumber" bindgetphonenumber="getPhone">获取手机号</button>
浏览页面如下:
?????????
?2.小程序逻辑代码(js)
//获取手机号
getPhone(e){
let errMsg = e.detail.errMsg;
//加密格式
let iv =e.detail.iv;
let encry = e.detail.encryptedData;
let token = wx.getStorageSync('token');
let phone = wx.getStorageSync('phone');
//手机号和验证码验证略
if(errMsg=='getPhoneNumber:ok'){
//发送请求
wx.request({
url: '请求地址',
data:{
iv,encry //数据
},
header:{
token
},
success:ret=>{
if(ret.data.code==200){
wx.setStorageSync('phone',true);
//跳转到其他页面
}else{
//弹出错误信息
wx.showToast({
title: ret.data.msg,
icon:'error'
})
}
}
})
}else{
//跳转到通过短信验证码获取手机号页面
wx.navigateTo({
url: '/pages/messageCode/messageCode',
})
}
},
?3.后台框架(laravel + php)
/**
* 微信授权手机号
*/
public function wxGetPhone(Request $request)
{
//接值
$param = $request->all();
//非空验证
$validate = Validator::make($param,[
'uid' => 'required',
'iv' => 'required',
'encry' => 'required'
]);
if($validate->fails()){
$error = $validate->errors();
return ['code'=>400,'msg'=>$error->first(),'data'=>''];
}
//查询用户信息
//token在中间件验证后,获取用户id
$userInfo = User::find($param['uid']);
//本人的登录为进入小程序自动登录(app.js),并在后台把openid和session_key存储到库中
//也可在授权登录的同时获取手机号,通过code码,appid,密钥获取session_key和openid
$aesKey=base64_decode($userInfo->session_key);
//解密iv
$aesIV=base64_decode($param['iv']);
//解密encryptedData
$aesCipher=base64_decode($param['encry']);
//获取手机号
$result=openssl_decrypt( $aesCipher, "AES-128-CBC", $aesKey, 1, $aesIV);
$dataObj=json_decode( $result );
if( $dataObj == NULL )
{
return ['code'=>'404','msg'=>'获取失败','data'=>''];
}
//修改用户的手机号
$userInfo->phone = $dataObj->purePhoneNumber;
$userInfo->save();
return ['code'=>200,'msg'=>'获取成功','data'=>''];
}
?解密成功得到以下代码
?
?其上的iv,encryptedData如何解密,如下:
?
? ? ?压缩文件中,关键类在
?????????
?解密关键
?代码仅供参考,写的不对的地方请指出
|