在做项目的时候,有时候PC端会有微信扫码登录需求,这时候我们应该怎样去实现这个功能呢
刚开始我也是有些迷茫,但是经过多次查看其他有这个功能的网站,其实这个功能也是挺简单的。
其实就是前端在获取二维码的时候,然后返回一个ticket(字段名,可根据个人习惯起名)给前端,然后
前端就根据这个值一直轮询是否已经扫码登录。
因为我的项目用到的是easyWeChat这个插件 所以附上部分代码
/**
* 获取小程序二维码
*/
public function loginQrcode(){
// 生成票据
$ticket = md5(uniqid(time()));
// 获取小程序二维码
$app = Factory::miniProgram(config('easywechat.mini'));
$response = $app->app_code->getUnlimit($ticket, [
// 'page' => 'path/to/page', // 发布后才能使用
'width' => 280,
'auto_color' => false,
'is_hyaline' => true,
'line_color' => [
'r' => 0,
'g' => 0,
'b' => 0,
],
]);
// 设置缓存和过期时间
Cache::put('TICKET_' . $ticket,-1,60 * 10);
// 获取返回的图片信息
$res = $response->getBody()->getContents();
// 生成base64
// 注:这里生成的是小程序码,如何转成普通二维码 暂时未知 有思路的同学麻烦解答一下 谢谢。
$base64Image="data:image/jpeg;base64,".base64_encode($res);
// 返回的数据信息 提示信息、状态码、数据
Message::success('success',ErrCode::SUCCESS_CODE,[
'image_base64' => $base64Image, // 图片
'ticket' => $ticket // 票据
]);
}
/**
* 轮询是否扫码登录成功
* @param Request $request
*/
public function checkTicketStatus(Request $request){
try{
// 获取票据
$ticket = $request -> input('ticket');
// 验证是否有该票据
$key = 'TICKET_' . $ticket;
$cache = Cache::has($key);
if(!$cache){
throw new \Exception('TICKET已失效!');
}
// 获取缓存内容
$value = Cache::get($key);
if($value == -1){
$status = 2;
}else{
// 查找用户是否存在
$memberObj = MemberModel::find($value);
if(!$memberObj){
$status = 4;
}else{
$status = 1;
Auth::login($memberObj);
}
Cache::forget($key);
}
Message::success('success',ErrCode::SUCCESS_CODE,[
'ticket_status' => $status
]);
}catch (\Exception $e){
Message::error($e -> getMessage(),ErrCode::ERROR_CODE,[
'ticket_status' => 3 // 1是登录成功 2是等待登录 3是已失效 4ticket信息异常
]);
}
}
这里只是展示了部分代码,剩下用户扫码后是如何操作的,其实很简单。用户扫码后,小程序可获取到scene的值,也就是前端轮询的ticket,然后在用户点击登录的时候,将scene的值一起发送给服务端,然后服务端接收到该ticket后,并且登录成功了,将ticket的值改为用户的id,其实ticket就是缓存的意思
小程序扫码登录的思路大概就是这样了,然后哪里说得不好,欢迎留言指出。谢谢