ホームページ  >  記事  >  バックエンド開発  >  PHP で WeChat アプレット ログインを実装する方法

PHP で WeChat アプレット ログインを実装する方法

PHPz
PHPzオリジナル
2023-04-21 10:00:572662ブラウズ

WeChat ミニ プログラムは、近年非常に人気のあるアプリケーション タイプであり、その利便性、使いやすさ、環境に優しい完全性により、さまざまなシナリオで広く使用されています。 WeChat アプレットを開発する場合、多くの場合、ユーザー ログイン機能を実装する必要がありますが、これは従来の Web サイト ログインと同様に実装が困難です。この記事では、WeChat アプレット ログインの実装プロセスを紹介します。これには、主にコードを取得するための API を呼び出すフロントエンド、コードを受信して​​ WeChat サーバーにリクエストしてユーザーの openid と session_key を取得し、最後にユーザー情報を独自のデータベースに保存します。

1. WeChat ミニ プログラムのログイン プロセス

WeChat ミニ プログラムのログイン プロセスは、次の図に示すとおりです。プロセスは次のとおりです。

PHP で WeChat アプレット ログインを実装する方法ユーザーはミニ プログラムを開き、ログイン ボタンをクリックします。

フロントエンドは、wx.login を介して API を呼び出し、一時的なログイン資格情報コードを取得します。

    コードをバックエンド サーバーに送信します。
  1. バックエンドは、openid と session_key を取得するために WeChat サーバーにリクエストを送信します。
  2. WeChat サーバーは openid と session_key を返します。
  3. バックエンドは、openid に基づいてデータベースにクエリを実行し、ユーザーが存在しない場合は、そのユーザーをデータベースに追加します。
  4. バックエンドはユーザー情報を保存し、カスタム ログイン トークンを生成して、それをフロントエンドに返します。
  5. フロントエンドは、トークンをユーザーのログイン資格情報としてローカルに保存します。
  6. ユーザーが次回ログインするとき、フロントエンドはトークンを運び、バックエンドにリクエストを送信します。バックエンドはトークンの有効性を検証します。トークンが有効であれば、ログインは成功します。有効でなければ、ログインは成功します。ログインしていないエラーが返されます。
  7. 2. フロントエンドは一時ログイン認証コードを取得します
  8. フロントエンドは、wx.login を使用して API を呼び出し、一時ログイン認証コードを取得します。この API によって返されるコードは 5 分間のみ有効であるため、リクエストは時間内にバックエンドに送信される必要があります。
  9. wx.login({
      success: function(res) {
        if (res.code) {
          // 发送code至后端服务器
          wx.request({
            url: 'https://example.com/login.php',
            method: 'POST',
            data: {'code': res.code},
            success: function(resp) {
              // 获取后端返回的token并存储至本地
              wx.setStorageSync('token', resp.data.token);
            }
          });
        } else {
          console.log('获取登录态失败!' + res.errMsg);
        }
      }
    });
3. バックエンドは openid と session_key を取得します

バックエンドは、フロントエンドによって送信された一時的なログイン資格情報コードを受信し、openid と session_key を取得するリクエストを WeChat サーバーに送信します。リクエストされた URL は https://api.weixin.qq.com/sns/jscode2session です。伝達する必要があるパラメータには、appid、secret、js_code、grant_type が含まれます。ここで、appid と Secret は開発者 ID とアプレットの対応するキー、js_code はフロントエンドによって取得されたコード、grant_type は認証タイプ、および値です。は authorization_code です。

$appid = "Your AppID";
$secret = "Your AppSecret";
$code = $_POST['code'];
$url = "https://api.weixin.qq.com/sns/jscode2session?appid=$appid&secret=$secret&js_code=$code&grant_type=authorization_code";

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$res = curl_exec($ch);
curl_close($ch);
$data = json_decode($res, true);
$openid = $data['openid'];
$session_key = $data['session_key'];
4. ユーザー情報のバックエンド処理

バックエンドは、openid に基づいてデータベースにクエリを実行し、ユーザーが存在しない場合はデータベースに追加されます。この例では、データベース管理システムとして MySQL が使用されており、ユーザー データ テーブルの名前は user で、フィールド id、openid、create_time が含まれています。このうち、id はユーザー ID (自己増加)、openid はユーザーの一意の識別子、create_time はユーザーの作成時刻です。

// 连接数据库
$con = mysqli_connect('localhost', 'root', 'password', 'database');
mysqli_set_charset($con, 'utf8');

// 查询用户
$result = mysqli_query($con, "SELECT * FROM user WHERE openid='$openid' LIMIT 1");

if(mysqli_num_rows($result) == 0) {
  // 添加新用户
  $now = date('Y-m-d H:i:s');
  mysqli_query($con, "INSERT INTO user (openid, create_time) VALUES ('$openid', '$now')");

  // 获取用户ID
  $user_id = mysqli_insert_id($con);
} else {
  // 获取用户ID
  $row = mysqli_fetch_assoc($result);
  $user_id = $row['id'];
}
ユーザー ID が正常に取得されると、バックエンドはカスタム ログイン トークンを生成し、ユーザー情報を保存できます。

// 生成token
$token = md5($user_id . time() . mt_rand());

// 存储token和用户信息
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->setex($token, 3600 * 24 * 7, $user_id);

// 返回token
echo json_encode(array('token' => $token));
5. フロントエンド ストレージ トークン

フロントエンドは、バックエンドから返されたトークンを取得した後、それをローカルに保存します。一般に、次回の訪問時にオンデマンドで取得できるように、LocalStorage または SessionStorage がストレージとして使用されます。

wx.request({
  url: 'https://example.com/login.php',
  method: 'POST',
  data: {'code': res.code},
  success: function(resp) {
    // 获取后端返回的token并存储至本地
    wx.setStorageSync('token', resp.data.token);
  }
});
6. ユーザーの次回訪問時のトークンの有効性の検証

ユーザーが次回訪問するとき、フロントエンドは以前に取得して保存したトークンを保持してリクエストを送信する必要があります。バックエンドにアクセスし、バックエンドはトークンの有効性を検証します。トークンが有効な場合、ログインは成功します。そうでない場合は、ログインされていないエラーが返されます。

// 验证token有效性
$token = $_POST['token'];
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$user_id = $redis->get($token);

if($user_id) {
  // 验证成功,返回用户信息
  // ...
} else {
  // 验证失败,返回未登录错误
  echo json_encode(array('errcode' => 40001, 'errmsg' => 'user not logged in'));
}
7. 概要

WeChat アプレット ログインを実装するには、フロントエンドとバックエンドが協力して複数の手順を完了する必要があります。バックエンドは openid と session_key を取得し、バックエンドはユーザー情報を処理してカスタム ログイン トークンを生成し、フロントエンドに返します。フロントエンドは、次回のアクセスのためのログイン認証情報としてトークンをローカルに保存します。ユーザー リクエストを受信した後、バックエンドはトークンが有効かどうかを確認する必要があります。有効な場合は対応するユーザー情報を返し、そうでない場合はログインしていないエラーを返します。以上の手順により、WeChat アプレットのユーザーログイン機能を比較的安定して実装することができます。

以上がPHP で WeChat アプレット ログインを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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