对于我的一个Magento模块,我需要捕获“任何订单被定义为付费”的事件。 所以我发现相关的事件是sales_order_payment_pay。好的,似乎完全符合我的需要。
我是Magento开发者,而不是商家,目前,我从未将Magento实例放在网上和生产中。所以支付工作流程对我来说非常黑暗。我曾经在测试期间选择“支票/汇票”作为付款方式。
问题是:我需要捕获此事件(sales_order_payment_pay),但似乎我无法触发它并且永远不会进入我的观察者功能。 我目前有2种付款方式,支票/汇票和信用卡。 对于第一个,商家需要在后端验证付款,而我是红色的,这是他创建发票的时刻。所以我尝试了但事件从未被触发过。 对于第二个,它更难:因为我处于开发模式,我不知道如何通过信用卡验证付款。我在万事达卡上找到了一个允许在Magento进行测试的号码,但是在后端,付费总额仍然等于零。因此,在提交订单后,没有触发任何事件(似乎非常符合逻辑),当我创建发票时,仍然没有触发任何事件。
您能帮助我更多地了解付款流程并了解付款订单吗?我找不到任何关于它的信息或文件。
PS:我的模块的目的是捕获事件地点订单或支付的付款,并生成用于数据导出的XML文件。第一个有下订单的人已经开发出来。
答案 0 :(得分:2)
这个主题看起来有点棘手,所以我将分享我对付款方式和订单生命周期的看法。
首先,我邀请您通过最着名的Magento博主之一Alan Storm看到这个主题。
以下是我认为它的工作方式:
案例1:通过在线支付订单(Paypal,信用卡等),接受付款
客户验证的订单 - >由Magento创建的订单 - > status pending_payment
客户在线支付的订单 - >付款服务验证的付款 - >付款好 - >由Magento创建的发票 - > status pending_payment(不确定这一点)。
商家发货的订单 - >由Magento创建的shippig优惠券 - >状态完成
案例2:通过在线支付订单(Paypal,信用卡等),拒绝付款
客户验证的订单 - >由Magento创建的订单 - > status pending_payment
客户在线支付的订单 - >付款服务拒绝付款 - > Magento取消订单 - >状态已取消
案例3:使用离线付款订单(支票/汇票,卖票等)。发货前商家发票
客户验证的订单 - >由Magento创建的订单 - >待定状态
客户离线付款的订单 - >商家收到的付款 - >商家开具发票 - >由Magento创建的发票 - >状态处理
商家发货的订单 - >由Magento创建的运费优惠券 - >状态完成
案例4:使用离线付款订单(支票/汇票,销售优惠券等)。商船在开发票之前
客户验证的订单 - >由Magento创建的订单 - >待定状态
客户离线付款的订单 - >商家发货的订单 - >由Magento创建的运费优惠券 - >状态处理
商家开具发票的订单 - >由Magento创建的发票 - >状态处理
希望这个话题对未来的人有所帮助 如果您在此之后需要更多信息,请告诉我。
答案 1 :(得分:0)
我使用如下:
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
class 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