ホームページ  >  記事  >  バックエンド開発  >  SwooleがWeChatコードスキャンログイン機能を実装

SwooleがWeChatコードスキャンログイン機能を実装

小云云
小云云オリジナル
2018-01-16 13:43:152187ブラウズ

QR コードをスキャンするログイン方法は、現在のアプリケーションでますます使用されています。 WeChat ID があれば、パスワードを覚える必要がないため、すばやく簡単にログインできます。これは、WeChat パブリック プラットフォーム上のパラメータ付きの一時的な QR コードをベースにしており、Swoole の WebSocket サービスと組み合わせられています。スキャンコードログインを実現します。この記事は主に、WeChat コード スキャン ログイン機能を実装する Swoole について共有し、皆様のお役に立てることを願っています。

WeChat の人気に伴い、現在のアプリケーションでは QR コード ログイン方法がますます使用されています。パスワードを覚える必要がないため、WeChat ID があればすぐに簡単にログインできます。 WeChat のオープン プラットフォームは、QR コードをスキャンしてログインする機能をネイティブにサポートしていますが、ほとんどの人は依然としてパブリック プラットフォームを使用しているため、QR コードをスキャンしてログインする機能は自分たちでしか実装できません。これは、WeChat パブリック プラットフォームのパラメータ付きの一時 QR コードに基づいており、それを Swoole の WebSocket サービスと組み合わせて、スキャンコード ログインを実装します。一般的なプロセスは次のとおりです:

  1. クライアントはログインインターフェイスを開き、WebSocketサービスに接続します

  2. WebScoketサービスはパラメータを含むQRコードを生成し、クライアントに返します

  3. ユーザーはパラメーター付きの QR コードが表示されます

  4. WeChat サーバーはスキャン イベントをコールバックし、開発者サーバーに通知します

  5. 開発者サーバーは WebSocket サービスに通知します

  6. 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 つあります:

  1. 追加の UDP ポートをリッスンする

  2. サーバーにアクセスするクライアントとして 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。