Порядок перенаправления платежей Magento - PullRequest
3 голосов
/ 08 февраля 2012

Есть ли какие-либо функции в расширении платежа magento, чтобы остановить создание заказа до возвращения статуса успеха из шлюза оплаты?

Расширение предназначено для перенаправления платежа (с getOrderPlaceRedirectUrl ) но на самом деле в правильном действии контроллера я делаю сообщение от действия с параметрами на шлюз и возвращаю успех, если все в порядке, и возвращаю сбой, если нет.

Но заказ уже создан, поэтому я должен отменить этот заказ, но он не должен создавать этот заказ в первую очередь.

Возможно, если я смогу создать его как шлюз, я смогу использоватькакой-то способ оплаты?

Я думал о validate или prepareSave методах, но оба они вызываются дважды - при принятии метода оплаты и при размещении заказа.

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

Но я действительно считаю, что в способах оплаты должно бытьбыть какой-то стандартной функциональностью, которую я могу использовать.

Ответы [ 3 ]

3 голосов
/ 08 февраля 2012

Это довольно распространенная проблема при разработке Платежного модуля.
Magento предлагает две возможности для классов методов оплаты для предоставления URL-адресов перенаправления, один до создания заказа, один после.

Если модель метода оплаты реализует getOrderPlaceRedirectUrl(), клиент будет перенаправлен после этапа подтверждения одностраничной проверки, будет создан объект заказа.

Если в модели метода оплаты реализован метод getCheckoutRedirectUrl(), клиент будет перенаправлен после этапа оплаты одностраничного оформления заказа, и объект заказа не создается.

Это не идеально, но именно это предлагает Magento из коробки.

0 голосов
/ 09 февраля 2012

Как я уже сказал - образец, который я использовал для этого решения в финале.

Я предпочел наблюдать за событием, чтобы сделать почтовый запрос. Действительно, если вы будете использовать метод, представленный здесь Вы получите тот же эффект, но я предпочитаю использовать наблюдателя событий. Итак:

Сначала добавьте некоторые данные в config.xml , чтобы создать наблюдатель событий в интерфейсе разделе

<events>
    <sales_model_service_quote_submit_before>
        <observers>
            <lacpaycs>
                <type>singleton</type>
                <class>OS_LacPayCS_Model_Observer</class>
                <method>lacpaycs_payment_send</method>
            </lacpaycs>
        </observers>
    </sales_model_service_quote_submit_before>
</events>

тогда мы должны создать класс Observer в OS / LacPayCS / Mode / Observer.php :

     class OS_LacPayCS_Model_Observer {

        protected $_code = 'lacpaycs';

        // Here some our additional functions

        /**
         * @param Varien_Object $observer
         */
        public function lacpaycs_payment_send(Varien_Object $observer)
        {
            /**
             * @var Mage_Sales_Model_Order $order
             * @var Mage_Sales_Model_Quote $quote
             */
            $order = $observer->getOrder();
            $quote = $observer->getQuote();
            $payment = $order->getPayment();
            if ($payment->getMethodInstance()->getCode() != $this->_code) {
                return;
            }

            $helper = Mage::helper('lacpaycs');
            try {

                // Here we prepare data and sending request to gateway, and getting response

                if (!$this->_validateResponse($response)) {
                    Mage::throwException('Error '.$this->errorMsg);
                }
            } catch (Exception $e) {
                Mage::throwException($e->getMessage());
            }
        }

    }

Итак, в двух словах, что мы здесь делаем $ _ код - это то же самое, что и в нашей модели платежей, и вместе с ней мы проверяем наблюдателя, поймали ли мы событие, когда клиент использует наш метод оплаты

Весь другой код прост, поэтому я думаю, что нет необходимости комментировать его

0 голосов
/ 08 февраля 2012

Как насчет расширения метода _validate () в Mage_Sales_Model_Service_Quote и выдачи там ошибки, чтобы он никогда не попадал в "$action-> save ();"бит.

public function submitOrder()
    {
        $this->_deleteNominalItems();
        // do some check here
        $this->_validate();
        // End checks
        $quote = $this->_quote;
        $isVirtual = $quote->isVirtual();

        ........

        try {
            $transaction->save();
            $this->_inactivateQuote();
            Mage::dispatchEvent('sales_model_service_quote_submit_success', array('order'=>$order, 'quote'=>$quote));
        } catch (Exception $e) {
            ...........
        }
        ...........
        return $order;
    }

Функция проверки выглядит следующим образом:

protected function _validate()
{
    $helper = Mage::helper('sales');
    if (!$this->getQuote()->isVirtual()) {
        $address = $this->getQuote()->getShippingAddress();
        $addressValidation = $address->validate();
        if ($addressValidation !== true) {
            Mage::throwException(
                $helper->__('Please check shipping address information. %s', implode(' ', $addressValidation))
            );
        }
        $method= $address->getShippingMethod();
        $rate  = $address->getShippingRateByCode($method);
        if (!$this->getQuote()->isVirtual() && (!$method || !$rate)) {
            Mage::throwException($helper->__('Please specify a shipping method.'));
        }
    }

    $addressValidation = $this->getQuote()->getBillingAddress()->validate();
    if ($addressValidation !== true) {
        Mage::throwException(
            $helper->__('Please check billing address information. %s', implode(' ', $addressValidation))
        );
    }

    if (!($this->getQuote()->getPayment()->getMethod())) {
        Mage::throwException($helper->__('Please select a valid payment method.'));
    }

    return $this;
}

Расширенная функция может выглядеть следующим образом:

    public function __construct(Mage_Sales_Model_Quote $quote)
    {
        $this->_quote = $quote;
        parent::__construct($quote);
    }

protected function _validate()
    {
        // Code to test comes here
        Mage::throwException(Mage::helper('payment')->__('unsuccessfull.....'));
        // Code ends, now call parent

        return parent::_validate();        

    }
...