【问题标题】:Magento Payment workflow and event order paidMagento 支付工作流程和事件订单已支付
【发布时间】:2013-07-09 09:39:39
【问题描述】:

对于我的一个 Magento 模块,我需要捕捉“任何订单都定义为已付款”事件。 所以我发现关联的事件是sales_order_payment_pay。 Ok 似乎完全符合我的需求。

我是 Magento 开发人员,而不是商家,目前,我从未将 Magento 实例上线并投入生产。所以支付工作流程对我来说很黑暗。我曾经在测试期间选择“支票/汇票”作为付款方式。

问题是:我需要捕捉这个事件(sales_order_payment_pay),但似乎我无法触发它,也永远不会进入我的观察者函数。 我目前有 2 种付款方式,支票/汇票和信用卡。 对于第一个,商家需要在后端验证付款,我红色的是他创建发票的那一刻。所以我尝试了它,但该事件从未被触发。 对于第二个,它更难:因为我处于开发模式,我不知道如何通过信用卡验证付款。我在网上找到了一个允许在 Magento 中进行测试的万事达卡号码,但在后端,支付的总金额仍然为零。所以在提交订单后,没有触发任何事件(看起来很合乎逻辑),当我创建发票时,仍然没有触发任何事件。

您能帮我多了解一下付款流程并了解任何已付款的订单吗?我找不到任何有关它的信息或文档。

PS : 我的模块的目的是捕捉事件下订单或支付的付款,并生成一个 XML 文件用于数据导出。第一个下订单的已经开发出来了。

【问题讨论】:

    标签: magento events workflow payment


    【解决方案1】:

    这个话题似乎有点棘手,所以我将分享我对支付方式和订单生命周期的看法。

    Alan Storm's vision

    首先,我邀请您观看最著名的 Magento 博主之一 Alan Storm 的主题。

    这是我认为它的工作原理:

    案例 1:通过在线支付(Paypal、信用卡等)订购,接受付款

    客户验证的订单 -> Magento 创建的订单 -> status pending_payment
    客户在线支付的订单 -> 付款服务验证的付款 -> 付款正常 -> Magento 创建的发票 -> 状态pending_payment(不确定这一点)。
    商家发货的订单-> Magento 创建的shippig 优惠券-> 状态完成

    案例 2:使用在线支付(Paypal、信用卡等)订购,付款被拒绝

    客户验证的订单 -> Magento 创建的订单 -> status pending_payment
    客户在线支付的订单 -> 支付服务拒绝支付 -> Magento 取消订单 -> 状态已取消

    案例 3:使用离线支付的订单(支票/汇票,销售优惠券等......)。发货前商家发票

    客户验证的订单 -> Magento 创建的订单 -> 待处理状态
    客户离线支付的订单 -> 商家收到的付款 -> 商家开具发票的订单 -> Magento 创建的发票 -> 状态处理
    商家发货的订单 -> Magento 创建的运费券 -> 状态完成

    案例 4:使用离线支付的订单(支票/汇票,销售优惠券等......)。商船开票前

    客户验证的订单 -> Magento 创建的订单 -> 待处理状态
    客户离线支付的订单 -> 商家发货的订单 -> Magento 创建的运费优惠券 -> 状态处理
    商家开票的订单 -> Magento 创建的发票 -> 状态处理

    希望这个话题对未来的人有所帮助。
    让我知道您之后是否需要更多信息。

    【讨论】:

      【解决方案2】:

      我使用如下:

      1 - app/code/loca/Packagename/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 - app/code/loca/Packagename/Modulename/Model/Rewrite/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
      

      【讨论】:

        猜你喜欢
        • 2010-11-14
        • 1970-01-01
        • 1970-01-01
        • 2015-05-24
        • 1970-01-01
        • 2014-07-08
        • 2013-01-21
        • 2015-01-19
        • 1970-01-01
        相关资源
        最近更新 更多