欧美午夜精品久久久久免费视/欧美黄色精品/国产一级A片在线播出/A片免费视频在线观看

基于微信公眾平臺(tái)的帶參數(shù)臨時(shí)二維碼,實(shí)現(xiàn)掃碼登錄
2022-08-15 06:00:42 歡樂點(diǎn)

隨著微信的普及,掃碼登陸方法越來越被現(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ì)盡快為您處理。

歡樂點(diǎn)

留言咨詢

×