【发布时间】:2011-06-28 09:27:35
【问题描述】:
我创建了新的自定义产品类型,它在 magento 中扩展了虚拟产品。现在我想阻止在线支付的自动发票,例如。订单包含至少一种自定义产品类型时的贝宝。所有此类产品的订单都必须手动开具发票。我应该如何解决这个问题?
【问题讨论】:
-
只适用于paypal,还是其他支付方式?发票由付款方式而非产品类型控制。
标签: php magento paypal e-commerce invoice
我创建了新的自定义产品类型,它在 magento 中扩展了虚拟产品。现在我想阻止在线支付的自动发票,例如。订单包含至少一种自定义产品类型时的贝宝。所有此类产品的订单都必须手动开具发票。我应该如何解决这个问题?
【问题讨论】:
标签: php magento paypal e-commerce invoice
解决此问题的最佳方法是将观察者注册到在付款捕获过程中引发的事件,但不幸的是,我没有看到太多相关的事件。您可以尝试sales_order_invoice_save_before 拦截 save(),但我不喜欢这样做,因为它可能会使控制器混淆发票保存失败的原因。
查看 Paypal 代码,您会在 Mage_Paypal_Model_Ipn::_processOrder() 中看到它在成功时调用 $this->_registerPaymentCapture(),而后者又调用 $payment->registerCaptureNotification()。
Mage_Sales_Model_Order_Payment::registerCaptureNotification($amount) 如果新发票尚不存在并且付款是订单的全部金额,则创建新发票。它使用_isCaptureFinal($amount) 方法来验证这一点。
一种选择是扩展Mage_Sales_Model_Order_Payment 并使用以下代码覆盖_isCaptureFinal($amount):
foreach($this->getOrder()->getAllItems() as $oOrderItem){
if($oOrderItem()->getProduct()->getTypeId() == 'your_custom_product_type'){
return false;
}
}
return parent::_isCaptureFinal($amountToCapture);
别忘了最后一次打电话给父母!!
您可以在自定义模块中完成所有这些操作(如果需要,请以 ModuleCreator 开头),并将以下内容插入到 config.xml 中
<global>
<models>
<modulename>
<class>Namespace_Modulename_Model</class>
</modulename>
<sales>
<rewrite>
<order_payment>Namespace_Modulename_Model_Order_Payment</order_payment>
</rewrite>
</sales>
</models>
标准免责声明适用,您在这里搞乱了资金交易,因此请确保您真正地彻底测试它。
请注意,这种方法将适用于所有调用 Mage_Sales_Model_Order_Payment::registerCaptureNotification($amount) 的付款方式,而不仅仅是 Paypal。
祝你好运,
京东
【讨论】: