thinkphp5实现小程序授权获取头像和昵称手机号
2024-09-18 10:05:19
在ThinkPHP5中实现小程序授权获取头像、昵称和手机号,你需要遵循以下步骤:
- 小程序端获取code
首先,在小程序端调用wx.login
方法获取临时登录凭证code
。
wx.login({
success: res => {
if (res.code) {
// 将code发送给后端服务器
wx.request({
url: 'https://yourserver.com/api/getUserInfo',
data: {
code: res.code
},
success: res => {
console.log(res.data);
}
});
} else {
console.log('登录失败!' + res.errMsg);
}
}
});
- 后端服务器通过code获取openid和session_key
在后端服务器(ThinkPHP5)中,使用code
调用微信接口获取openid
和session_key
。
public function getUserInfo()
{
$code = input('post.code');
$appid = 'your_appid';
$secret = 'your_secret';
$url = "https://api.weixin.qq.com/sns/jscode2session?appid={$appid}&secret={$secret}&js_code={$code}&grant_type=authorization_code";
$response = json_decode(file_get_contents($url), true);
if (isset($response['openid']) && isset($response['session_key'])) {
// 保存openid和session_key到数据库,并生成自定义登录态token
$token = $this->generateToken($response['openid']);
return json(['token' => $token]);
} else {
return json(['error' => '获取用户信息失败'], 500);
}
}
- 获取用户信息
在小程序端调用wx.getUserProfile
方法获取用户头像和昵称。
wx.getUserProfile({
desc: '用于完善会员资料',
success: res => {
// 将用户信息发送给后端服务器
wx.request({
url: 'https://yourserver.com/api/saveUserInfo',
method: 'POST',
data: {
avatarUrl: res.userInfo.avatarUrl,
nickName: res.userInfo.nickName,
token: 'your_custom_token'
},
success: res => {
console.log(res.data);
}
});
}
});
在后端服务器(ThinkPHP5)中,保存用户信息到数据库。
public function saveUserInfo()
{
$avatarUrl = input('post.avatarUrl');
$nickName = input('post.nickName');
$token = input('post.token');
// 根据token获取openid
$openid = $this->getOpenIdByToken($token);
if ($openid) {
// 保存用户信息到数据库
$userInfo = [
'openid' => $openid,
'avatar_url' => $avatarUrl,
'nick_name' => $nickName
];
// 这里假设你有一个User模型来操作数据库
$userModel = new User();
$userModel->save($userInfo);
return json(['success' => true]);
} else {
return json(['error' => '获取用户信息失败'], 500);
}
}
- 获取手机号
在小程序端调用wx.login
和wx.requestPayment
方法获取手机号。
wx.login({
success: res => {
if (res.code) {
wx.requestPayment({
timeStamp: '...',
nonceStr: '...',
package: '...',
signType: 'MD5',
paySign: '...',
success: res => {
// 将encryptedData和iv发送给后端服务器
wx.request({
url: 'https://yourserver.com/api/getPhoneNumber',
method: 'POST',
data: {
encryptedData: res.encryptedData,
iv: res.iv,
session_key: 'your_session_key'
},
success: res => {
console.log(res.data);
}
});
}
});
} else {
console.log('登录失败!' + res.errMsg);
}
}
});
在后端服务器(ThinkPHP5)中,解密手机号。
public function getPhoneNumber()
{
$encryptedData = input('post.encryptedData');
$iv = input('post.iv');
$sessionKey = input('post.session_key');
$pc = new WXBizDataCrypt($this->appid, $sessionKey);
$errCode = $pc->decryptData($encryptedData, $iv, $data);
if ($errCode == 0) {
$phoneNumber = json_decode($data, true)['phoneNumber'];
// 保存手机号到数据库
$this->savePhoneNumber($phoneNumber);
return json(['success' => true]);
} else {
return json(['error' => '获取手机号失败'], 500);
}
}
注意:在实际应用中,你需要处理异常情况,例如网络错误、参数错误等。同时,为了保证安全性,你应该对敏感数据进行加密处理。
还没有人发表评论