小程序扫码登录 laravel+easyWeChat扫码登录

在做项目的时候,有时候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就是缓存的意思

小程序扫码登录的思路大概就是这样了,然后哪里说得不好,欢迎留言指出。谢谢

你可能感兴趣的:(laravel,小程序扫码登录,easyWeChat)