ホームページ >バックエンド開発 >PHPチュートリアル >thinkPHP5 プロジェクトに QQ サードパーティ ログイン機能を実装する

thinkPHP5 プロジェクトに QQ サードパーティ ログイン機能を実装する

不言
不言オリジナル
2018-06-06 16:16:292389ブラウズ

この記事では主に、thinkPHP5 プロジェクトでの QQ サードパーティ ログイン機能の実装について紹介し、QQ ログイン インターフェイスを変更して thinkPHP5 プロジェクトに統合する具体的な手順と関連する操作スキルを例の形で詳細に分析します。困っている友達は参考にしてください

この記事の例では、thinkPHP5 プロジェクトでの QQ サードパーティ ログイン機能の実装について説明します。詳細は次のとおりです:

最近、ブライダル ショップ プロジェクトを構築するために、Tencent によって提供されたサードパーティのログインが必要でした。いくつかのファイルをインクルードすることで実装されましたが、コントローラー内で include や require を使用しても期待どおりの機能を実行できないのは非常に残念です。

1. 公式 SDK を見つける コア ファイル

がフレームワークの外で使用されている場合、このファイルを開くときに include 'qqConnectAPI.php' を実行できます。 comm フォルダー内に他のいくつかのファイルが含まれていることを確認してください。いくつかのファイルは、いくつかの定数を定義し、APP KEY 情報を記録するだけです。それは、クラス フォルダーにいくつかのクラス ファイルを置くだけで問題ありません。コードを注意深く見てみると、実際には 3 つのクラスを取得すれば、関数を完全に実装できることがわかります。

include 'qqConnectAPI.php',打开这个文件可以看到它是包含了另外几个文件的,comm文件夹下的几个文件无非就是定义一些常量,记录一下你的APP KEY这些信息,都无关紧要,只要把class文件夹下的几个类文件放到tp5里面就好了,而且仔细看一下代码会发现其实只要拿到三个类就完全可以实现功能了。

2. 放到tp框架里

tp5推荐将第三方的东西,同时又不是composer安装的统一放到extend目录下,因为可能以后还要做其他扩展,这里将qq登录相关的单独建一个qqlogin文件夹,

可以看到里面只有三个类,我去掉了一个Recorder和一个ErrorCase类,见名知意,这两个的作用是记录一些信息,如access_token,还有异常处理,这里我就直接删掉了。另外注意,按照psr4规范,类名要跟文件名一致,所以要把文件名改一下,同时加上命名空间extendqqlogintp5所有的类都要有命名空间

另外为了防止tp5找不到我们需要的文件,最好在config.php文件里注册一条根命名空间,在第30行:

// 注册的根命名空间
'root_namespace'  => [
 'extend\qqlogin' => '../extend/qqlogin/',
 'extend\baidu' => '../extend/bdlogin/'
],

3. 改造源代码

因为QC.php是继承了Oauth.php,我们从后者改起,去掉require_once,加上命名空间这个就不说了,首先看成员属性,类常量是腾讯平台的地址,不用管,原来有三个属性,recorder、error不需要,注释掉或直接删掉。下文同样,要想象跟这两个单词有仇,看到就注释或删掉。

// protected $recorder;
public $urlUtils;
// protected $error;
public $state;
public $appid = "****";
public $callback = "http://****/index/user/qqcallback";
public $scope = "get_user_info";

下面四个属性是需要添加的,state用于防止CSRF攻击,下面三个看官方文档就知道是什么东西了,这些原来是在comm文件夹下的inc.php存放的,现在直接拿过来变成成员属性。

然后构造函数,实例化三个类,有两个已经不存在了,而且上面说了,跟这两个单词有仇,看到就要注释或删掉。

再看下面的第一个成员方法qq_login()

public function qq_login(){
 $appid = $this->recorder->readInc("appid");
 $callback = $this->recorder->readInc("callback");
 $scope = $this->recorder->readInc("scope");
 //---生成唯一随机串防CSRF攻击
 $state = md5(uniqid(rand(), TRUE));
 $this->recorder->write('state',$state);
 *
 *
 return $login_url;
 // header("Location:$login_url");
}

我们已经有仇把有那两个单词的这几行删掉了,我们又需要这些东西,不要忘了我们上面增加了三个成员属性,这些值我们已经有了下面用的时候通过$this->appid就好了。state验证的时候我们可以通过session去验证,在tp5里面提供了助手函数去写session:

session('state',$this->state);

最后一句是header跳转,暂不知道什么原因在tp5里面并不能看到跳转效果,于是直接将url返回,再在控制器里面通过tp5的重定向函数$this->redirect()实现跳转。

下面看qq_callback()

public function qq_callback(){
 // $state = $this->recorder->read("state");
 //---验证state防止CSRF攻击
 if(input('state') != session('state')){
  // $this->error("30001");
  exit('30001');
 }
 *
 *
 // return $params["access_token"];
 session('access_token',$params["access_token"]);
}

出现那两个单词的已经注释了,我们在qq_login里面有写session,这里直接取sessio比较就行了,input()也是tp5的助手函数,可以获得get、post请求的参数,结果是一个数组,但是不能够再动态为其添加键值对,想要添加的话必须将其赋给一个变量,再对变量进行操作。这里有错误的话直接exit打印出错误号,官方文档有详细的错误号说明。在最后也是直接将获取到的access_token写进session。

下面的get_openid()

2. tp フレームワークに入れる

tp5 は、将来他の拡張機能が必要になる可能性があるため、composer によってインストールされないサードパーティ製のものを extend ディレクトリに入れることを推奨します。ここに qq ログイン関連があります。別の qqlogin フォルダーを作成します

はいクラスは 3 つだけなので、Recorder クラスと ErrorCase クラスを削除しました。名前が示すように、これら 2 つの機能は、access_token や例外処理などの情報を記録することなので、ここで直接削除しました。また、psr4 仕様によれば、クラス名はファイル名と一致する必要があるため、ファイル名を変更し、名前空間 extendqqlogintp5 のすべてのクラスには名前空間が必要です

さらに、tp5 が必要なファイルを見つけないようにするには、config.php ファイルの 30 行目でルート名前空間を登録するのが最善です:

🎜🎜
$this->keysArr = array(
 "oauth_consumer_key" => (int)$this->appid,
 "access_token" => session('access_token'),
 "openid" => session('openid')
);
🎜🎜🎜🎜🎜3.コード🎜🎜🎜 🎜QC.php は Oauth.php を継承しているので、後者から変更して、require_once を削除し、名前空間を追加します。最初に、クラス定数はアドレスです。 Tencent プラットフォームの属性は、レコーダーとエラーの 3 つですが、必要ありません。コメントアウトするか、直接削除してください。以下同様です、この2つの単語に対して恨みがあると想像して、見かけたらコメントするか削除してください。 🎜🎜🎜
use extend\qqlogin\QC;
// 处理qq登录
public function qqlogin()
{
 $qq = new QC();
 $url = $qq->qq_login();
 $this->redirect($url);
}
// qq登录回调函数
public function qqcallback(UserModel $user)
{
 $qq = new QC();
 $qq->qq_callback();
 $qq->get_openid();
 $qq = new QC();
 $datas = $qq->get_user_info();
 * // 拿到用户信息后的处理
 *
}
🎜🎜🎜 CSRF 攻撃を防ぐために次の 4 つの属性を追加する必要があります。次の 3 つが何であるかは、公式ドキュメントを参照するとわかります。フォルダーを作成し、それを直接取得してメンバー属性に変換します。 🎜🎜次に、関数を構築し、3 つのクラスをインスタンス化します。そのうちの 2 つはもう存在しません。前述したように、これらの 2 つの単語を見つけたらコメントするか削除してください。 🎜🎜qq_login() の下の最初のメンバー メソッドを見てください🎜🎜🎜rrreee🎜🎜🎜 これら 2 つの単語を含む行はすでに削除されていますが、これらが再び必要になります。上記に 3 つのメンバー属性を追加しました。以下で使用する場合は、$this->appid を渡すだけです。状態を検証する場合、セッションを介して検証できます。 🎜🎜🎜rrreee🎜🎜🎜 最後の文は、なぜジャンプできないのかわかりません。その結果、URL が直接返され、リダイレクト関数 $this->redirect() がコントローラーに実装されます。 🎜🎜以下の qq_callback() を見てください🎜🎜🎜rrreee🎜🎜🎜 qq_login の session は tp5 のヘルパー関数と直接比較してください。 get リクエストと post リクエストのパラメータを取得できます。結果は配列ですが、キーと値のペアを動的に追加することはできません。それを変数に割り当ててから、その変数を操作する必要があります。ここでエラーが発生した場合は、直接終了してエラー番号を出力してください。公式ドキュメントにはエラー番号の詳細な説明が記載されています。最後に、取得した access_token がセッションに直接書き込まれます。 🎜🎜以下の get_openid() メソッドも同様です。パラメータ リストはセッションを使用して構築され、戻り値はセッションに直接書き込まれます。 🎜🎜次に、QC.php を変更します。構築方法を変更して、配列の 3 つの変数に値を与えるだけです。 🎜🎜🎜rrreee🎜🎜🎜🎜🎜4. コントローラー呼び出し🎜🎜🎜🎜 変換が完了し、コントローラーで使用できるようになります。コードは以下に添付されています。

use extend\qqlogin\QC;
// 处理qq登录
public function qqlogin()
{
 $qq = new QC();
 $url = $qq->qq_login();
 $this->redirect($url);
}
// qq登录回调函数
public function qqcallback(UserModel $user)
{
 $qq = new QC();
 $qq->qq_callback();
 $qq->get_openid();
 $qq = new QC();
 $datas = $qq->get_user_info();
 * // 拿到用户信息后的处理
 *
}

切记:

在回调函数里面要实例化两次QC才能拿到用户信息,第二次实例化的时候才有openidaccess_token两个参数。

相关推荐:

ThinkPHP实现图片上传操作的方法

基于thinkPHP实现的微信自定义分享功能

以上がthinkPHP5 プロジェクトに QQ サードパーティ ログイン機能を実装するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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