在自定义付款方式的捕获方法中将订单标记为待处理

时间:2014-02-15 08:04:45

标签: magento payment-gateway

我正在使用magento基于API的支付网关,当用户直接从信用卡支付时,我通过在支付网关的捕获方法中调用api特定功能来完成我的所有过程。

当我为支付网关启用3D安全选项时,我需要将用户重定向到第三方进行验证,以确保我使用getOrderPlaceRedirectUrl条件。

使用条件我也可以保存具有待处理状态的订单,但Magento会生成发票并标记为已付款并将状态更改为处理状态。一旦从3rdparty获得成功的身份验证,我需要做的事情。

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

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

如果有人可以帮助我如何控制不在捕获方法中生成发票将非常感激。

2 个答案:

答案 0 :(得分:1)

如果你在付款方式中使用了capture(),并且你的capture()方法在没有抛出异常的情况下返回,那么Magento会认为捕获已经完成,“钱就在你口袋里”,所以它就是发票。如果您使用第三方支付网关,这并不好。

您可以执行以下操作:在 config.xml

中将您的* payment_action *设置为 order
<config>     
    <default>
        <payment>
            <yourPaymentCode>
                <order_status>pending_payment</order_status>
                <payment_action>order</payment_action>
                ...

在您的付款方式中设置属性并实施order()方法。 设置 getOrderPlaceRedirectUrl ,但你已经这样做了。

class Your_Module_Model_PaymentMethod 
    extends Mage_Payment_Model_Method_Abstract
{
    // set these attributes
    protected $_code = 'yourPaymentCode';
    protected $_isGateway = true;
    protected $_canCapture = false;
    protected $_canAuthorize = false;
    protected $_canOrder = true;

    public function order(Varien_Object $payment, $amount)
    {
        // initialize your gateway transaction as needed
        // $gateway is just an imaginary example of course
        $gateway->init( $amount, 
            $payment->getOrder()->getId(), 
            $returnUrl,
            ...);
        if($gateway->isSuccess()) {
            // save transaction id
            $payment->setTransactionId($gateway->getTransactionId());
        } else {
            // this message will be shown to the customer
            Mage::throwException($gateway->getErrorMessage());
        }
        return $this;
    }

不知何故,网关必须做出回应。在我的情况下,他们将客户重定向到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');
    }
}

答案 1 :(得分:0)

尝试将状态设置为待付款,如下所示;

$order->setState(Mage_Sales_Model_Order::STATE_PENDING_PAYMENT, 
    'pending_payment', 
    '3D Secure Auth Now Taking Place')->save();

P.S。 Magento附带的PayPal模块完全符合您的要求,因此请查看PayPal Standard模型和控制器以获取一些指示。