付款被拒绝后恢复magento报价

时间:2015-05-15 13:25:35

标签: php magento

我正在创建一个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);
}

要重定向到付款方式(网址将重定向到远程主机)

/**
 * 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(我已经知道如何为此创建控制器,我唯一的问题是重新激活报价)。

1 个答案:

答案 0 :(得分:6)

我发现了如何做到这一点(许多模块也这样做: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'));
}