最近、thinkPHP 5 フレームワークを使用してブライダル ショップ プロジェクトを作成しました。開発プロセス中にサードパーティのログインが必要でした。Tencent が提供する公式のケースは、tp5 に配置されると複数のファイルで実装されました。コントローラー内でそれを見つけるのは非常に残念です。期待された機能は include または require では完了できません。Tencent の公式にシールされたクラスを使用したい場合は、次のように変更する必要があります:
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规范,类名要跟文件名一致,所以要把文件名改一下,同时加上命名空间extendqqlogin,tp5所有的类都要有命名空间。
另外为了防止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 仕様に従って、クラス名はファイル名と一致する必要があるため、ファイル名を変更し、名前空間
extendqqlogin を追加する必要があることにも注意してください。すべてのクラス。 tp5 には名前空間 が必要です。
さらに、tp5 が必要なファイルを見つけられないようにするには、config.php ファイルの 30 行目にルート名前空間を登録するのが最善です:
$this->keysArr = array( "oauth_consumer_key" => (int)$this->appid, "access_token" => session('access_token'), "openid" => session('openid') );
3 ソース コードを変換します。
🎜QC のため、後者から変更して、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 つは、元々は comm フォルダーの下にある inc.php に保存されていました。直接来てメンバー属性になってください。 🎜🎜次に、関数を構築し、3 つのクラスをインスタンス化します。そのうちの 2 つはもう存在しません。前述したように、これら 2 つの単語は互いに関連しているので、見つけたらコメントするか削除してください。 🎜🎜
qq_login()
の下の最初のメンバー メソッドを見てください。🎜rrreee🎜 これら 2 つの単語を含む行はすでに削除されていますが、これらのものが再び必要になります。忘れないでください。 3 つのメンバー属性を追加しました上ではこれらの値がすでにあり、以下でそれらを使用する場合は、$this->appid
を渡すだけです。状態を確認するとき、TP5 はセッションを記述するためのアシスタント機能を提供します: 🎜rrreee🎜 最後の文はヘッダジャンプです。なぜ TP5 でジャンプ効果が見られないのかわからないので、直接返します。 URL を指定し、tp5 リダイレクト関数 $this->redirect()
を使用して、コントローラーにジャンプを実装します。 🎜🎜以下の qq_callback() を見てください🎜rrreee🎜 qq_login で session を記述したところ、これも tp5 のアシスタント関数であり、 get を取得できます。要求されたパラメーターの結果は配列ですが、キーと値のペアを動的に追加する場合は、それを変数に割り当ててから、その変数を操作する必要があります。ここでエラーが発生した場合は、直接終了してエラー番号を出力してください。公式ドキュメントにはエラー番号の詳細な説明が記載されています。最後に、取得した access_token がセッションに直接書き込まれます。 🎜🎜以下の get_openid()
メソッドも同様です。パラメータ リストはセッションを使用して構築され、戻り値はセッションに直接書き込まれます。 🎜🎜次に、QC.php を変更します。構築方法を変更して、配列の 3 つの変数に値を与えるだけです。 🎜rrreee🎜🎜🎜4. コントローラー呼び出し🎜🎜🎜🎜の変換が完了し、コントローラーで使用できるようになります。コードは以下に添付されています。コールバック関数 ユーザー情報を取得するには 2 つの QC が必要です。2 回目のインスタンス化には、🎜openid🎜 と 🎜access_token🎜 という 2 つのパラメータがあります。 🎜以上がTP5実践プロジェクトにおけるQQサードパーティログイン機能導入事例共有の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。