【问题标题】:Magento transaction error "Please specify a shipping method"Magento 交易错误“请指定送货方式”
【发布时间】:2012-05-10 12:02:02
【问题描述】:

我们使用 Templates Master 的自定义结帐扩展程序,称为“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 方法之间的唯一区别在于哪些字段被认为是必需的。它不会以任何方式更改地址对象,因此对 getShippingMethodgetShippingRateByCode 的后续调用应该与默认安装相同。

如有必要,我可以提供更多详细信息。我基本上是在尝试了解可能触发该错误的原因以及如何重现该错误,以便最终修补导致该错误的漏洞。

谢谢!

【问题讨论】:

  • 为什么不在 _validate() Mage::log("Firecheckout: " . var_dump($method) . " | " . var_dump($rate), null, 'mydebug.log', true); 中添加一个日志行到 Mage_Sales_Model_Service_Quote 的本地副本并尾随这个自定义日志文件,或者添加订单和客户 ID 以查看这些值是否持续存在?
  • 我有完全相同的错误,但我正在使用 Apptha 的 Onestepcheckout 扩展。任何帮助将不胜感激。

标签: magento magento-1.5


【解决方案1】:

我之前也遇到过类似的情况,但不是 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 快速创建模块

【讨论】:

    【解决方案2】:

    您需要在更改后定义运输方式。 例如,在 Firecheckout 的“indexController”中创建一个函数为“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();
    

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

    希望能帮到你,祝你好运。

    【讨论】:

      猜你喜欢
      • 2014-07-06
      • 2016-10-04
      • 1970-01-01
      • 2013-05-25
      • 2019-07-11
      • 1970-01-01
      • 2014-05-30
      • 2014-12-23
      • 2018-03-17
      相关资源
      最近更新 更多