ここでは、私が常に概念を理解している方法と、Magento で支払いモジュールを実装するために知っておく必要があることを説明します。あなたが望んでいるほど単純ではありませんが、特定の「これはどこで起こりますか」に対する答えは以下に太字で示されています。
インターネット以前の従来型のクレジット カード取引は、2 段階のプロセスでした。
販売時に、商人が購入のために消費者のクレジット カードを受け取ると、クレジット カードの中央オフィスに電話をかけ、「このカードはこのネットワークで認証されているか、この特定の消費者の利用可能なクレジット枠は、この購入を許可するのに十分な大きさですか?」
購入が (拒否ではなく) 受け入れられた場合、請求は承認されたと言われます。消費者が製品を受け取ると、販売時点管理システム/キャッシュ レジスターは、取引が承認されたことを通知します。その後、一日の終わり、または週末、その他の所定の定期的なスケジュールで、または所有者が飲酒をやめることを決めたときに、商人はすべての承認された領収書を調べて、中央オフィスに別の要求を送信します。承認されたトランザクションから資金を取得します。資金を獲得すると、商人の口座にお金が入金されます。
これは、ほとんどのゲートウェイで現在も使用されているモデルであり、Magento Inc. が支払いモジュールの実装に選択したドメイン モデルです。
Magento のようなシステムで消費者が最終チェックアウト手順に到達すると、Magento はゲートウェイの API に認証要求を発行します。トランザクションが成功すると、注文がシステムに受け入れられ、承認リクエストからの一意の ID が保存されます。次に、消費者の商品が出荷されると、店主は Magento 管理者を使用して請求書を作成します。この請求書の作成により、キャプチャ リクエストが発行されます (承認リクエストから返されたストア ID を使用)。 これは、これらのメソッド呼び出しが Magento で発行される場所です。
ただし、すべての支払いゲートウェイがこれらの概念を少し異なる方法で解釈し、すべてのマーチャントが「発送するまでキャプチャしない」責任を異なる方法で解釈するため、注意が必要です. 上記のシナリオに加えて、支払いモジュールにはPayment Actionと呼ばれるシステム構成値があります。これは、上記のフローを実装するAuthorize Onlyに設定できます。また、オーソリとキャプチャーに設定することもできます。これは、注文時に支払いのオーソリとキャプチャーの両方を行います。それはさらに得ますメソッドは Authorize and Capture と呼ばれますが、現在のバージョンの Magento はこのモードに設定されている場合にのみキャプチャ リクエストを発行し (少なくとも Authorize.net の場合)、Authorize.net は内部的にキャプチャ リクエストを承認された状態のままにするため、混乱を招きます。一日のほとんどの状態をキャプチャしていません。Magento が注文、支払い、および請求書を処理する方法は、バージョンごとに大きく変わるコードベースの 1 つの領域です。
したがって、Magento 支払いモジュール システムの背後にあるアイデアは、支払いゲートウェイ ロジックをプログラミングしているクラスター F からユーザーを保護することです。メソッドで、支払いゲートウェイの承認 API への呼び出しを実装しますauthorize
(または、この時点で必要なチェックとロジックを実行します)。このメソッドには、支払いオブジェクトと金額が渡されます。ロジックをリクエスト/実行し、何らかの理由で無効であると判断した場合は、例外をスローします
Mage::throwException('...');
これにより、Magento に承認が失敗したことが通知され、それに応じて動作します (エラー メッセージを表示するなど)。それ以外の場合は、Payment オブジェクトにデータ メンバーを設定し、
return $this;
データ メンバーは、後で支払いを取得するときに必要になるものです。これによりcapture
、Payment モジュールのメソッドが表示されます。このメソッドには、支払いオブジェクトと金額も送信されます。このメソッドでは、キャプチャ リクエストを発行します。支払いオブジェクトにはcc_trans_id
データメンバーがあります
$payment->getCcTransId()
これにより、ゲートウェイに対してキャプチャを発行できます。これは、 に保存する責任があるデータ メンバーの 1 つですauthorize
。繰り返しになりますが、キャプチャが失敗したとコードが判断した場合は、例外をスローします。そうでなければ、あなた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);
//...
ここで、capture メソッドは、支払いにcc_trans_id
. 結果に応じて、次のanet_trans_type
いずれかに設定されます。
self::REQUEST_TYPE_PRIOR_AUTH_CAPTURE
self::REQUEST_TYPE_AUTH_CAPTURE
この値は、API 要求オブジェクトによって使用され、いずれかの API 呼び出しを送信します。
- 事前承認済みトランザクションのキャプチャ
- 即時キャプチャ
お役に立てば幸いです。幸運を祈ります。