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

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

69 голосов
/ 20 марта 2011

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

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

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

1 Ответ

148 голосов
/ 20 марта 2011

Вот как я всегда понимал концепции и что вам нужно знать для реализации платежного модуля в 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 для

  1. Получение предварительно авторизованной транзакции
  2. Немедленный захват

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

...