Magento 预付款
Posted
技术标签:
【中文标题】Magento 预付款【英文标题】:Magento upfront payment 【发布时间】:2011-09-16 10:58:59 【问题描述】:对于未来的项目,我们被分配创建一个简单的概念(在 Magento 内部),它必须执行以下操作:
客户可以选择不同的运输方式,其中一种是“Ship2Shop”,它将产品发送到选择的实体店,客户必须去取货。 当客户选择这种“ship2shop”运输方式时,总金额的一定百分比(例如:25%)必须在线支付(通过预定义的支付方式),剩余的 75% 必须以实物支付顾客去取他订购的产品时商店。
你会怎么做?
我们的想法是修改结帐/订单会话并修改“总计”金额(将原始值保存在会话中)。当客户然后被发送到外部支付处理器时,“修改的总计”被发送。一旦客户在 magento 平台上返回,我们将通过恢复原始总计并更新已支付总额和应付总额来修改订单。
有人对此有任何其他想法吗?
编辑: 在下面的 Anton S 反馈后,我设法添加了“预付款总额”。但是我仍然有问题 在 config.xml 中,我在标签中添加了以下内容:
acsystems_advancepayment/total_custom 累计
我希望我的预付款显示在总计之后,由于某种原因,magento 不会这样做...
EDIT2:收集方法
public function collect(Mage_Sales_Model_Quote_Address $address)
parent::collect($address);
$quote = $address->getQuote();
$advancePaymentAmount = 0;
$baseAdvancePaymentAmount = 0;
$items = $address->getAllItems();
if (!count($items))
$address->setAdvancePaymentAmount($advancePaymentAmount);
$address->setBaseAdvancePaymentAmount($baseAdvancePaymentAmount);
return $this;
$address->setBaseAdvancePayment($address->getGrandTotal()*(0.25));
$address->setAdvancePayment($address->getGrandTotal()*(0.25));
$address->setAdvancePaymentAmount($address->getGrandTotal()*(0.25));
$address->setBaseAdvancePaymentAmount($address->getGrandTotal()*(0.25));
$address->setGrandTotal($address->getGrandTotal() - $address->getAdvancePaymentAmount());
$address->setBaseGrandTotal($address->getBaseGrandTotal()-$address->getBaseAdvancePaymentAmount());
return $this;
【问题讨论】:
那么这是做什么的 $address->setAdvancePayment($calculatedAmount); ? 如果我不设置它,那么我的“预付款”行不会显示在结帐时的购物车概览/评论中。 (我猜和 ->setData("advance_payment") 一样 好的,您的问题是,如果连续多次调用 baseAmount 和 amount 在您的收集过程中不会被清除,这就是 paretn::collect($address);在你的方法的顶部做。但是,您必须确保您的计算金额始终从 0 开始计算 我已经更新了 collect 方法,它现在似乎可以工作了,非常感谢! ;) 您在该方法中看到任何您不同意的奇怪事物,或者以后可能会出现问题? (再次感谢大家的帮助) 我会在我的回答中编辑这个,不要弄乱你对象中的其他总数,因为他们不知道你的对象 【参考方案1】:请参阅此线程,其中解释了添加总对象Magento: adding duties/taxes to a quote during review
基本上,您应该根据您选择的运输方式添加自己的总计对象,然后它也将显示在总计中作为单独的行,您可以在每封电子邮件或显示总计的地方显示它
public function collect(Mage_Sales_Model_Quote_Address $address)
//this is for the loop that you are in when totals are collected
parent::collect($address);
$quote = $address->getQuote();
//variables for your own object context
$advancePaymentAmount = 0;
$baseAdvancePaymentAmount = 0;
$items = $address->getAllItems();
if (!count($items))
$address->setAdvancePaymentAmount($advancePaymentAmount);
$address->setBaseAdvancePaymentAmount($baseAdvancePaymentAmount);
return $this;
//calculated based on other total object and don't edit other totals inside your own as your calculations would be always false and so would be next total object in the cycle and so on
$baseAdvancePaymentAmount = $address->getBaseGrandTotal()*(0.25);
$advancePaymentAmount = $address->getQuote()->getStore()->convertPrice($baseAdvancePaymentAmount, false);
//this is just for your own object context
$address->setBaseAdvancePaymentAmount($baseAdvancePaymentAmount);
$address->setAdvancePaymentAmount($advancePaymentAmount);
/*
* this is for the loop that you are in when totals are collected and
* those are set to 0 for each totals collecting cycle
*/
$this->_setBaseAmount($baseAdvancePaymentAmount);
$this->_setAmount($advancePaymentAmount);
return $this;
【讨论】:
谢谢,如果这确实是我们正在寻找的解决方案,将查看并标记为答案,提前致谢! 我成功地将“预付款”总额添加到 quote_address、订单和发票。还有一些事情困扰着我,我会向您发送消息;) [编辑:似乎无法向您发送消息:D] 请参阅问题帖子以获取更多信息。 每个总计对象都有您可以在 system.xml 中应用的顺序,并且总计有点硬编码为行中的最后一个,请参阅此条件的总计块 我遇到的另一个问题:collect 似乎每次都会添加两次自定义金额...例如,如果我将 $calculatedAmount 设置为 10,它将始终显示为 20... 您必须显示您的收集方法代码,请在您的问题中这样做【参考方案2】:另一种选择是更改支付模块中的“grand_total”,这样会话就不会改变..
【讨论】:
我们也想过这个问题,但是当客户被转介给外部支付处理器(例如总计100美元)并且他在付款后返回Magento平台时,它会验证是否支付了金额等于客户会话中保存的总计(按顺序)。 这很讨厌,如果你需要实现它,那么实现你自己的总对象,因为改变其他总和会很快破坏计算以上是关于Magento 预付款的主要内容,如果未能解决你的问题,请参考以下文章