新聞中心
本文操作環(huán)境:Windows7系統(tǒng),php7.4版,Dell G3電腦。

創(chuàng)新互聯(lián)建站云計(jì)算的互聯(lián)網(wǎng)服務(wù)提供商,擁有超過(guò)13年的服務(wù)器租用、成都西云數(shù)據(jù)中心、云服務(wù)器、網(wǎng)頁(yè)空間、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗(yàn),已先后獲得國(guó)家工業(yè)和信息化部頒發(fā)的互聯(lián)網(wǎng)數(shù)據(jù)中心業(yè)務(wù)許可證。專業(yè)提供云主機(jī)、網(wǎng)頁(yè)空間、國(guó)際域名空間、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。
php怎么實(shí)現(xiàn)掃一掃功能?
PHP掃碼登錄
掃碼登錄具體實(shí)現(xiàn)方式
掃碼登錄具體實(shí)現(xiàn)流程:
1、生成二維碼,生成一個(gè)唯一標(biāo)識(shí)uuid,該標(biāo)識(shí)貫穿整個(gè)流程,使用redis保存臨時(shí)信息
(uuid作為key,對(duì)應(yīng)值設(shè)置為-1,-1表示未掃描,該標(biāo)識(shí)的有效期這里設(shè)置為三分鐘,過(guò)期會(huì)重新生成一個(gè)二維碼)。
public function index(){
$uuid = self::createRandomStr('6');
$url = $this->code($uuid); //二維碼鏈接地址
Redis::sAdd($uuid,'-1');
Redis::command('Expire',[$uuid,180]);//設(shè)置過(guò)期時(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、登錄頁(yè)面通過(guò)一個(gè)長(zhǎng)連接維持用戶請(qǐng)求和服務(wù)器之間的通信,每隔一段時(shí)間監(jiān)測(cè)redis中 uuid對(duì)應(yīng)的值是否發(fā)生改變
(-1未掃描 , 0表示用戶已掃描該二維碼 ps:再次掃描該二維碼時(shí)提示已失效, 其余的值表示用戶的主鍵id)
/**
* 驗(yàn)證uuid是否過(guò)期
* @param Request $req
* @return string|void
*/
public function confirm(Request $req){
$uuid = $req->uuid;
$result = implode('',Redis::sort($uuid));
if($result == ''){//當(dāng)uuid不存在時(shí)表示該標(biāo)識(shí)已失效,重新生成二維碼
return '該鏈接地址已過(guò)期';
}
if($result == '-1'){
return '';
}elseif($result == '0'){
return '用戶已掃描';
}else{
return '用戶已確認(rèn)登錄';//獲取用戶的user_id 直接登錄。
}
}
3、使用手機(jī)掃描二維碼(ps:此處應(yīng)該使用自己開發(fā)的App,并且App已經(jīng)登錄)獲取唯一標(biāo)識(shí)uuid,判斷該標(biāo)識(shí)是否有效 (該標(biāo)識(shí)未失效的情況下修改uuid對(duì)應(yīng)的值為0,用來(lái)表示該二維碼已被掃描)。
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('掃描成功,請(qǐng)確認(rèn)登錄');
}
4、APP確認(rèn)登錄,把當(dāng)前uuid對(duì)應(yīng)的val值修改為當(dāng)前登錄用戶的主鍵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、重復(fù)第二步,此接口如果檢查到redis中的key值為登錄人UID的時(shí)候,就會(huì)返回登錄人信息并且保存登錄態(tài)。
本文標(biāo)題:php怎么實(shí)現(xiàn)掃一掃功能
網(wǎng)址分享:http://m.fisionsoft.com.cn/article/djdcedg.html


咨詢
建站咨詢
