Платежный поток Magento

Я работаю над внедрением нового платежного модуля для Magento и хочу понять основную концепцию этой логики. Я знаю, что мне нужно расширить Mage_Payment_Model_Method_Abstract или любой из его дочерних классов, но моя проблема в том, когда использовать и как использовать методы захвата и авторизации в моей модели. Например, если я разбил весь процесс так:

  • Пользователь приходит в корзину для покупок, и в нем говорится о способе оплаты, который является шлюзом.
  • Система перехватывает запрос, собирает все представленные данные и отправляет пользователя на URL-адрес шлюза.
  • Пользователь размещает свой заказ (или отменяет) на сайте шлюза, который отправляет информацию об этом в мой магазин.
  • Мой магазин делает несколько дополнительных изменений в порядке с полученными данными и сохраняет заказ со статусом, завершенным или отмененным.

Где на этих этапах мне придется использовать методы авторизации и захвата? Я был бы признателен, если бы кто-нибудь мог объяснить мне, что означает разрешение и захват?

Ответ 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 для

  • Захват предварительно авторизованной транзакции
  • Непосредственный захват

Надеюсь, что это поможет, и удачи!