Magento交易错误“请指定送货方式”

时间:2012-04-30 19:42:24

标签: magento magento-1.5

我们使用名为“Firecheckout”的模板大师的自定义结帐扩展程序。不确定这是否相关,但我想应该提一下。偶尔我会看到一封交易失败的电子邮件,原因是“请指定送货方式”。我花了很长时间试图追踪这是如何发生的,我迷失了。我已经尝试了一切我能想到的复制问题。取决于我所做的事情的组合(添加/删除购物车中的商品,添加/删除更改运送选项的优惠券代码,在移动和桌面网站之间切换等)我已经能够使其结帐页面没有没有为运输方式选择一个选项。但是,如果我尝试提交订单,我会在发货方法部分中显示“请指定送货方式”的直接红色消息(请注意电子邮件中的内容与页面上显示的错误中的内容之间的区别......缺少“a”)。这不会导致错误电子邮件。

通过搜索代码,我发现错误电子邮件是在 _validate 方法中的 TM_FireCheckout_Model_Service_Quote (扩展 Mage_Sales_Model_Service_Quote )类中触发的p>

$method= $address->getShippingMethod();
$rate  = $address->getShippingRateByCode($method);
if (!$this->getQuote()->isVirtual() && (!$method || !$rate)) {
    Mage::throwException($helper->__('Please specify a shipping method.'));
}

在这种情况下,我猜 $ method $ rate 为null或false,但为什么/怎么可能呢?有什么我可以做的,以确保永远不会发生这种情况? FireCheckout的 _validate 方法与父类的 _validate 方法之间的唯一区别在于哪些字段被认为是必需的。它不会以任何方式更改地址对象,因此后续对 getShippingMethod getShippingRateByCode 的调用应与默认安装相同。

如有必要,我可以提供其他详细信息。我基本上试图了解可能触发该错误的内容以及如何重现它,以便我最终可以修补导致该错误的漏洞。

谢谢!

2 个答案:

答案 0 :(得分:0)

之前我遇到过类似的事情,但Firecheckout没有。但它也是来自Apptha的Onestepcheckout扩展,如@Lennon。长话短说,这是javascript处理中的差异,破坏了数据。我没有确切的答案,但我建议您查看表单验证和结帐表单上的数据保存之间发生的情况。

你可以做些什么来开始调查是在FF上启动Firebug,观察控制台并查看你的数据是否仍然传播。您还可以创建一个简单的观察者模块,以便在controler_action_predispatch事件中执行以下操作:

$request = $observer->getControllerAction()->getRequest();
Mage::log(var_export($request->getParams(),true));

..或者直接编辑结帐路线中的控制器文件。无论什么漂浮你的船。

启用日志和tail -f var/logs/system.log。您应该确保请求与日志匹配。这就是我开始解决问题的方法。

同样,这不是针对问题根源的“copypasta”修复或教程,而是分享我从第一手经验中诊断出问题的经验。

您可以在http://www.silksoftware.com/magento-module-creator

快速创建模块

答案 1 :(得分:0)

您需要在更改后定义送货方式。 例如,在" indexController" Firecheckout创建一个函数" saveShippingAction"。 您可以通过Ajax每次调用此函数来更改客户数据,也可以根据需要调用。

内部地方:

    $customer = Mage::getSingleton('customer/session')->getCustomer();
    $shippingData = $this->getRequest()->getParam('shipping');
    $shippingData['street'] = implode("\n", $shippingData['street']);
    $customerAddress = $customer->getAddresses();
    $customerAddress = end($customerAddress);
    $customerAddress->setIsDefaultShipping(true)->setSaveInAddressBook(true);
    $customerAddress->addData($shippingData)->save();

在此示例中,我将交货数据记录回客户的最后一个地址,如果您需要为新客户保存,只需为他创建一个地址并保存为送货地址。

我希望有所帮助,祝你好运。