QR コードをスキャンするログイン方法は、現在のアプリケーションでますます使用されています。 WeChat ID があれば、パスワードを覚える必要がないため、すばやく簡単にログインできます。これは、WeChat パブリック プラットフォーム上のパラメータ付きの一時的な QR コードをベースにしており、Swoole の WebSocket サービスと組み合わせられています。スキャンコードログインを実現します。この記事は主に、WeChat コード スキャン ログイン機能を実装する Swoole について共有し、皆様のお役に立てることを願っています。
WeChat の人気に伴い、現在のアプリケーションでは QR コード ログイン方法がますます使用されています。パスワードを覚える必要がないため、WeChat ID があればすぐに簡単にログインできます。 WeChat のオープン プラットフォームは、QR コードをスキャンしてログインする機能をネイティブにサポートしていますが、ほとんどの人は依然としてパブリック プラットフォームを使用しているため、QR コードをスキャンしてログインする機能は自分たちでしか実装できません。これは、WeChat パブリック プラットフォームのパラメータ付きの一時 QR コードに基づいており、それを Swoole の WebSocket サービスと組み合わせて、スキャンコード ログインを実装します。一般的なプロセスは次のとおりです:
クライアントはログインインターフェイスを開き、WebSocketサービスに接続します
WebScoketサービスはパラメータを含むQRコードを生成し、クライアントに返します
ユーザーはパラメーター付きの QR コードが表示されます
WeChat サーバーはスキャン イベントをコールバックし、開発者サーバーに通知します
開発者サーバーは WebSocket サービスに通知します
WebSocket サービスはログインが成功したことをクライアントに通知します
WebSocketサービスに接続します
Swooleをインストールしたら、WebSocketサービスを利用する必要があります。新しい WebSocket サービスの作成は非常に簡単です:
$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) { });
サーバーがメッセージを送信するため、ここでのメッセージ コールバックは実際には役に立ちませんが、サービスを設定する必要があります。設定したポート番号が 1024 より小さい場合は、必ずサーバー上のファイアウォールでポートを開く必要があります。
パラメーターを使用して QR コードを生成する
クライアントが WebSocket サービスに正常に接続したら、パラメーターを使用して WeChat QR コードを生成し、表示するためにクライアントに返す必要があります:
$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 ])); });
オープン コールバックで QR コードを生成します一時的な QR コード。QR コードのシーン値はクライアント接続のファイル記述子であり、各クライアントの一意性を確保するために、1 つの QR コードが複数回スキャンされるのを防ぐために有効時間が 120 秒に設定されます。メッセージがクライアントにプッシュされるとき、クライアントの処理を容易にするために 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); } });
コード スキャン イベントをコールバックします
QR コードがクライアントに表示された後、ユーザーはコードをスキャンするように求められます。ユーザーが一時的な QR コードをスキャンすると、WeChat は対応するコールバック イベントをトリガーします。ユーザーのコード スキャン動作をコールバック イベントで処理する必要があります。その中で、WeChat によって渡されるいくつかのパラメーターを使用する必要があります。
FromUserName 发送方帐号(一个OpenID) MsgType 消息类型,event Event 事件类型,subscribe EventKey 事件 KEY 值,qrscene_为前缀,后面为二维码的参数值
ここで注意すべき点が 1 つあります。WeChat によって追跡された QR コードのスキャンによってプッシュされた EventKey には、qrscene_ プレフィックスがありません。スキャンすることによってのみ見つけることができます。 QRコードを取得して、それに従ってください。
WeChat コールバックを受信した後、まずさまざまなイベント タイプに応じてさまざまな処理を行う必要があります:
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 扫描登录"; }
ここでは 1 つのイベントのビジネス ロジックのみを説明し、その他は必要に応じてコーディングします:
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); }
ここでの EventKey は次のとおりです。実際にWebSocketに接続 クライアントファイル記述子は、QRコードをスキャンしたユーザーのOPEN_IDを取得し、ユーザーのOPEN_IDに基づいてユーザー情報を取得し、WebSocketサービスに通知し、テキストメッセージをWeChatに応答します。
ここでのより厄介な点の 1 つは、WebSocket サービスに通知する方法です。WeChat コールバックを処理するコードが WebSocket サービス上にないことはわかっていますが、異なるサーバーはどのように通信するのでしょうか。 Swoole が提供する公式ソリューションは 2 つあります:
追加の UDP ポートをリッスンする
サーバーにアクセスするクライアントとして swoole_client を使用する
ここでは 2 番目のソリューションを選択します。Swoole 1.8 バージョンは 1 つのサーバーをサポートします。複数のポートをリッスンするには、WebSocket サービスに新しい 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) { });
メイン サーバーは、デフォルトでメイン サーバーのプロトコル設定を継承する必要があります。新しいプロトコルは、プロトコルに到達した後にのみ有効になります
その後、コード スキャン コールバック プロセス中に WebSocket サービスに通知できます:
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); }
ログイン成功の通知
WebSocket サービスの後ログイン成功の通知を受信すると、必要な情報に応じてユーザーを処理し、そのユーザー情報をクライアントのブラウザに渡して結果を表示します。先ほど聞いた TCP ポートを覚えていますか?これは受信イベントで処理できます:
$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); });
最後のログイン インターフェイス:
概要
プロセス全体は難しくありません。主な 2 つの問題は、接続されているユーザーに対応するコード ユーザーのスキャンと通信です。異なるサーバー間の通信の場合、私たちの解決策は、接続されたファイル記述子を一時的な QR コード シーン値として使用し (マッピング関係を保存するために Redis を使用することもできます)、新しい TCP ポートをリッスンして通知メッセージを受信することです。 http://wechat.sunnyshift.com/index.php にアクセスして試してみてください。忘れずにコンピュータで開いてください。
関連する推奨事項:
カスタム WeChat コード スキャン ログイン スタイルを実装する方法
WeChat コード スキャン ログイン スタイルを実装するための php のアイデアとコード
PC WeChatスキャンコード登録とログインサンプルコードの詳細説明
以上がSwooleがWeChatコードスキャンログイン機能を実装の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。