Magento付款重定向订单

时间:2012-02-07 22:41:38

标签: magento payment-gateway

magento支付延期中是否有任何功能可以在退回支付网关的成功状态之前停止创建订单?

扩展程序设计为付款重定向(使用 getOrderPlaceRedirectUrl ),但实际上在正确的控制器操作中,我会使用params的操作发布到网关并返回成功,如果一切正常,并且如果不是则返回失败。

但订单已经创建,所以我必须取消此订单,但它不应该首先创建此订单。

也许如果我可以将其设计为网关,我可以使用一些付款方式来执行此操作吗?

我考虑了验证 prepareSave 方法,但两种方法都被调用了两次 - 接受付款方式和下订单。

我也考虑了一些事件 - 也许我可以使用一些事件来做这个后期动作而且在失败时只是抛出异常?

但我真的认为在付款方式中,我必须使用一些标准功能。

3 个答案:

答案 0 :(得分:3)

在付款模块开发过程中,这是一个非常常见的问题 Magento为付款方法类提供了两个钩子,用于提供重定向URL,一个在创建订单之前,一个在之后。

如果付款方式模型实施getOrderPlaceRedirectUrl(),则客户将在单页结帐的确认步骤后重定向,将创建订单实体。

如果付款方式模型实施getCheckoutRedirectUrl()方法,则客户将在单页结帐的付款步骤后重定向,并且无订单实体已创建。

这并不理想,但这就是Magento提供的开箱即用。

答案 1 :(得分:0)

如何在Mage_Sales_Model_Service_Quote上扩展_validate()方法,并在那里抛出一个错误,以便它永远不会到达“$ transaction-> 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();        

    }

答案 2 :(得分:0)

正如我所说的那样 - 在最后给出我用于此解决方案的样本。

我更喜欢观察事件来发布请求。真的,如果你将使用提出的方法here 你会采取同样的效果,但我更喜欢使用事件观察者。所以:

首先将一些数据添加到 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>

然后我们必须在 OS / LacPayCS / Mode / Observer.php 中创建Observer类:

     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());
            }
        }

    }

所以我们在这里做的两个词 $ _ code 与我们的付款模式相同,如果我们在客户使用我们的付款方式时收到了活动,我们会检查观察员

所有其他代码都很简单,所以我认为没有必要对其进行评论