Swoole implementiert die Anmeldefunktion zum Scannen von WeChat-Code

小云云
Freigeben: 2023-03-19 14:36:01
Original
2193 Leute haben es durchsucht

Die Anmeldemethode „QR-Code scannen“ wird zunehmend von aktuellen Anwendungen verwendet. Da Sie sich das Passwort nicht merken müssen, können Sie sich schnell und einfach anmelden, solange Sie über eine WeChat-ID verfügen. Diese basiert auf dem temporären QR-Code mit Parametern auf der öffentlichen WeChat-Plattform und wird mit dem WebSocket-Dienst von Swoole kombiniert um eine Scan-Code-Anmeldung zu erreichen. Dieser Artikel teilt Ihnen hauptsächlich mit, wie Swoole die Anmeldefunktion zum Scannen von WeChat-Code implementiert, in der Hoffnung, allen zu helfen.

Mit der Popularität von WeChat wird die Scan-Code-Anmeldemethode zunehmend von aktuellen Anwendungen verwendet. Da Sie sich das Passwort nicht merken müssen, können Sie sich schnell und einfach anmelden, sofern Sie über eine WeChat-ID verfügen. Die offene Plattform von WeChat unterstützt nativ die Funktion zum Scannen von QR-Codes zum Anmelden, aber die meisten Menschen nutzen immer noch die öffentliche Plattform, sodass das Scannen von QR-Codes zum Anmelden nur von ihnen selbst implementiert werden kann. Dies basiert auf dem temporären QR-Code der öffentlichen WeChat-Plattform mit Parametern und kombiniert ihn mit dem WebSocket-Dienst von Swoole, um die Scan-Code-Anmeldung zu implementieren. Der allgemeine Prozess ist wie folgt:

  1. Der Client öffnet die Anmeldeschnittstelle und verbindet sich mit dem WebSocket-Dienst.

  2. Der WebScoket-Dienst generiert einen QR-Code mit Parametern und sendet ihn an den Kunden zurück. Der Kunde

  3. Der Benutzer scannt den angezeigten QR-Code mit Parametern

  4. Der WeChat-Server ruft den Scan zurück Ereignis und benachrichtigt den Entwicklerserver

  5. Der Entwicklerserver benachrichtigt den WebSocket-Dienst

  6. Der WebSocket-Dienst benachrichtigt den Client, dass die Anmeldung erfolgreich war

Verbindet sich mit dem WebSocket-Dienst

Nach der Installation von Swoole müssen wir den WebSocket-Dienst verwenden. Das Erstellen eines neuen WebSocket-Dienstes ist sehr einfach:

$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) {
});
Nach dem Login kopieren

Der Nachrichtenrückruf ist hier eigentlich nicht sinnvoll, da der Server Nachrichten sendet, aber einer muss festgelegt werden. Wenn die eingestellte Portnummer niedriger als 1024 ist, müssen Sie über Root-Berechtigungen verfügen. Denken Sie daran, den Port in der Firewall auf dem Server zu öffnen.

QR-Code mit Parametern generieren

Nachdem sich der Client erfolgreich mit dem WebSocket-Dienst verbunden hat, muss er einen WeChat-QR-Code mit Parametern generieren und ihn zur Anzeige an den Client zurücksenden:

$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
  ]));
});
Nach dem Login kopieren

Wir generieren im offenen Rückruf einen temporären QR-Code. Der Szenenwert des QR-Codes ist der Dateideskriptor der Clientverbindung, um die Eindeutigkeit jedes Clients sicherzustellen. Die gültige Zeit ist auf 120 Sekunden festgelegt um zu verhindern, dass ein QR-Code mehrfach gescannt wird. Wenn die Nachricht an den Client gesendet wird, ist JSON erforderlich, um die Verarbeitung durch den Client zu erleichtern. Auch der Client-Code ist sehr einfach:

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);
    }
  });
Nach dem Login kopieren

Scan-Ereignis zurückrufen

Nachdem der QR-Code auf dem Client angezeigt wird, muss der Benutzer aufgefordert werden, den Code zu scannen. Wenn ein Benutzer einen temporären QR-Code scannt, löst WeChat ein entsprechendes Rückrufereignis aus, und wir müssen das Code-Scanverhalten des Benutzers im Rückrufereignis verarbeiten. Unter anderem müssen wir einige von WeChat übergebene Parameter verwenden:

FromUserName  发送方帐号(一个OpenID)
MsgType      消息类型,event
Event      事件类型,subscribe
EventKey    事件 KEY 值,qrscene_为前缀,后面为二维码的参数值
Nach dem Login kopieren

Hier ist zu beachten: Der EventKey, der durch das Scannen des von WeChat verfolgten QR-Codes übertragen wird, hat nicht das Präfix qrscene_ kann nur gefunden werden, indem der QR-Code gescannt und anschließend befolgt wird.

Nachdem wir den WeChat-Rückruf erhalten haben, müssen wir zunächst je nach Ereignistyp eine unterschiedliche Verarbeitung durchführen:

if ($message['MsgType'] == 'event'){
  if ($message['Event'] == 'subscribe'){ //关注
    return $this->subscribe($message);
  }
  if ($message['Event'] == 'unsubscribe') { //取消关注
    return $this->unsubscribe($message);
  }
  if ($message['Event'] == 'SCAN'){  //已关注扫码
    return $this->scan($message);
  }
}else{
  return "您好!欢迎使用 SwooleWechat 扫描登录";
}
Nach dem Login kopieren

Hier erklären wir nur die Geschäftslogik eines besorgniserregenden Ereignisses und können codieren die anderen nach Bedarf:

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);
}
Nach dem Login kopieren

Der EventKey hier ist eigentlich der mit WebSocket verbundene Client-Dateideskriptor. Er erhält die OPEN_ID des Benutzers, der den QR-Code gescannt hat, und erhält die Benutzerinformationen basierend auf der OPEN_ID des Benutzers. benachrichtigt den WebSocket-Dienst und antwortet auf die Textnachricht an WeChat.

Einer der problematischeren Punkte hier ist die Benachrichtigung des WebSocket-Dienstes. Wir wissen, dass sich der Code für die Verarbeitung von WeChat-Rückrufen nicht auf dem WebSocket-Dienst befindet. Es gibt zwei offizielle Lösungen von Swoole:

  1. Auf einen zusätzlichen UDP-Port hören

  2. Swoole_client als Client verwenden, um auf den Server zuzugreifen

Hier wählen wir die zweite Option. Swoole Version 1.8 unterstützt einen Server, um mehrere Ports abzuhören. Wir fügen dem WebSocket-Dienst einen neuen TCP-Port hinzu:

$tcp_server = $server->addListener('0.0.0.0', 9999, SWOOLE_SOCK_TCP);
$tcp_server->set([]);
$tcp_server->on('receive', function ($serv, $fd, $threadId, $data) {
  
});
Nach dem Login kopieren

Der Hauptserver ist das WebSocket- oder HTTP-Protokoll. Der neu überwachte TCP-Port erbt standardmäßig die Protokolleinstellungen des Hauptservers. Die Set-Methode muss separat aufgerufen werden, um das neue Protokoll festzulegen

Dann können wir den WebSocket-Dienst während des Code-Rückrufvorgangs benachrichtigen:

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);
}
Nach dem Login kopieren

Über erfolgreiche Anmeldung benachrichtigen

Nachdem der WebSocket-Dienst die Benachrichtigung über die erfolgreiche Anmeldung erhalten hat, kann er den Benutzer verarbeiten Informationen nach Bedarf, und dann werden die Benutzerinformationen an den Browser des Clients übergeben, um die Ergebnisse anzuzeigen. Erinnern Sie sich an den TCP-Port, den wir gerade abgehört haben? Es kann im Empfangsereignis verarbeitet werden:

$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);
});
Nach dem Login kopieren

Letzte Anmeldeschnittstelle:


Zusammenfassung

Der gesamte Prozess Es ist nicht schwierig. Die beiden Hauptschwierigkeiten sind die Kommunikation zwischen QR-Code-Scan-Benutzern und verschiedenen Servern, die den verbundenen Benutzern entsprechen. Unsere Lösung besteht darin, den verbundenen Dateideskriptor als temporären QR-Code-Szenenwert zu verwenden (Redis kann auch zum Speichern verwendet werden). es hier) Mapping-Beziehung), lauschen Sie dem neuen TCP-Port, um Benachrichtigungsnachrichten zu empfangen. Sie können http://wechat.sunnyshift.com/index.php besuchen, um es auszuprobieren. Denken Sie daran, es auf Ihrem Computer zu öffnen.

Verwandte Empfehlungen:

So implementieren Sie einen benutzerdefinierten WeChat-Scancode-Anmeldestil

PHP-Ideen und Code zur Implementierung der WeChat-Scancode-Anmeldung

Detaillierte Erläuterung der PC-WeChat-Scancode-Registrierung und des Anmeldebeispielcodes

Das obige ist der detaillierte Inhalt vonSwoole implementiert die Anmeldefunktion zum Scannen von WeChat-Code. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage