本人在微信小程序登录时,由于每次都敲重复代码,决定写一份博客。方便以后使用。
先放小程序端代码。没有样式,需要自拟。
微信小程序 wxml代码
<view>
<button bindtap="getUserProfile" >微信一键登录</button>
</view>
微信小程序js代码
getUserProfile: function (res) {
wx.getUserProfile({
desc: '用于完善会员资料', // 声明获取用户个人信息后的用途,后续会展示在弹窗中,请谨慎填写
success: res => {
let name = res.userInfo.nickName
wx.login({
success: res => {
console.log(res)
wx.request({
url: 'http://www.work.com/api/wxLogin',
data:{code:res.code,name:name},
method:"POST",
success:res=>{
console.log(res)
if(res.data.code==200){
wx.setStorageSync('token', res.data.data)
wx.switchTab({
url: '/pages/index/index'
})
}
}
})
}
})
}
})
},
代码简陋凑合看吧。
php后台代码
token生成方式等于没有,注意。
/**
* 微信用户登录
* @param Request $request
* @return array|string[]
*/
public function wxLogin(Request $request)
{
//验证前端数据
if(empty($request['code'])) return ['code'=>'1001','data'=>'','msg'=>'参数不全'];
//获取前端的传值
$code = $request['code'];
$name = $request['name'];
//从config中获取配置数据
$appid = config('app.wx.appid');
$secret = config('app.wx.secret');
//拼接路径
$url = config('app.wx.loginUrl') . "?appid=$appid&secret=$secret&js_code=$code&grant_type=authorization_code";
//调用curl方法发起请求
$res = $this->curl($url,true);
//判断请求是否成功
if (!isset($res['openid'])) return ['code' => 1001, 'msg' => '无法获取openid', 'data' => ''];
//查询用户数据是否存在
$user = \App\Models\Users::where('openid',$res['openid'])->first();
if (isset($user)) {
//如果用户数据存在就更新sessi_key和用户名称
$result = \App\Models\Users::where('id',$user['id'])->update(['session_key'=>$res['session_key'],'name'=>$name]);
if($result) {
//更新成功生成token
$token = base64_encode($user['id']);
return ['code' => 200, 'msg' => '成功', 'data' =>$token];
}
//更新失败
return ['code' => 1002, 'msg' => '修改失败', 'data' => ''];
}
//数据不存在,执行添加
$res['name'] = $name;
$result = \App\Models\Users::insertGetId($res);
//判断添加后返回的用户id是否存在
if (isset($result)) {
//存在返回token
$token = base64_encode($result);
return ['code' => 200, 'msg' => '成功', 'data' =>$token];
}
return ['code' => 1003, 'msg' => '数据添加失败', 'data' => ''];
}
/**
* 调用第三方接口
* @param string $url
* @return array
*/
public function curl($url,$is_https='')
{
//初始化
$ch = curl_init();
//设置路由
curl_setopt($ch, CURLOPT_URL, $url);
//如果为https页面
if($is_https){
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
}
//设置成功后返回文件而不是直接输出
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//执行curl
$output = curl_exec($ch);
//释放内存关闭curl
curl_close($ch);
//返回数据为json格式需要解码
$output = json_decode($output, true);
return $output;
}