Вот как я всегда понимал концепции и что вам нужно знать для реализации платежного модуля в Magento.Ответы на ваше конкретное «где это происходит» выделены жирным шрифтом ниже, хотя это не так просто, как вы ожидаете.
Предварительные интернет-транзакции, транзакции по обычным и обычным кредитным картам были двухэтапным процессом.
Во время продажи, когда продавец брал кредитную карту покупателя для покупки, он проводил ее через устройство торговой точки, которое звонило в центральный офис кредитной карты и спрашивало, «разрешена ли эта карта»для этой сети, и является ли доступная кредитная линия этого конкретного потребителя достаточно большой, чтобы позволить эту покупку ".
Если покупка была принята (а не отклонена), считается, что плата разрешена .Потребитель возьмет их товар, а система / касса торговой точки заметит, что сделка была авторизована.Затем, в конце дня или в конце недели, по какому-то другому заранее определенному регулярному графику, или когда владелец решил прекратить пить, торговец отправляется через все свои авторизованные квитанции и отправляет еще запрос в центральный офис захват средств от авторизованной транзакции.Захват средств - это то, что кладет деньги на счет продавца.
Эта модель по-прежнему используется большинством шлюзов и является моделью домена, которую Magento Inc. решила внедрить для своих платежных модулей.
Способ, которым все должно выполняться, когда потребитель достигает последних шагов проверки в такой системе, как Magento, Magento выдает запрос на авторизацию в API шлюза.Если транзакция прошла успешно, заказ принимается в систему, и уникальный идентификатор из запроса на авторизацию сохраняется.Затем, когда товары потребителя отправляются, владелец магазина использует администратора Magento для создания счета .Создание этого счета-фактуры выдает запрос захвата (с использованием идентификатора магазина, возвращенного из запроса авторизации). Именно здесь эти вызовы методов отправляются в Magento .
Однако все становится сложнее, потому что каждый платежный шлюз интерпретирует эти концепции немного по-своему, и каждый продавец интерпретирует их "не перехватывать домы отправили "обязанности по-другому.В дополнение к описанному выше сценарию модули оплаты имеют значение конфигурации системы, известное как Платежное действие .Это может быть установлено на Только авторизация , что будет реализовывать поток, описанный выше.Также можно установить значение Авторизовать и захватить , которое будет авторизовывать и фиксировать платеж при размещении заказа.Это даже на 1033 * больше сбивает с толку, потому что, хотя метод называется Authorize and Capture, текущие версии Magento будут выдавать запрос захвата только при установке в этом режиме (по крайней мере для Authorize.net), а Authorize.net будетвнутренне оставляйте запросы захвата в авторизованном, но не захваченном состоянии большую часть дня.То, как Magento обрабатывает заказы, платежи и счета-фактуры, является одной из областей кодовой базы, которая сильно меняется от версии к версии.
Таким образом, идея системы платежных модулей Magento состоит в том, чтобы оградить вас от Кластера F ---это программирование логики платежного шлюза.В вашем методе authorize
вы реализуете вызов к API авторизации вашего платежного шлюза (или выполняете любые проверки и логику, которые вы хотите выполнить в этот момент).При этом способе передается объект оплаты и суммаЕсли вы сделаете запрос / выполните вашу логику и определите, что она по какой-либо причине недействительна, вы выдаете исключение с
Mage::throwException('...');
. Это сообщает Magento, что авторизация не пройдена, и она будет действовать соответствующим образом (отобразить сообщение об ошибке., так далее.).В противном случае вы устанавливаете элементы данных в объекте платежа и выдает
return $this;
Элементы данных - это то, что вам понадобится позже при получении платежа. Что приводит нас к методу capture
вашего Платежного модуля. При этом методе также отправляется объект платежа и сумма. В этом методе вы отправляете запрос захвата. Объект платежа будет иметь cc_trans_id
элемент данных
$payment->getCcTransId()
, который позволит вам сделать захват против вашего шлюза. Это один из элементов данных, который вы несете ответственность за сохранение в 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);
//...
Здесь метод захвата проверяет, имеет ли платеж cc_trans_id
. В зависимости от результата, для anet_trans_type
устанавливается либо:
self::REQUEST_TYPE_PRIOR_AUTH_CAPTURE
self::REQUEST_TYPE_AUTH_CAPTURE
Это значение затем используется объектом запроса API для отправки вызова API для
- Получение предварительно авторизованной транзакции
- Немедленный захват
Надеюсь, что это помогает, и удачи!