申し訳ありませんが、プロトコルを更新しています。

2011年に、QIWIに接続しているパートナーの側に請求先電話番号を入力する理由を尋ねられました。 APIの統合を促進したいと長年望んでいましたが、以前は非常に困難でした。 2016年に何が変わったのですか? KhabrovのR&D投票を試し、実験するだけでなく、教えてください。







大企業の和解、痛み、涙



簡略化するために、3つのグループが社内のプロジェクトの作業に関与しています。





各ユニットには、キューと優先度を持つ独自のサブグループがありました。 このサイトを真剣に改訂するタスクは、大勢の同僚に影響を与えました。









このアプローチにより、トップにとって最優先事項であったプロジェクトが迅速に開始されました。別のプロジェクトチームが割り当てられ、優先度やキューのない非常に複雑なプロジェクトを最短時間で開始しました。 ただし、他のすべての製品タスクは、実装のためにキューにスタックする可能性があります。 最も影響を受けたのは、すでに発売されている製品の開発です。



現在、QIWIは特定の製品のチームを結成しています。 同時に、たとえば、製品チームのJava開発者は、必要に応じて、支払い処理に変更を加えることができます。これはテストされ、受け入れられます。 以前は、処理開発者のみがこれを行う必要がありました。 Web開発者は、タスクキュー内の他のプロジェクトに切り替えました。 新しいアプローチにより、チームの柔軟性が向上し、新しい機能を実装する時間が大幅に短縮されます。 どのように変更することにしたかを見てみましょう。



8年後、私たちは決めました



メインプロトコルの変更は重要なステップですが、パートナー側の電話番号の必須入力は統合と支払いを複雑にします。 2つの開発オプションを調査しました。



1.サーバーRESTプロトコルでは、請求先電話番号を指定する必要があります。 任意の識別子または電子メールに請求するための改訂オプションを検討しました。



長所:





短所:





2.同社には、QIWI側に番号が入力されたhttpプロトコルがありました。 しかし、請求書がパートナーによって正確に発行されたことを、いかなる方法でも検証しませんでした。 このプロトコルは寄付の収集に理想的でしたが、大規模なパートナーにはこの形式で適用できませんでした。 解決策は、署名またはハッシュを追加し、請求書支払いページにリダイレクトするときにそれらを検証することでした。



長所:





短所:





いくつかの議論の後、2番目のオプションが選択されました。 当初、セキュリティサービス部門とIT部門は、公開鍵と秘密鍵に基づく署名の形成を好みました。 しかし、大規模なパートナーとの統合の経験、および証明書を置き換えるときに生じる質問や問題の数を思い出して、sha512ハッシュのチェックを停止することにしました。







質問がありました、どのパラメーターをハッシュするのですか? 最も簡単なオプションは、すべてをアルファベット順にソートし、秘密鍵を追加してハッシュを取ることです。 分析後、コメントとエンコードに問題がある可能性があることが明らかになったため、リストを必要最小限のパラメーター数に減らしました。



秘密鍵をどのように決定するかという疑問が残りました。 基本認証では、RESTプロトコルはAPI IDとAPIパスワードのペアを使用します。これにより、パートナーのチェックを柔軟に構成できます。 1つのサイトに対して、複数の許可ペアを作成し、それらを異なるサーバーおよびサイトのバージョンで使用できます。



アルゴリズムと例



その結果、このアルゴリズムに到達しました。





PHPでの実装例。



// ID , API_ID, API      url: https://ishop.qiwi.com/options/rest.action $shopId = '260***'; $apiKey = '4683****'; $apiPassword = '1T1ea7****'; $CCY = 'RUB'; $amount = 1.12; //    71231234567.   $phone = null; // ID  $txnId = 'habr'.rand(1,90000); $params = [$apiKey, $CCY, $shopId, $amount, $txnId]; if (null !== $phone) { $params = [$apiKey, $CCY, $shopId, $amount, $phone, $txnId]; } //      $params[] = md5($apiKey); //       "|" $paramsStr = implode('|', $params); //   $signature = hash('sha512', $paramsStr); //  query  $query = http_build_query([ 'from' => $shopId, 'to' => $phone, 'txn_id' => $txnId, 'summ' => $amount, 'api_id' => $apiKey, 'ccy' => $CCY, 'signature' => $signature ]); //   url   $url = 'https://bill.qiwi.com/order/external/create.action?'.$query;
      
      





共同研究開発



実験として、プロトコルの開発方法を一緒に決定することを提案します。 いくつかの技術的な問題を解決していないため、プロトコルの開発方法を検討することをお勧めします。 このため、記事の最後に投票が追加されました。



主な問題は、アカウントのライフタイムの原因となるライフタイムパラメータのままです。 既存のプロトコルでは、数分で送信され、転送後すぐに請求書が発行されました。 新しいリンクでは、特にリンクが電子メールで送信された場合、請求書をかなり後で発行できます。 したがって、ほとんどの場合、絶対日付で新しいパラメーターを追加する必要があります。 たとえば、RESTで使用されるISO 8601(2016-09-12T00:00:00)の形式。 しかし、そこに秒が必要ですか? そして、「:」を「%3A」にエンコードするか、「-」に置き換えるか、tkを尋ねます。 多くはまだURLコーディングなしでsuccess_urlを渡し、質問でサポートをノックしています。 ほとんどの場合、新しいパラメータも計算されたシグネチャに含める必要があります。



更新されたプロトコルは困難ですが、一括メール送信が可能です。 主な問題は、リンクの作成時に生成する必要がある一意のトランザクションIDです。 特定のアイテムを購入する大量郵送の場合、これは難しい場合があります。 ソリューションは、ストア内の購入IDとユーザーアカウントの組み合わせでもかまいませんが、ユーザーは何かを1回しか購入できなくなります。 この問題は、新しいパラメーターを作成し、一意性制約を削除することで解決できます。 確かに、これが市場で要求されているという疑問があります。 投票する



デザート用



新しいプロトコルは、パートナーを接続するための準備がすでに整っていますが、これまでのところ、サポートサービスを通じてのみ有効になっています。 テストに参加する場合は、 cms @ qiwi.ruに連絡するか、サポートにお問い合わせください。



ここで支払いページの現在の状態を評価できます 。 幸せなプログラマーの日!



PS私は、REST APIの実装に優れた経験を持つJava開発者をチームに参加させて、新しいishop.qiwi.comを立ち上げ、今年、数千のパートナーの質を向上させるため 招待します。



All Articles