Ответ 1
Вот так я всегда понимал концепции и то, что вам нужно знать, чтобы реализовать платежный модуль в Magento. Ответы на ваши конкретные "где это происходит" выделены полужирным шрифтом, хотя это не так просто, как вы надеетесь.
Предварительные интернет-транзакции, операции с кредитными картами и кирпичами были двухэтапным процессом.
Во время продажи, когда торговец взял потребительскую кредитную карту для покупки, они пропустили ее через пункт продажи устройства, который заходил бы в центральный офис кредитной карты и спрашивал: "Разрешена ли эта карточка для этого сети, и эта конкретная потребительская линия доступных кредитов достаточно велика, чтобы разрешить эту покупку".
Если покупка была принята (в отличие от отказа), обвинение было санкционировано. Потребитель возьмет свой продукт, а система продажи/кассовый банк отметит, что сделка была разрешена. Затем, в конце дня или в конце недели, в каком-то другом предопределенном регулярном расписании или когда владелец решил прекратить пить, купец пошел бы по всем своим санкционированным квитанциям и отправил другой запрос в центральный офис, чтобы захватить средства с санкционированной транзакции. Захват средств - это то, что вкладывает деньги в торговый счет.
Это все еще модель, используемая большинством шлюзов, и является моделью домена, которую Magento Inc. выбрала для реализации своих платежных модулей.
Способ, которым должны выполняться, - , когда потребитель достигает окончательных шагов проверки в системе Magento, Magento выдает запрос авторизации API-интерфейсу шлюза. Если транзакция успешна, заказ принимается в систему и сохраняется уникальный идентификатор из запроса авторизации. Затем, когда товарный товар отправляется, владелец магазина использует администратор Magento для создания счета-фактуры. При создании этого счета возникает запрос на захват (с использованием идентификатора магазина, возвращаемого из запроса авторизации). Здесь эти вызовы методов выдаются в Magento.
Однако все становится сложно, потому что каждый платежный шлюз интерпретирует эти понятия несколько иначе, и каждый торговец интерпретирует их "не захватывать, пока мы не отправили" обязанности по-разному. В дополнение к описанному выше сценарию модули оплаты имеют значение конфигурации системы, известное как Действие платежа. Это может быть настроено только на авторизацию, которая реализует описанный выше поток. Он также может быть установлен в "Авторизация" и "Захват", который будет разрешать и фиксировать платеж при размещении заказа. Он становится еще более более запутанным, потому что, хотя метод называется Authorize и Capture, текущие версии Magento будут выдавать запрос на захват только при установке в этом режиме (по крайней мере, для Authorize.net) и Authorize.net будет внутренне оставлять запросы на захват в авторизованном, но не захваченном состоянии большую часть дня. Как Magento обрабатывает заказы, а платежи и счета-фактуры - это одна область кодовой базы, которая сильно меняет версию с версии на версию.
Итак, идея системы платежных модулей Magento заключается в том, чтобы защитить вас от кластера F ---, который является программированием логики шлюза. В вашем методе authorize
вы выполняете вызов API авторизации вашего платежного шлюза (или выполняете все проверки и логику, которые вы хотите выполнить на данном этапе). Этот метод получает объект платежа и сумму. Если вы делаете запрос/выполняете свою логику и считаете ее недействительной по какой-либо причине, вы бросаете исключение с помощью
Mage::throwException('...');
Это говорит Magento, что авторизация не удалась, и она будет действовать соответственно (показать сообщение об ошибке и т.д.). В противном случае вы устанавливаете члены данных в объекте Payment и выдаете
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 для
- Захват предварительно авторизованной транзакции
- Непосредственный захват
Надеюсь, что это поможет, и удачи!