キーウィからのリクエストを受け入れるサーバーのコード
<?php /** * QIWI . * SoapServer SOAP-, login, password, txn, status, * Param updateBill TestServer. * * updateBill. */ $s = new SoapServer('IShopClientWS.wsdl', array('classmap' => array('tns:updateBill' => 'Param', 'tns:updateBillResponse' => 'Response'))); // $s = new SoapServer('IShopClientWS.wsdl'); $s->setClass('TestServer'); $s->handle(); class Response { public $updateBillResult; } class Param { public $login; public $password; public $txn; public $status; } class TestServer { function updateBill($param) { // $f = fopen('c:\\phpdump.txt', 'w'); fwrite($f, $param->login); fwrite($f, ', '); fwrite($f, $param->password); fwrite($f, ', '); fwrite($f, $param->txn); fwrite($f, ', '); fwrite($f, $param->status); fclose($f); // password, login // $param->status if ($param->status == 60) { // // ($param->txn), } else if ($param->status > 100) { // ( , ..) // ($param->txn), } else if ($param->status >= 50 && $param->status < 60) { // } else { // } // // , 0 // $temp->updateBillResult = 0 // (, ), // QIWI 0 // 24 $temp = new Response(); $temp->updateBillResult = 0; return $temp; } } ?>
もちろん、この例は網羅的であることを理解していますが、「もっと準備ができた」何かをレイアウトすることは可能だったのでしょうか? このシステムはPHP言語のように人気があるため、このシステムに接続しなければならない人々の生活を簡素化するために、ライブラリをすぐに公開リポジトリに置くことにしました。 私の最近の質問では誰もこの投稿に反対しなかったので、ここに投稿します。
ライブラリにはクライアントとサーバーの両方の部分があります。 単純に接続します-git経由でアップロードするか、コンポーザーに依存関係を追加します( werkint / qiwi )。 主な作業は、Qiwi \ Clientクラスのインスタンスを通過します。 たとえば、それから継承し、コンストラクターでストアの名前/パスワードを指定し、クラスをSymfony2サービスとして設計できます(これは私たちのために行われます)。
接続中
<?php namespace MyOwnMegaPrefix\Qiwi; use MyOwnMegaPrefix\Settings, Werkint\Qiwi; class MyQiwi extends Qiwi\Client { protected $settings; public function __construct( Settings $settings // , ) { $this->settings = $settings; parent::__construct( $this->settings->get('qiwi.login'), $this->settings->get('qiwi.pass') ); } }
クライアント(これはSOAPサーバーにリクエストを送信するクライアント)として動作することは基本的です-Qiwi \ Clientのインスタンスを取得し、適切なメソッドを呼び出します。 これらは、php-soapを操作し、パラメーターを変換し、リターンコードをより詳細な状態に変更するためのクラスの単なるラッパーです。 日付フィールドは\ DateTimeにあり、他のすべてはqiwi apiに対応しています(ログイン/パスワードのみを複製する必要はありません)。
サーバーでの作業はもう少し複雑です。 サーバーメソッドは非常にトリッキー(SOAP)と呼ばれるため、クロージャーを使用して要求を処理することにしました。 はい、 設定で x509証明書を無効にすることを忘れないでください。 WSSEをphp-soapに固定する方法をまだ見つけていません(私が理解している限り、誰もそれを見つけませんでした)。 Javaコードの例に証明書のチェックがあるのは残念です。
キーウィからのリクエストを受け入れるサーバーのコード
use Werkint\Qiwi\ServerMethods\CheckBillResponse as QiwiBill; $callback = function ($bill) use (&$myMegaService) { /** @var QiwiBill $bill */ $row = $myMegaService->findByKey( // $bill->id ); if (!$row) { throw new \Exception(' '); } $myMegaService->process($row); // - return $myMegaService->status(); // QIWI. 0 - }; // $theQiwiObject->processRequest($callback); // text/html, qiwi ( , ) header('Content-Type: text/xml; charset=utf-8');
便利ですか? そう思う。 単純に代替パスと比較できます 。 したがって、ライブラリの利点:
- SOAP、WSDLなどについて考える必要はありません。 すべてが機能します。
- サーバーの署名チェックがあり、ステータスの更新後、チェックがサーバーから再ロードされます(doki kiwiの推奨に従って)。
- PHPDocとすべてが揃っているので、間違いを犯すのはより困難です。 いくつかの場所では、追加の説明があります(レーキの場所)。
- ステータスは復号化されます(コード->テキスト)。
- packagistがいます。接続には2分かかります。
- オートローダーで正常に動作します。
もちろん、短所もあります。
-
ある種の愚かなタイプは、彼のライブラリーを通して小切手を書くことを提供します。 - PHP 5.3 クロージャー+名前空間。 これがあなたに合わないなら、新しいものを切ることは難しくありません。
リンク: プロトコルの説明 、 サンプルコード 、 リポジトリ
システムがねじ込まれた後、ユーザーJekaRuからkiwiを操作するための既製のライブラリについて学びました 。 したがって、より多くの選択肢があります。 :)
ご清聴ありがとうございました。 コードの清潔さについてコメントがある場合は、お気軽にお問い合わせください。
UPD:Readme.mdに説明を追加し、ライブラリをPSR-2に転送しました
UPD2:lib、nick4fake / ishop-> werkint / qiwiを移動しました。 互換性のために、古いコードは古いアドレスのままにしました。