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