付款被拒绝后恢复 magento 报价
Restore magento quote after payment was refused
我正在创建一个执行以下操作的 magento 支付扩展程序:
当用户在商家网站上点击结账时,他会被重定向到一个网站(如 paypal),并在该网站上输入他的支付数据。如果付款方式失败,用户将被重定向到商家网站。
但是,报价似乎不再有效。
最终用户可以重复使用他的报价的可能性有哪些?
几种可能性是:
- 如果用户返回,则复制报价
- 检索报价并将其设置为活动状态,以便再次显示
这是我在支付模型中使用的一些代码:
将支付方式初始化为pending_payment
/**
* Instantiate state to pending_payment
* @param
* @param
*/
public function initialize($paymentAction, $stateObject)
{
$state = Mage_Sales_Model_Order::STATE_PENDING_PAYMENT;
$stateObject->setState($state);
$stateObject->setStatus(Mage_Sales_Model_Order::STATE_PENDING_PAYMENT);
$stateObject->setIsNotified(false);
}
重定向到付款方式(url 将重定向到远程主机)
/**
* Checkout redirect URL getter for onepage checkout
*
* @see Mage_Checkout_OnepageController::savePaymentAction()
* @see Mage_Sales_Model_Quote_Payment::getOrderPlaceRedirectUrl()
* @return string
*/
public function getOrderPlaceRedirectUrl()
{
return Mage::getUrl('pay/payment/redirect');
}
万一支付失败,用户会在 url /pay/payment/fail 回来(我已经知道如何为此创建一个控制器,我唯一的问题是重新激活报价) .
我找到了如何做到这一点(许多模块也这样做:Paypal、Authorizenet、Stripe)
您只需先取消该订单(使用 registerCancellation 方法),然后加载报价,将 setIsActive 设置为 1 并删除 ReservedOrderId 字段。
public function cancelAction()
{
$session = Mage::getSingleton('checkout/session');
if ($session->getLastRealOrderId())
{
$order = Mage::getModel('sales/order')->loadByIncrementId($session->getLastRealOrderId());
if ($order->getId())
{
//Cancel order
if ($order->getState() != Mage_Sales_Model_Order::STATE_CANCELED)
{
$order->registerCancellation("Canceled by Payment Provider")->save();
}
$quote = Mage::getModel('sales/quote')
->load($order->getQuoteId());
//Return quote
if ($quote->getId())
{
$quote->setIsActive(1)
->setReservedOrderId(NULL)
->save();
$session->replaceQuote($quote);
}
//Unset data
$session->unsLastRealOrderId();
}
}
return $this->getResponse()->setRedirect( Mage::getUrl('checkout/onepage'));
}
我正在创建一个执行以下操作的 magento 支付扩展程序:
当用户在商家网站上点击结账时,他会被重定向到一个网站(如 paypal),并在该网站上输入他的支付数据。如果付款方式失败,用户将被重定向到商家网站。
但是,报价似乎不再有效。
最终用户可以重复使用他的报价的可能性有哪些?
几种可能性是:
- 如果用户返回,则复制报价
- 检索报价并将其设置为活动状态,以便再次显示
这是我在支付模型中使用的一些代码:
将支付方式初始化为pending_payment
/**
* Instantiate state to pending_payment
* @param
* @param
*/
public function initialize($paymentAction, $stateObject)
{
$state = Mage_Sales_Model_Order::STATE_PENDING_PAYMENT;
$stateObject->setState($state);
$stateObject->setStatus(Mage_Sales_Model_Order::STATE_PENDING_PAYMENT);
$stateObject->setIsNotified(false);
}
重定向到付款方式(url 将重定向到远程主机)
/**
* Checkout redirect URL getter for onepage checkout
*
* @see Mage_Checkout_OnepageController::savePaymentAction()
* @see Mage_Sales_Model_Quote_Payment::getOrderPlaceRedirectUrl()
* @return string
*/
public function getOrderPlaceRedirectUrl()
{
return Mage::getUrl('pay/payment/redirect');
}
万一支付失败,用户会在 url /pay/payment/fail 回来(我已经知道如何为此创建一个控制器,我唯一的问题是重新激活报价) .
我找到了如何做到这一点(许多模块也这样做:Paypal、Authorizenet、Stripe)
您只需先取消该订单(使用 registerCancellation 方法),然后加载报价,将 setIsActive 设置为 1 并删除 ReservedOrderId 字段。
public function cancelAction()
{
$session = Mage::getSingleton('checkout/session');
if ($session->getLastRealOrderId())
{
$order = Mage::getModel('sales/order')->loadByIncrementId($session->getLastRealOrderId());
if ($order->getId())
{
//Cancel order
if ($order->getState() != Mage_Sales_Model_Order::STATE_CANCELED)
{
$order->registerCancellation("Canceled by Payment Provider")->save();
}
$quote = Mage::getModel('sales/quote')
->load($order->getQuoteId());
//Return quote
if ($quote->getId())
{
$quote->setIsActive(1)
->setReservedOrderId(NULL)
->save();
$session->replaceQuote($quote);
}
//Unset data
$session->unsLastRealOrderId();
}
}
return $this->getResponse()->setRedirect( Mage::getUrl('checkout/onepage'));
}