小程序授权登录,所有用户包括个人用户都可以获取:
前端wxml只需给出一个按钮,
<button bindtap="login">授权登录</button>
js部分使用wx.getUserProfile和wx.login函数
login(){
wx.getUserProfile({
desc: 'desc',
success:info=>{
wx.login({
success:code=>{
wx.request({
url: 'http://www.xxx.com/api/login',
method:"POST",
data:{
nickName:info.userInfo.nickName,
avatarUrl:info.userInfo.avatarUrl,
code:code.code
},
success:res=>{
if(res.data.code != 200){
wx.showToast({
title: '登录失败',
icon:'error'
})
return
}
wx.setStorageSync('token', res.data.data)
}
})
}
})
}
})
},
获取用户信息和code码,将code传到后端,
使用php和curl请求登录api获取openid和session_key用作手机号授权
public function login(Request $request)
{
// 获取code
$code = $request->input("code");
// 获取昵称
$nickname = $request->input("nickName");
// 获取头像
$img = $request->input("avatarUrl");
// 从微信公众平台获得appid
$appid = "xx";
// 从微信公众平台获得secret
$secret = "xx";
// 发送请求换取openid和sessionkey
$url = "https://api.weixin.qq.com/sns/jscode2session?appid=$appid&secret=$secret&js_code=$code&grant_type=authorization_code";
// 暂使用file_get_contents()发送请求,你可以使用CURL扩展的形式实现
$res = json_decode(file_get_contents($url), true);
// 组装用户数据
$info = [
'nickname' => $nickname,
'img'=>$img,
'openid' => $res['openid'],
'session_key' => $res['session_key']
];
// 查询用户是否是第一次登录
$user = Login::where("openid", $res['openid'])->first();
// 判断
if ($user) {
return ['code' => 200, 'msg' => '已经注册过', 'data' => $user];
}
$data = Login::create($info);
return ['code' => 200, 'msg' => '注册成功', 'data' => $data];
}
授权获取手机号: 个人AppID无法获取手机号,需要先申请测试号
使用方法:将 button 组件 open-type 的值设置为 getPhoneNumber,当用户点击并同意之后,可以通过 bindgetphonenumber 事件回调获取到微信服务器返回的加密数据, 然后在第三方服务端结合 session_key 以及 app_id 进行解密获取手机号。
微信官方文档:获取手机号 | 微信开放文档
小程序端wxml代码:
<button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber">
手机号授权
</button>
js:
getPhoneNumber (e) {
let iv = e.detail.iv
let encryptedData = e.detail.encryptedData
let token = wx.getStorageSync('token')
wx.request({
url: 'http://www.xxx.com/api/getPhone',
data:{
iv,
encryptedData,
token
},
method:'POST',
success:res=>{
console.log(res)
}
})
}
注意:iv、 encryptedData是必要参数
解密:
//获取手机号
public function getPhoneNumber(Request $request)
{
$params = $request->all();
$user_id = (new Token())->chekToken($params['token']);
try{
//获取用户信息
$user = User::where('id',$user_id)->first();
$aesKey = base64_decode($user->session_key);
$aesIV = base64_decode($params['iv']);
$aesCipher = base64_decode($params['encryptedData']);
$result = openssl_decrypt($aesCipher, "AES-128-CBC", $aesKey, 1, $aesIV);
$phoneNumber = json_decode($result, true)['purePhoneNumber'];
//更改手机号
$user->phone = $phoneNumber;
$user->save();
return ['code' => 200,'msg' => 'ok'];
}catch (\Exception $e){
return ['code' => 400,'msg' => $e->getMessage()];
}
}
这样就完成了