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

zed5wv10  于 2022-11-12  发布在  其他
关注(0)|答案(2)|浏览(146)

我们使用了一个由Templates Master提供的自定义结帐扩展,叫做“Firecheckout,”不确定这是否相关,但我觉得我应该提一下。偶尔我会看到一封交易失败的电子邮件,原因是“请指定一种送货方式”。我花了很长时间试图追踪这种情况是如何发生的,但我迷路了。我已经尝试了我能想到的一切来重现这个问题。取决于我做的事情的组合(添加/删除购物车中的商品,添加/删除更改送货选项的优惠券代码,在移动的和桌面网站之间切换等)我已经能够使结帐页面没有选择送货方式的选项。但是,如果我试图提交订单,我会在送货方式部分立即收到一条红色消息,上面写着“请指定送货方式”(注意电子邮件中所说的内容与页面上显示的错误中所说的内容之间的差异...缺少“a”)。这并不会导致错误电子邮件。
通过搜索代码,我发现错误电子邮件是在**_validate方法的TM_FireCheckout_Model_Service_Quote**(扩展Mage _Sales_Model_Service_Quote)类中触发的

$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**的后续调用应与默认安装相同。
如果有必要,我可以提供更多的细节。我基本上是在试图了解什么可能引发这个错误,以及我如何能够重现它,这样我就可以最终修补漏洞,导致它摆在首位。
谢谢你!

icnyk63a

icnyk63a1#

我以前遇到过类似的问题,但不是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中快速创建模块

rbl8hiat

rbl8hiat2#

你需要在修改后定义发货方法。2例如,在Firecheckout的“indexController”中创建一个函数“saveShippingAction”。3你可以在每次修改客户数据时通过 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();

在本例中,我记录了客户的最后一个地址的交货数据,如果在您的情况下需要为新客户保存,只需为他创建一个地址并保存为交货地址。
我希望能帮上忙,祝你好运。

相关问题