首頁  >  文章  >  後端開發  >  php怎麼實作掃一掃功能

php怎麼實作掃一掃功能

藏色散人
藏色散人原創
2021-12-10 11:00:373460瀏覽

php實現掃一掃功能的方法:1、產生二維碼,產生一個唯一標識uuid,並使用redis保存臨時資訊;2、透過一個長連接維持用戶請求和伺服器之間的通信;3、使用手機掃描二維碼取得唯一標識uuid,並判斷該標識是否有效。

php怎麼實作掃一掃功能

本文操作環境:Windows7系統,PHP7.4版,Dell G3電腦。

php怎麼實作掃一掃功能?

PHP掃碼登入

掃碼登入具體實作方式

php怎麼實作掃一掃功能

掃碼登入具體實作流程:

1、產生二維碼,產生一個唯一標識uuid,該標識貫穿整個流程,使用redis儲存臨時訊息

(uuid作為key,對應值設定為-1,-1表示未掃描,該標識的有效期限這裡設定為三分鐘,過期會重新產生一個二維碼)。

    public function index(){
        $uuid = self::createRandomStr('6');
        $url = $this->code($uuid); //二维码链接地址
        Redis::sAdd($uuid,'-1');
        Redis::command('Expire',[$uuid,180]);//设置过期时间
        return view('home.send.index',['url'=>$url,'uuid'=>$uuid]);
    }

    /**
     * 生成二维码url
     * @param $text
     */
    public function code($uuid){
        $host='http://'.$_SERVER["HTTP_HOST"].'/api/send';
        $url='http://qr.liantu.com/api.php?text='.$host.'?uuid='.$uuid;
        return $url;
    }
2、登入頁面透過一個長連接維持使用者請求和伺服器之間的通信,每隔一段時間監測redis中uuid對應的值是否發生改變

(-1未掃描, 0表示用戶已掃描該二維碼ps:再次掃描該二維碼時提示已失效, 其餘的值表示用戶的主鍵id)

    /**
     * 验证uuid是否过期
     * @param Request $req
     * @return string|void
     */
    public function confirm(Request $req){
        $uuid = $req->uuid;

        $result = implode('',Redis::sort($uuid));
        if($result == ''){//当uuid不存在时表示该标识已失效,重新生成二维码
            return '该链接地址已过期';
        }
        if($result == '-1'){
            return '';
        }elseif($result == '0'){
            return '用户已扫描';
        }else{
            return '用户已确认登录';//获取用户的user_id 直接登录。
        }
    }
3、使用手機掃描二維碼(ps:這裡應該使用自己開發的App,並且App已經登入)來取得唯一標識uuid,判斷該標識是否有效(該標識未失效的情況下修改uuid對應的值為0,用來表示該二維碼已被掃描)。
        public function index(Request $req){
              $uuid = $req->uuid;
              $info = Code::getOne(['uuid'=>$uuid]);
              $result = implode('',Redis::sort($uuid));
              if(!$result){
                   return $this->ajaxMsgError('该二维码已失效');
              }
             Redis::sRem($code,'-1');
             Redis::sadd($code ,0);
             return $this->ajaxMsgOk('扫描成功,请确认登录');
    }
4、APP確認登錄,把目前uuid對應的val值修改為目前登入使用者的主鍵id
public function dologin(Request $req){
        $user_id = $req->user_id;
        $uuid= $req->uuid;

        $user = User::getOne(['id'=>$user_id]);
        if($user){
            if($user->status != 1){
                return $this->ajaxMsgError('该用户已被禁用');
            }
            Redis::sadd($uuid,$user_id);
            return $this->ajaxSuccess('登录成功');
        }else{
            //用户不存在
            return $this->ajaxError('该用户不存在');
        }
    }
5、重複第二步,此介面如果檢查到redis中的key值為登入人UID的時候,就會傳回登入人資訊並且儲存登入態。

推薦學習:《PHP影片教學

以上是php怎麼實作掃一掃功能的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn