Magento支付工作流程和事件订单支付

6ss1mwsb  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(212)

对于我的Magento模块之一,我需要捕捉事件“任何订单都被定义为支付”。所以我发现关联的事件是sales_order_payment_pay。Ok似乎完全符合我的需求。
我是一个Magento开发者,而不是一个商人,目前,我从来没有把一个Magento示例在线和生产。所以支付工作流程对我来说是相当黑暗的。我曾经选择“支票/汇票”作为支付方式在我的测试。
问题是:我得赶上这个活动(sales_order_payment_pay)但似乎我无法触发它,也从未进入我的观察者功能。我目前有2种支付方式,支票/汇票和信用卡。对于第一种,商家需要在后台验证付款,我认为这是他创建发票的时刻。所以我尝试了它,但从未触发事件。对于第二种,这是更困难的:因为我在开发模式,我不知道如何验证通过信用卡付款.我发现了一个万事达卡在线谁允许在Magento测试的号码,但在后端,总支付的ammund仍然等于零.所以提交订单后,没有事件触发(似乎很合乎逻辑),当我创建发票,仍然没有事件触发.
你能帮助我了解更多的支付过程,并赶上任何订单支付?我找不到任何有关它的信息或文件。
附言:我的模块的目的是捕捉事件下订单或付款支付,并生成一个XML文件的数据导出。第一个下订单已经开发。

yks3o0rb

yks3o0rb1#

这个主题似乎有点棘手,所以我将分享我对支付方式和订单生命周期的看法。
Alana Storm's vision
首先,我邀请你来看看这个主题由最著名的Magento博客之一,阿拉纳 Storm 。
以下是我认为它是如何工作的:
案例1:通过在线支付(Paypal,信用卡等)订购,接受付款
订单已由客户端验证->订单由Magento创建->状态待定_付款
订单由客户在线支付->付款服务验证付款->付款OK -> Magento创建的发票->状态待定_付款(不确定这一点)。
订单由商家发货->由Magento创建的shippig优惠券->状态完成
案例2:在线支付(Paypal,信用卡等),付款被拒绝
订单已由客户端验证->订单由Magento创建->状态待定_付款
订单由客户在线支付->付款服务拒绝付款->订单由Magento取消->状态取消
案例3:线下支付订单(支票/汇票、优惠券等)。商家发货前开具发票
订单已由客户端验证->订单由Magento创建->状态待定
订单由客户离线支付->由商家收到付款->由商家开具发票->由Magento创建发票->状态处理
订单由商家发货->由Magento创建的运输优惠券->状态完成
案例4:离线支付订单(支票/汇票,销售优惠券等)。商家在开具发票前发货
订单已由客户端验证->订单由Magento创建->状态待定
订单由客户离线支付->订单由商家发货->由Magento创建的运输优惠券->状态处理
由商家开具发票的订单->由Magento创建的发票->状态处理
希望这个主题能在将来帮助到别人。
如果你需要更多的信息就告诉我。

yc0p9oo0

yc0p9oo02#

我使用如下:

**1 -app/code/loca/Packagename/Modular/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/Packagement/Modulus/Model/Rewrite/Order.php

class Packagement_Modulus_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/Packagement/Modulus/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

相关问题