2013-07-11 125 views
4

對於我的一個Magento模塊,我需要捕捉事件「任何訂單被定義爲支付」。 所以我發現相關的事件是sales_order_payment_pay。好吧,似乎完全符合我的需求。Magento支付工作流程和事件訂單付款

我是Magento的開發人員,而不是商人,目前,我從未將Magento實例放入在線和生產環境中。所以付款流程對我來說是非常黑暗的。我在測試過程中選擇「支票/匯票訂單」作爲付款方式。

問題是:我需要趕上這個事件(sales_order_payment_pay),但似乎我無法觸發它,從來沒有進入我的觀察員功能。 我目前有2種付款方式,支票/匯票和信用卡。 對於第一個,商家需要在後端驗證付款,我發現它是創建發票的時刻。所以我試了一下,但事件從未觸發。 對於第二個,它更加困難:因爲我處於開發模式,我不知道如何驗證通過信用卡付款。我在網上找到了MasterCard的一個號碼,允許在Magento中進行測試,但在後臺,總付費彈性仍然等於零。所以訂單提交後,沒有事件觸發(似乎很合理),當我創建發票時,仍然沒有事件觸發。

您能否幫助我瞭解更多付款流程並獲得支付的訂單?我找不到任何有關它的信息或文檔。

PS:我的模塊的目的是捕獲事件的地方訂單或支付的付款,並生成一個用於數據導出的XML文件。第一個地方訂單已經開發。

回答

2

這個話題似乎有點棘手,所以我會分享我對付款方式和訂單生命週期的看法。所有的

Alan Storm's vision

首先,我邀請您最有名的Magento博客之一,艾倫風暴看到這個主題。

這裏是我怎麼想它的工作:

案例1:使用網上支付(貝寶,信用卡等)訂單,接受的付款方式

訂購客戶確認 - >訂單創建通過Magento - >狀態pending_payment
客戶訂單支付 - >付款驗證支付服務 - >支付確定 - >發票由Magento創建 - >狀態pending_payment(不知道這一點)。
訂單發貨的商家 - 通過Magento的創建> shippig優惠券 - >狀態的完整

案例2:使用網上支付(貝寶,信用卡等)訂購,付款拒絕

訂購確認客戶端 - >通過Magento的創建訂單 - >狀態pending_payment
訂購客戶在網上所許 - >付款支付服務拒絕 - >排序Magento的取消 - >狀態取消

案例3:與離線支付命令(檢查/匯票,銷售優惠券等)。通過客戶端驗證航運

單前,商戶發票 - >通過Magento的創建訂單 - >狀態掛起
訂購客戶離線所許 - >由商家收到付款 - >順序由商家開具發票 - >通過Magento的創建發票 - >狀態處理
訂單由Merchant發貨 - > Magento創建的發貨優惠券 - >狀態完成

案例4:訂購時帶有離線付款(支票/匯票,銷售優惠券等)。商船發票

訂購客戶驗證之前 - >通過Magento的創建訂單 - >狀態掛起
訂購客戶離線所許 - >訂單發貨的商家 - >通過Magento的創建航運優惠券 - >狀態處理
訂單由Merchant開具發票 - > Magento創建的發票 - >狀態處理

希望本主題能夠幫助未來的人。
讓我知道如果你需要更多的信息之後。

0

我爲使用如下:

1 -應用程序/代碼/軌跡/包/ MODULENAME的/ etc/config.xml中

<config> 
<global> 
    <models> 
     <sales> 
      <rewrite> 
       <order>Packagename_Modulename_Model_Rewrite_Order</order> 
      </rewrite> 
     </sales> 
     <sales_resource> 
      <rewrite> 
       <quote>Packagename_Modulename_Model_Rewrite_Resource_Sales_Quote</quote> 
      </rewrite> 
     </sales_resource> 
     <modelrewrite> 
      <class>Packagename_Modulename_Model_Rewrite</class> 
     </modelrewrite> 
    </models>   
    <events> 
     <packagename_modulename_order_status_change> 
      <observers> 
       <packagename_modulename_model_rewrite> 
        <type>singleton</type> 
        <class>modelrewrite/observer</class> 
        <method>changeStateOrder</method> 
       </packagename_modulename_model_rewrite> 
      </observers> 
     </packagename_modulename_order_status_change> 
    </events>   
    <resources> 
     <modulename_setup> 
      <setup> 
       <module>Packagename_Modulename</module> 
       <class>Mage_Sales_Model_Resource_Setup</class> 
      </setup> 
      <connection> 
      <use>core_setup</use> 
      </connection> 
     </modulename_setup> 
    </resources>   
</global> 
    <crontab> 
    <!-- here I am listing only major routines --> 
    <jobs>   
     <Packagename_Modulename_Model_Rewrite_SendOrderToERP> 
      <schedule> 
       <cron_expr>12 * * * *</cron_expr> 
      </schedule> 
      <run> 
       <model>modelrewrite/observer::runSendOrderToERP</model> 
      </run> 
     </Packagename_Modulename_Model_Rewrite_SendOrderToERP>    
     <Packagename_Modulename_Model_Rewrite_ReceiveERPStatusOrder> 
      <schedule> 
       <cron_expr>*/5 * * * *</cron_expr> 
      </schedule> 
      <run> 
       <model>modelrewrite/observer::runReceiveERPStatusOrder</model> 
      </run> 
     </Packagename_Modulename_Model_Rewrite_ReceiveERPStatusOrder>    
    </jobs>   
</crontab> 

2 -app/code/loca/Packagename/Modulename/Model/Rewrite/Order.php

類Packagename_Modulename_Model_Rewrite_Order延伸Mage_Sales_Model_Order {

public function _setState($state, $status = false, $comment = '', $isCustomerNotified = null, $shouldProtectState = false){ 
    // attempt to set the specified state 
    // tenta definir o status especificado 
    if ($shouldProtectState) { 
     if ($this->isStateProtected($state)) { 
      Mage::throwException(
       Mage::helper('sales')->__('The Order State "%s" must not be set manually.', $state) 
      ); 
     } 
    } 
    $this->setData('state', $state); 

    // add status history 
    if ($status) { 
     if ($status === true) { 
      $status = $this->getConfig()->getStateDefaultStatus($state); 
     } 
     $this->setStatus($status); 
     $history = $this->addStatusHistoryComment($comment, false); // no sense to set $status again 
     $history->setIsCustomerNotified($isCustomerNotified); // for backwards compatibility 
    } 

    Mage::dispatchEvent('packagename_modulename_order_status_change', array('order' => $this, 'state' => $state, 'status' => $status, 'comment' => $comment, 'isCustomerNotified' => $isCustomerNotified));    
    Mage::log("Packagename_Modulename_Model_Rewrite_Order Changing order to STATE ".$state." STATUS ".$status); 
    return $this; 
} 

}

3 -應用程序/代碼/軌跡/包/ MODULENAME /型號/重寫/ Observer.php

class Packagename_modulename_Model_Rewrite_Observer{ 

public function implementOrderStatus($event){ 
    $order = $event->getOrder(); 
    $state = $event->getState(); 
    $status = $event->getStatus(); 
    return $this; 
} 

public function changeStateOrder($observer){ 
    Mage::log('changeStateOrder'); 
    $order = $observer->getEvent()->getOrder();  

    if($order->getStatus() == "processing_paid"){ 
     $this->autoInvoicing($order); 
    } 
    else if($order->getStatus() == "processing_shipped"){ 
     $this->autoShipment($order); 
    } 

    // use your necessary ifs 
    $this->sendTransactionalEmail($order); 

    return $this; 
} 


public function autoShipment(Mage_Sales_Model_Order $order){ 
    //...  
} 

public function autoInvoicing(Mage_Sales_Model_Order $order){ 
    //...  
    //return $this; 
} 

public function sendTransactionalEmail(Mage_Sales_Model_Order $order){ 

    switch ($order->getStatus()) {    
     case "processing": 
      $templateId = 1;       
      break; 
     case "pending_payment": 
      $templateId = 0;       
      break;    
    //...      
     default: 
      $templateId = 0; 
      break; 
    }   

//... 
} 


public function runSendOrderToERP($schedule){ 
    //... 
} 


public function runReceiveERPStatusOrder($schedule){   
    //... 
} 

//And much more another methods can be used after change state/status order: refund, calcel, etc