Magento付款重定向订单

Magento付款重定向订单,magento,payment-gateway,Magento,Payment Gateway,magento payment Extension中是否有任何功能可以在payment gateway返回成功状态之前停止创建订单 扩展被设计为一个支付重定向(使用getOrderPlaceRedirectUrl),但实际上在正确的控制器操作中,我使用params从操作发布到网关,如果都正常,则返回success,否则返回failure 但订单已经创建,因此我必须取消此订单,但它不应首先创建此订单 也许如果我可以把它设计成一个网关,我可以使用一些支付方式来实现这一点 我考虑过validate或p

magento payment Extension中是否有任何功能可以在payment gateway返回成功状态之前停止创建订单

扩展被设计为一个支付重定向(使用getOrderPlaceRedirectUrl),但实际上在正确的控制器操作中,我使用params从操作发布到网关,如果都正常,则返回success,否则返回failure

但订单已经创建,因此我必须取消此订单,但它不应首先创建此订单

也许如果我可以把它设计成一个网关,我可以使用一些支付方式来实现这一点

我考虑过validateprepareSave方法,但这两种方法都被称为两次-接受付款方法和现场订单方法

我还考虑了一些事件——也许我可以用一些事件来完成这个post操作,然后在失败时抛出异常


但我真的认为,在支付方法中,必须有一些标准功能,我可以使用。

如何扩展Mage_Sales_Model_Service_Quote上的_validate()方法,并在那里抛出一个错误,这样它就永远不会到达“$transaction->save();”位

验证函数如下所示:

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

    }
扩展函数可以如下所示:

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

    }

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

如果付款方式模型实现了
getOrderPlaceRedirectUrl()
在单页签出的确认步骤之后,客户将被重定向,订单实体将被创建

如果付款方式模型实现了
getCheckoutRedirectUrl()
方法,则在单页签出的付款步骤之后,客户将被重定向,并且没有创建订单实体


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

正如我所说的-给出了我在最终解决方案中使用的示例

我更喜欢观察事件来做post请求。真的吗,如果你使用这个方法 您将获得相同的效果,但我更喜欢使用事件观察者。因此:

首先将一些数据添加到config.xml中,以便在frontend部分中创建事件观察者

<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>
因此,简而言之,我们在这里所做的$\u code与我们的支付模型中所做的是相同的,我们使用它检查observer是否在客户使用我们的支付方法时捕捉到了事件


所有其他代码都很简单,因此我认为无需对其进行注释

如何扩展Mage_Sales_Model_Service_Quote上的_validate()方法,并在那里抛出一个错误,使其永远不会到达“$transaction->save();”位。这可能是个好主意。如果没有其他解决方案,我将尝试此方法。我想我会使用此解决方案,因为:1。我可以在发送请求之前验证qote,这样我就知道,若服务给出了成功,那个么也会创建订单。2.我不需要创建任何控制器和执行任何重定向。Thanx没问题,我们使用了相同的解决方案。我试着格式化一个合适的例子。实际上我不需要使用Submitor,我唯一需要的是扩展函数\u validate,但我会先做父验证,然后我会发送请求,如果出现错误,我会创建异常,然后返回$this顺便说一句,这是一个很好的解决方案,我会使用itHm-昨晚我的脑袋已经坏了-只需查看订单提交我想我可以在之前观察事件销售(模型)服务(报价)(提交)(服务(报价)((提交))()(显示以显示在何处调用验证函数。让我知道什么对您有效。在我测试时使用这两种变体,但使用观察事件更好,所以我使用了它。我将为observe eventThanx添加带有示例的新答案作为回复,但我认为,在没有重定向的情况下工作会更有用,因为我们在这里给出了答案。我将尝试使用事件销售\模型\服务\报价\提交\现在开始实施。稍晚一点,我会在这里得到我的最终解决方案。我同意没有重定向会更好。之所以提到这一点,是因为这就是Magento如何应对的。由于符合PCI-DSS,重定向非常常见。实现服务器端支付网关事务的正确位置应该在支付方法模型的
authorize()
capture()
方法中,而不是在滥用
getOrderPlaceRedirectUrl()
方法的操作控制器中。我知道,但我不需要授权和捕获方法。据我所知,这个方法在创建发票时调用,但在创建订单时不调用。还是我错了?您的请求只是某种形式的地址和客户验证,还是付款过程的一部分?也许我误解了你的问题。我相信你只想创建订单,如果付款是成功的。对吗?像这样的。在这里,我使用客户机数据向某个url发送请求并获得响应(我们可以说,这就像客户验证一样,因为如果哈希是好的,并且所有参数设置+url都是可访问的,我们将获得成功的结果)。然后,如果我们失败了,我们抛出异常。