2012-02-07 104 views
2

在從支付網關返回成功狀態之前,是否有任何magento支付擴展功能停止創建訂單?Magento支付重定向訂單

擴展被設計成一個支付重定向(與getOrderPlaceRedirectUrl),但真正正確的控制器動作,我就從使用參數的動作後,到網關,如果一切OK返回成功,並返回失敗,如果不。

但是訂單已經創建好了,所以我必須取消這個訂單,但是它不應該首先創建這個訂單。

也許如果我可以將其設計爲網關,我可以使用一些付款方式來做到這一點?

我想到了驗證prepareSave方法,但他們都被稱爲兩次 - 在接受付款方式和地方秩序。

另外我想過事件 - 也許我可以使用一些事件來做這個事後的行動,並在失敗只是拋出異常?

但我真的認爲在付款方式中,我必須使用一些標準功能。

+1

怎麼樣有擴展_Validate()方法Mage_Sales_Model_Service_Quote,並拋出一個錯誤,使其永遠不會進入「$ transaction-> save();」位。 – ShaunOReilly 2012-02-08 01:48:57

+0

可能是個好主意。如果不提供其他解決方案,請嘗試此操作。 – Kudja 2012-02-08 03:00:28

+0

我想我會使用這個解決方案,因爲:1.我可以在發送我的請求之前驗證qote,所以我會知道如果服務提供成功順序也會被創建。 2.我不需要創建任何控制器並執行任何重定向。 Thanx – Kudja 2012-02-08 03:07:24

回答

0

如何擴展Mage_Sales_Model_Service_Quote上的_validate()方法,並在那裏拋出一個錯誤,以便它永遠不會進入「$ transaction-> save();」位。

public function submitOrder() 
    { 
     $this->_deleteNominalItems(); 
     // do some check here 
     $this->_validate(); 
     // End checks 
     $quote = $this->_quote; 
     $isVirtual = $quote->isVirtual(); 

     ........ 

     try { 
      $transaction->save(); 
      $this->_inactivateQuote(); 
      Mage::dispatchEvent('sales_model_service_quote_submit_success', array('order'=>$order, 'quote'=>$quote)); 
     } catch (Exception $e) { 
      ........... 
     } 
     ........... 
     return $order; 
    } 

驗證功能如下:

protected function _validate() 
{ 
    $helper = Mage::helper('sales'); 
    if (!$this->getQuote()->isVirtual()) { 
     $address = $this->getQuote()->getShippingAddress(); 
     $addressValidation = $address->validate(); 
     if ($addressValidation !== true) { 
      Mage::throwException(
       $helper->__('Please check shipping address information. %s', implode(' ', $addressValidation)) 
      ); 
     } 
     $method= $address->getShippingMethod(); 
     $rate = $address->getShippingRateByCode($method); 
     if (!$this->getQuote()->isVirtual() && (!$method || !$rate)) { 
      Mage::throwException($helper->__('Please specify a shipping method.')); 
     } 
    } 

    $addressValidation = $this->getQuote()->getBillingAddress()->validate(); 
    if ($addressValidation !== true) { 
     Mage::throwException(
      $helper->__('Please check billing address information. %s', implode(' ', $addressValidation)) 
     ); 
    } 

    if (!($this->getQuote()->getPayment()->getMethod())) { 
     Mage::throwException($helper->__('Please select a valid payment method.')); 
    } 

    return $this; 
} 

擴展功能可以是這樣的:

public function __construct(Mage_Sales_Model_Quote $quote) 
    { 
     $this->_quote = $quote; 
     parent::__construct($quote); 
    } 

protected function _validate() 
    { 
     // Code to test comes here 
     Mage::throwException(Mage::helper('payment')->__('unsuccessfull.....')); 
     // Code ends, now call parent 

     return parent::_validate();   

    } 
+0

真的我沒有必要使用submitOrder,唯一我需要的是擴展函數_validate,但我會拳頭做父驗證,然後我會發送請求,如果錯誤我會創建異常,然後返回$ this By這是很好的解決方案,我會用它 – Kudja 2012-02-08 10:18:14

+0

嗯 - 昨天晚上我的頭已經壞了 - 只看到訂單提交 – Kudja 2012-02-08 10:25:50

+0

我想我可以觀察事件sales_model_service_quote_submit_before - 所以我會試試這個,並在今天晚些時候回寫我的結果 – Kudja 2012-02-08 10:26:35

3

這是支付模塊開發過程中一個相當普遍的問題。
Magento爲支付方法類提供了兩個鉤子來提供重定向URL,一個在訂單創建之前,一個在之後。

如果付款方式模型實現getOrderPlaceRedirectUrl(),客戶將在單頁結帳的確認步驟後重定向,那麼訂單實體將被創建。

如果付款方法模式實現了getCheckoutRedirectUrl()方法,客戶將一個頁面結賬的支付步驟之後被重定向,並且沒有訂單實體創建。

這並不理想,但這就是Magento提供的開箱即用功能。

+0

Thanx的答覆,但我認爲這將是更有用的工作沒有重定向,因爲我們在[ShaunOReilly的]後(http://stackoverflow.com/a/9187654/ 1043742)在這裏回答。我會嘗試使用事件sales_model_service_quote_submit_before,現在開始實現這一點。稍後我會在這裏得到我的最終解決方案 – Kudja 2012-02-08 14:12:03

+0

我同意沒有重定向就更好。只是提到了這個,因爲這是Magento如何構建的。由於符合PCI-DSS標準,重定向非常普遍。實現服務器端支付網關事務的正確位置應該在付款方法模型的'authorize()'和'capture()'方法中,而不是濫用'getOrderPlaceRedirectUrl()'方法的動作控制器。 – Vinai 2012-02-08 14:20:30

+0

我知道,但授權和捕獲方法不是我所需要的。據我所知 - 創建發票時調用此方法,而不是在創建訂單時調用。或者我是我錯了? – Kudja 2012-02-08 22:39:04

0

正如我所說 - 給最終使用這個解決方案的樣本。

我最喜歡觀察事件來做post請求。真的,如果你使用方法here 你會採取相同的效果,但我更喜歡使用事件觀察者。所以:

首先添加一些數據到配置。

class OS_LacPayCS_Model_Observer { 

protected $_code = 'lacpaycs'; 

// Here some our additional functions 

/** 
* @param Varien_Object $observer 
*/ 
public function lacpaycs_payment_send(Varien_Object $observer) 
{ 
    /** 
    * @var Mage_Sales_Model_Order $order 
    * @var Mage_Sales_Model_Quote $quote 
    */ 
    $order = $observer->getOrder(); 
    $quote = $observer->getQuote(); 
    $payment = $order->getPayment(); 
    if ($payment->getMethodInstance()->getCode() != $this->_code) { 
     return; 
    } 

    $helper = Mage::helper('lacpaycs'); 
    try { 

     // Here we prepare data and sending request to gateway, and getting response 

     if (!$this->_validateResponse($response)) { 
      Mage::throwException('Error '.$this->errorMsg); 
     } 
    } catch (Exception $e) { 
     Mage::throwException($e->getMessage()); 
    } 
} 

}

所以:XML前端部分

<events> 
    <sales_model_service_quote_submit_before> 
     <observers> 
      <lacpaycs> 
       <type>singleton</type> 
       <class>OS_LacPayCS_Model_Observer</class> 
       <method>lacpaycs_payment_send</method> 
      </lacpaycs> 
     </observers> 
    </sales_model_service_quote_submit_before> 
</events> 

那麼我們必須在OS/LacPayCS /模式/ Observer.php創建觀察類中創建事件觀察用兩個詞我們在這裏做什麼$ _code是在我們的支付模型和它一樣,我們檢查觀察員,如果w Ë逮住使用我們的付款方式,當客戶活動

所有其他代碼很簡單,所以我認爲這是沒有必要評論它

相關問題