web-dev-qa-db-ja.com

Magento支払いフロー

Magentoの新しい支払いモジュールの実装に取り​​組んでおり、このロジックの背後にあるコアコンセプトを理解したいと思っています。 Mage_Payment_Model_Method_Abstractまたはその子クラスのいずれかから拡張する必要があることは知っていますが、私の問題は、モデルでのキャプチャおよび認証メソッドの使用方法と使用方法です。たとえば、次のような手順でプロセス全体を分割した場合:

  1. ユーザーはショッピングカートにアクセスし、ゲートウェイである支払い方法を選択できます。
  2. システムは要求をインターセプトし、送信されたすべてのデータを収集して、ユーザーをゲートウェイURLに送信します。
  3. ユーザーがゲートウェイサイトで注文(またはキャンセル)し、ゲートウェイサイトからストアに関する情報が送信されます。
  4. 私のストアは、受信したデータを使用して注文をさらに変更し、完了またはキャンセル済みのステータスで注文を保存します。

これらの手順のどこで認証およびキャプチャメソッドを使用する必要がありますか?誰かが許可とキャプチャの意味を説明してくれれば幸いです。

69
zokibtmkd

これが私がいつもコンセプトを理解してきた方法と、Magentoで支払いモジュールを実装するために知っておくべきことです。特定の「これが発生する場所」への回答を以下に太字で示しますが、希望するほど単純ではありません。

プレインターネット、ブリック、モルタルのクレジットカードトランザクションは、2段階のプロセスでした。

販売時に、商人が購入のために消費者のクレジットカードを受け取ったとき、クレジットカードの中央オフィスに電話して「このネットワークに対してこのカードは承認されていますか」と尋ねる販売時点情報管理デバイスにスライドさせます。この特定の消費者の利用可能なクレジットの行は、この購入を可能にするのに十分な大きさです」。

購入が受け入れられた場合(拒否ではなく)、請求はauthorizedと言われました。消費者は製品を受け取り、POSシステム/キャッシュレジスタは取引が許可されたことに気付くでしょう。次に、1日の終わり、または週末、他の所定の定期スケジュール、または所有者が飲酒を停止することを決定した場合、商人はすべての承認された領収書を確認して送信します別のセントラルオフィスへのリクエストcaptureauthorizedからの資金トランザクション。資金を獲得することは、商人の口座にお金を入れるものです。

これは、まだほとんどのゲートウェイで使用されているモデルであり、Magento Inc.が支払いモジュールに実装することを選択したドメインモデルです。

消費者が最終チェックアウト手順に到達したとき Magentoのようなシステムでは、MagentoはゲートウェイのAPIに認証リクエストを発行します。トランザクションが成功すると、注文はシステムに受け入れられ、承認リクエストからの一意のIDが保存されます。次に、消費者の商品が出荷されると、店舗の所有者Magento管理者を使用して請求書を作成します。この請求書を作成すると、キャプチャ要求が発行されます(承認要求から返されたストアIDを使用)。 これは、これらのメソッド呼び出しがMagentoで発行される場所です

ただし、すべての支払いゲートウェイがこれらの概念を少し異なって解釈し、すべての商人が「出荷するまで捕獲しない」責任を異なって解釈するため、事態は複雑になります。上記のシナリオに加えて、支払いモジュールにはPayment Actionと呼ばれるシステム構成値があります。これは、Authorize Onlyに設定できます。これにより、上記のフローが実装されます。また、Authorize and Captureに設定することもできます。これは、注文が行われたときに支払いを承認および取得します。メソッドはAuthorize and Captureと呼ばれていますが、Magentoの現在のバージョンでは、このモード(少なくともAuthorize.netの場合)およびAuthorize.netに設定されている場合にのみキャプチャ要求を発行するため、さらに複雑になりますmore内部的には、キャプチャリクエストを1日のほとんどの間、承認されているがキャプチャされていない状態のままにします。 Magentoが注文、支払い、請求書を処理する方法は、コードベースの1つの領域であり、バージョンごとに大きく変化します。

そのため、Magento支払いモジュールシステムの背後にある考え方は、支払いゲートウェイロジックをプログラミングしているクラスターFからあなたを保護することです。 authorizeメソッドで、支払いゲートウェイの認証APIへの呼び出しを実装します(または、この時点で実行するチェックとロジックを実行します)。このメソッドには、支払いオブジェクトと金額が渡されます。ロジックを要求/実行し、何らかの理由で無効であると判断した場合、次の例外をスローします。

Mage::throwException('...');

これにより、Magentoに認証が失敗したことが通知され、それに応じて動作します(エラーメッセージなどを表示します)。それ以外の場合は、Paymentオブジェクトにデータメンバーを設定し、

return $this;

データメンバーは、後で支払いをキャプチャするときに必要になるものです。これで、Paymentモジュールのcaptureメソッドが表示されます。このメソッドには、支払いオブジェクトと金額も送信されます。この方法では、キャプチャリクエストを発行します。支払いオブジェクトにはcc_trans_idデータメンバー

$payment->getCcTransId()

これにより、ゲートウェイに対してキャプチャを発行できます。これは、authorizeに保存する責任があるデータメンバーの1つです。繰り返しますが、キャプチャが失敗したとコードが判断した場合、例外をスローします。それ以外の場合は、return $this

Authorize.net支払いモジュールには、これがどのように行われるかの良い例があります。

app/code/core/Mage/Paygate/Model/Authorizenet.php

たとえば、captureメソッドのこの部分を考えます

public function capture(Varien_Object $payment, $amount)
{
    if ($payment->getCcTransId()) {
        $payment->setAnetTransType(self::REQUEST_TYPE_PRIOR_AUTH_CAPTURE);
    } else {
        $payment->setAnetTransType(self::REQUEST_TYPE_AUTH_CAPTURE);
    }   

    $payment->setAmount($amount);
    $request= $this->_buildRequest($payment);
    $result = $this->_postRequest($request);
    //...

ここで、キャプチャメソッドは、支払いにcc_trans_id。結果に応じて、anet_trans_typeのいずれか:

self::REQUEST_TYPE_PRIOR_AUTH_CAPTURE
self::REQUEST_TYPE_AUTH_CAPTURE

この値は、API要求オブジェクトによって使用され、次のいずれかのAPI呼び出しを送信します。

  1. 事前承認されたトランザクションのキャプチャ
  2. 即時キャプチャ

それがお役に立てば幸いです!

148
Alan Storm