php實現(xiàn)掃一掃功能的方法:1、生成二維碼,生成一個唯一標識uuid,并使用redis保存臨時信息;2、通過一個長連接維持用戶請求和服務(wù)器之間的通信;3、使用手機掃描二維碼獲取唯一標識uuid,并判斷該標識是否有效。
創(chuàng)新互聯(lián)公司服務(wù)項目包括陽明網(wǎng)站建設(shè)、陽明網(wǎng)站制作、陽明網(wǎng)頁制作以及陽明網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,陽明網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到陽明省份的部分城市,未來相信會繼續(xù)擴大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
本文操作環(huán)境:Windows7系統(tǒng),PHP7.4版,Dell G3電腦。
php怎么實現(xiàn)掃一掃功能?
PHP掃碼登錄
掃碼登錄具體實現(xiàn)方式
掃碼登錄具體實現(xiàn)流程:
1、生成二維碼,生成一個唯一標識uuid,該標識貫穿整個流程,使用redis保存臨時信息(uuid作為key,對應(yīng)值設(shè)置為-1,-1表示未掃描,該標識的有效期這里設(shè)置為三分鐘,過期會重新生成一個二維碼)。
public function index(){ $uuid = self::createRandomStr('6'); $url = $this->code($uuid); //二維碼鏈接地址 Redis::sAdd($uuid,'-1'); Redis::command('Expire',[$uuid,180]);//設(shè)置過期時間 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、登錄頁面通過一個長連接維持用戶請求和服務(wù)器之間的通信,每隔一段時間監(jiān)測redis中 uuid對應(yīng)的值是否發(fā)生改變(-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:此處應(yīng)該使用自己開發(fā)的App,并且App已經(jīng)登錄)獲取唯一標識uuid,判斷該標識是否有效 (該標識未失效的情況下修改uuid對應(yīng)的值為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對應(yīng)的val值修改為當前登錄用戶的主鍵idpublic 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的時候,就會返回登錄人信息并且保存登錄態(tài)。推薦學習:《PHP視頻教程》