隨著微信的普及,掃碼登陸方法越來越被現(xiàn)今的應(yīng)用所使用。它由于不用去記住密碼,只要有微信號(hào)即可便捷快捷登入。微信的開放平臺(tái)原生就有支持掃碼登陸的功能,不過大部份人還是在用公眾平臺(tái),所以掃碼登陸只能自行實(shí)現(xiàn)。這兒基于微信公眾平臺(tái)的帶參數(shù)臨時(shí)二維碼,但是結(jié)合的服務(wù)實(shí)現(xiàn)掃碼登陸。大體流程如下:
顧客端打開登陸界面,聯(lián)接到服務(wù)服務(wù)生成帶參數(shù)二維碼返回給顧客端用戶掃描展示的帶參數(shù)二維碼微信服務(wù)器反彈掃碼風(fēng)波并通知開發(fā)者服務(wù)器開發(fā)者服務(wù)器通知服務(wù)服務(wù)通知顧客端登陸成功聯(lián)接服務(wù)
安裝完以后,我們需用使用到服務(wù)。新建一個(gè)服務(wù)十分簡單:
$server = new swoole_websocket_server("0.0.0.0", 1099);
$server->on('open', function (swoole_websocket_server $server, $request) use ($config){
echo "server: handshake success with fd{$request->fd}n";
});
$server->on('message', function (swoole_websocket_server $server, $frame) {
});
這兒的反彈雖然用不到,由于都是服務(wù)端下發(fā)消息的,并且必須設(shè)定一個(gè)。設(shè)定的端標(biāo)語倘若高于1024則必需要有root權(quán)限,服務(wù)器記得去防火墻開啟該端口。
生成帶參數(shù)二維碼
服務(wù)在顧客端聯(lián)接成功后,須要生成一張微信的帶參數(shù)二維碼返回給顧客端展示:
$server->on('open', function (swoole_websocket_server $server, $request) use ($config){
$app = Factory::officialAccount($config['wechat']);
$result = $app->qrcode->temporary($request->fd, 120);
$url = $app->qrcode->url($result['ticket']);
$server->push($request->fd, json_encode([
'message_type' => 'qrcode_url',
'url' => $url
]));
});
我們?cè)趏pen反彈中,生成一張臨時(shí)的二維碼,二維碼的場(chǎng)景值就是顧客端聯(lián)接的文件描述符,這樣就可以保證每位顧客端的惟一性。有效時(shí)間設(shè)置為120秒,避免一張二維碼被多次掃碼使用。消息push到顧客端的時(shí)侯必需要json,便捷顧客端處理。顧客端代碼也很簡單:
const socket = new WebSocket('ws://127.0.0.1:1099');
socket.addEventListener('message', function (event) {
var data = JSON.parse(event.data);
if (data.message_type == 'qrcode_url'){
$('#qrcode').attr('src', data.url);
}
});
反彈掃碼風(fēng)波
在顧客端展示二維碼后,須要提示用戶掃碼。對(duì)于用戶掃臨時(shí)的二維碼,微信會(huì)觸發(fā)相應(yīng)的反彈風(fēng)波,我們須要在該反彈風(fēng)波中處理用戶的掃碼行為。其中我們須要用到微信傳遞過來的一些參數(shù):
FromUserName 發(fā)送方帳號(hào)(一個(gè)OpenID)
MsgType 消息類型,event
Event 事件類型,subscribe
EventKey 事件 KEY 值,qrscene_為前綴,后面為二維碼的參數(shù)值
這兒要注意一點(diǎn):微信已關(guān)注掃碼推送的是沒有前綴的,只有未關(guān)注掃碼之后關(guān)注才有。
收到微信反彈后我們首先要依照不同的風(fēng)波類型做不同處理:
if ($message['MsgType'] == 'event'){
if ($message['Event'] == 'subscribe'){ //關(guān)注
return $this->subscribe($message);
}
if ($message['Event'] == 'unsubscribe') { //取消關(guān)注
return $this->unsubscribe($message);
}
if ($message['Event'] == 'SCAN'){ //已關(guān)注掃碼
return $this->scan($message);
}
}else{
return "您好!歡迎使用 SwooleWechat 掃描登錄";
}
這兒只講解一個(gè)關(guān)注風(fēng)波的業(yè)務(wù)邏輯,其他依據(jù)須要自行編碼:
public function subscribe($message){
$eventKey = intval(str_replace('qrscene_', '', $message['EventKey']));
$openId = $message['FromUserName'];
$user = $this->app->user->get($openId);
$this->notify(json_encode([
'type' => 'scan',
'fd' => $eventKey,
'nickname' => $user['nickname']
]));
$count = $this->count($openId);
$msgTemp = "%s,登錄成功!n這是你第%s次登錄,玩的開心!";
return sprintf($msgTemp, $user['nickname'], $count);
}
這兒的實(shí)際上就是聯(lián)接的顧客端文件描述符,獲取到掃碼用戶的,按照用戶的獲取用戶信息,通知服務(wù),響應(yīng)文本消息給微信。
這兒一個(gè)比較麻煩的點(diǎn)就是怎樣通知服務(wù),我們曉得處理微信反彈的代碼是是不在服務(wù)上的,這么不同間怎么通訊呢?官方給出的解決方案有兩個(gè):
額外竊聽一個(gè)UDP端口使用作為顧客端訪問
這兒我們選擇第二個(gè)方案,1.8版本支持一個(gè)竊聽多個(gè)端口,我們?cè)诜?wù)新增竊聽一個(gè)TCP的端口:
$tcp_server = $server->addListener('0.0.0.0', 9999, SWOOLE_SOCK_TCP);
$tcp_server->set([]);
$tcp_server->on('receive', function ($serv, $fd, $threadId, $data) {
});
主服務(wù)器是或Http合同,新竊聽的TCP端口默認(rèn)會(huì)承繼主的合同設(shè)置,必須單獨(dú)調(diào)用set方式設(shè)置新的合同才能啟用新合同
之后我們就可以在掃碼反彈的進(jìn)程中去通知服務(wù):
public function notify($message){
$client = new swoole_client(SWOOLE_SOCK_TCP);
if (!$client->connect('127.0.0.1', $this->config['notify_port'], -1)) {
return "connect failed. Error: {$client->errCode}n";
}
$ret = $client->send($message);
}
通知登陸成功
在服務(wù)收到登陸成功的通知后,就可以按照須要處理一下用戶信息,之后把用戶信息傳遞給顧客端的瀏覽器展示結(jié)果,還記得我們剛才新竊聽的TCP端口嗎?就可以在風(fēng)波中處理:
$tcp_server->on('receive', function ($serv, $fd, $threadId, $data) {
$data = json_decode($data, true);
if ($data['type'] == 'scan'){
$serv->push($data['fd'], json_encode([
'message_type' => 'scan_success',
'user' => $data['nickname']
]));
}
$serv->close($fd);
});
最后登陸的界面:
發(fā)圖太麻煩,自行去測(cè)試地址看。
點(diǎn)關(guān)注,不走失
好了諸位,以上就是這篇文章的全部內(nèi)容了,能看見這兒的人呀,都是人才。之前說過,PHP方面的技術(shù)點(diǎn)好多微信掃碼點(diǎn)單,也是由于太多了,實(shí)在是寫不過來微信掃碼點(diǎn)單,寫過來了你們也不會(huì)看的太多,所以我這兒把它整理成了PDF和文檔,假如有須要的可以
點(diǎn)擊步入暗號(hào):PHP+「平臺(tái)」
更多學(xué)習(xí)內(nèi)容可以訪問
阿布阿布:【對(duì)標(biāo)大廠】精品PHP構(gòu)架師教程目錄大全,只要你能看完保證工資上升一個(gè)臺(tái)階(持續(xù)更新)??
以上內(nèi)容希望幫助到你們,好多PHPer在進(jìn)階的時(shí)侯總會(huì)碰到一些問題和困局,業(yè)務(wù)代碼寫多了沒有方向感,不曉得該從哪里入手去提高,對(duì)此我整理了一些資料,包括但不限于:分布式構(gòu)架、高可擴(kuò)充、高性能、高并發(fā)、服務(wù)器性能調(diào)優(yōu)、TP6,,YII2,Redis,、Swoft、Kafka、Mysql優(yōu)化、shell腳本、、微服務(wù)、Nginx等多個(gè)知識(shí)點(diǎn)中級(jí)進(jìn)階干貨須要的可以免費(fèi)分享給你們,須要的可以加入我的PHP技術(shù)交流群
免責(zé)聲明:部分文章信息來源于網(wǎng)絡(luò)以及網(wǎng)友投稿,本站只負(fù)責(zé)對(duì)文章進(jìn)行整理、排版、編輯,出于傳遞更多信息之目的,并不意味著贊同其觀點(diǎn)或證實(shí)其內(nèi)容的真實(shí)性,如本站文章和轉(zhuǎn)稿涉及版權(quán)等問題,請(qǐng)作者在及時(shí)聯(lián)系本站,我們會(huì)盡快為您處理。
熱門資訊
- 美團(tuán)外賣的抽成規(guī)則 餓了么抽點(diǎn)比例是多少
- 外賣好評(píng)30字有哪些 常見的外賣評(píng)語大全
- 木屋燒烤價(jià)目表一覽 微信外賣訂餐系統(tǒng)推薦
- 海底撈排隊(duì)取號(hào)微信是多少 海底撈是怎么預(yù)約排隊(duì)
- 如何通過微信掃碼支付找到支付人微信號(hào)?看這里!
- 胡桃里消費(fèi)人均大概是多少錢 二維碼掃碼點(diǎn)餐系統(tǒng)哪個(gè)好用
- 美團(tuán)外賣怎么點(diǎn)兩份?步驟及注意事項(xiàng)!!
- 肯德基優(yōu)惠券怎么獲得 肯德基微信外賣怎么點(diǎn)
- 連鎖收銀系統(tǒng)對(duì)連鎖門店運(yùn)營會(huì)有怎么樣的影響?
- 微信公眾號(hào)點(diǎn)餐是怎么實(shí)現(xiàn) 餐飲商家怎么制作外賣訂餐系統(tǒng)