Magento 在自定义付款方式的捕获方式中将订单标记为挂起

Magento 在自定义付款方式的捕获方式中将订单标记为挂起,magento,payment-gateway,Magento,Payment Gateway,我正在magento开发基于API的支付网关,当用户直接从信用卡支付时,我通过调用支付网关捕获方法中的API特定函数来完成我的全部过程 当我为支付网关启用3D安全选项时,我需要将用户重定向到第三方,以验证我是否使用了带条件的getOrderPlaceRedirectUrl 在条件I中,ma还保存状态为“待定”的订单,但Magento生成发票并标记为“已付款”,并将状态更改为“正在处理”。一旦从第三方获得成功的身份验证,我就需要这样做 用于使用以下代码更新订单状态: $order->setS

我正在magento开发基于API的支付网关,当用户直接从信用卡支付时,我通过调用支付网关捕获方法中的API特定函数来完成我的全部过程

当我为支付网关启用3D安全选项时,我需要将用户重定向到第三方,以验证我是否使用了带条件的
getOrderPlaceRedirectUrl

在条件I中,ma还保存状态为“待定”的订单,但Magento生成发票并标记为“已付款”,并将状态更改为“正在处理”。一旦从第三方获得成功的身份验证,我就需要这样做

用于使用以下代码更新订单状态:

$order->setState( Mage_Sales_Model_Order::STATE_NEW, true );
$order->save();

如果有人能帮助我如何控制不在capture方法中生成发票,我将不胜感激。

尝试将状态设置为pending payment,如下所示

$order->setState(Mage_Sales_Model_Order::STATE_PENDING_PAYMENT, 
    'pending_payment', 
    '3D Secure Auth Now Taking Place')->save();
另外,Magento附带的PayPal模块正是您想要做的,因此请查看PayPal标准模型和控制器,以获取一些指针。

如果您在支付方法中使用capture(),并且capture()方法返回时不引发异常,则Magento假定捕获已完成,“钱在你的口袋里”,所以它就可以开具发票。如果你使用第三方支付网关,这是不好的

您可以执行以下操作:在config.xml中将*payment\u action*设置为order

<config>     
    <default>
        <payment>
            <yourPaymentCode>
                <order_status>pending_payment</order_status>
                <payment_action>order</payment_action>
                ...
在我的例子中,他们将客户重定向到init()中给出的$responseUrl,但他们警告说,用户的浏览器可能在付款后但在重定向到我们的商店之前崩溃:在这种情况下,他们在后台调用URL,因此处理该URL不能依赖于会话数据。我为此制作了一个控制器:

public function gatewayResponseAction()
{
    // again the imaginary example $gateway
    $order = Mage::getModel('sales/order')->load( $gateway->getOrderId() );
    $payment = $order->getPayment();
    $transaction = $payment->getTransaction( $gateway->getTransactionId() );

    if ($gateway->isSuccess())
    {
        $payment->registerCaptureNotification( $gateway->getAmount() );
        $payment->save();
        $order->save();
        $this->_redirect('checkout/onepage/success');
    }
    else
    {
        Mage::getSingleton('core/session')
            ->addError($gateway->getErrorMessage() );
        // set quote active again, and cancel order 
        // so the user can make a new order
        $quote = Mage::getModel('sales/quote')->load( $order->getQuoteId() );
        $quote->setIsActive( true )->save();
        $order->cancel()->save();
        $this->_redirect('checkout/onepage');
    }
}
public function gatewayResponseAction()
{
    // again the imaginary example $gateway
    $order = Mage::getModel('sales/order')->load( $gateway->getOrderId() );
    $payment = $order->getPayment();
    $transaction = $payment->getTransaction( $gateway->getTransactionId() );

    if ($gateway->isSuccess())
    {
        $payment->registerCaptureNotification( $gateway->getAmount() );
        $payment->save();
        $order->save();
        $this->_redirect('checkout/onepage/success');
    }
    else
    {
        Mage::getSingleton('core/session')
            ->addError($gateway->getErrorMessage() );
        // set quote active again, and cancel order 
        // so the user can make a new order
        $quote = Mage::getModel('sales/quote')->load( $order->getQuoteId() );
        $quote->setIsActive( true )->save();
        $order->cancel()->save();
        $this->_redirect('checkout/onepage');
    }
}