【问题标题】:Magento Strange Redirect Behaviour on OnePage CheckoutOnePage Checkout 上的 Magento 奇怪的重定向行为
【发布时间】:2011-07-29 02:04:42
【问题描述】:

我的 Magento 版本是 - 1.4.1.1

我有两个问题:

1) 当我完成 Onepage 结帐的各个步骤(注册、开票、发货和付款选项卡)时,有时在此过程中我会被重定向到购物车页面。没有错误,没有异常,在 var/report 中没有生成报告。我不知道如何调试它。没有我可以查找的日志吗?

2) 在点击下订单(最后一步)后,在同一个 Onepage Checkout 过程中,有时它会重定向到购物车页面,发送一封电子邮件说订单失败并显示以下消息:

必须在此操作之前收集报价总额。

为了解决这个问题,我在文件magento/app/code/core/Mage/Sales/Model/Quote.php 中的prepareRecurringPaymentProfiles 中注释了这一行,从而解决了问题:

throw new Exception("Quote totals must be collected before this operation.");

我不知道这两个问题是否相关。但是我现在没有第二个问题,而是经常遇到第一个问题。可能是什么原因以及如何解决?

进一步更新-我检查了萤火虫跟踪,这是 500 内部服务器错误,有时在一页结帐的任何步骤中都会出现。我能够深入研究 onepagecontroller.php 中的 savebillingaction、saveshippingaction 函数,发现当 $this->getRequest()->isPost() 为空白时会出现错误,如果为 1 则继续,然后转到下一个否则它会重定向到购物车,不,我不知道为什么这不是 1 或者是因为 ajax 无法发送发布数据但我检查了 XHR 请求,Ajax 每次都发送发布数据(使用 firebug 扩展检查)。有人可以告诉我接下来我可以做些什么来排除故障。我在哪里可以找到这些 Ajax 调用? Shipping.phtml(任意step.phtml)底部有JS,怎么调用OnePagecontroller saveshippingaction函数?

【问题讨论】:

  • 检查它是否发生在特定的支付方式上,如果是,则开始调试这个支付方式控制器。
  • 您可能会发现有用的信息,我在一个版本上工作了 11 个月,没有发生这种情况,并且有一天它开始了(我没有更改后端或前端的任何内容,我也没有更改任何内容文件。)唯一改变的两个问题是:该站点通过了 1000 个订单,这是 Internet Explorer 的重新升级,我只有 4 个遇到此问题的订单,所有订单都来自新的资源管理器,也许是它的故障。
  • 切换服务器后,Cyber​​source 支付方式出现此问题。唯一的变化是从 php 5.2 到 5.3。最终需要调整支付方式代码中的 1 行来修复。问题是抛出了一个错误,但由于某种原因无法记录。
  • 您的某些自定义会破坏结帐流程。是不是改了一些 JS 代码?

标签: redirect magento checkout magento-1.4


【解决方案1】:

首先,评论错误消息几乎不是解决问题的方法,因为您只是在掩盖一些可能对您的系统造成严重后果的问题。

确定这样的错误可能很困难,但有几个地方需要先查看:

  1. 您是否在较低版本上安装了此系统然后升级?如果有,怎么做?
  2. 您是否使用任何扩展程序来修改网站的销售/结帐部分?
  3. 您是否覆盖了与网站这一部分相关的任何模型?
  4. 您是否更改了结帐的 JS 或 HTML?

如果是其中一种情况,您应该查看这些更改是否存在错误。如果没有,请尝试打开网站的默认主题并再次签出。如果错误消失,则说明您使用的主题有问题。如果仍然出现,则问题出在代码中。

在后一种情况下,使用 Firebug 来验证有问题的页面请求是否会导致 Magento 将“重定向”命令发送回前端。如果不是这种情况,则可能是某种 JS 错误,但更有可能的是,您最终会在系统中某处导致 Magento 在结帐时阻塞。

还有(刚想到这个,没试过),试试多地址结账吧。我记得,它使用常规页面帖子,甚至可能比 OnePage 结帐更有用的消息。请根据您的上述发现编辑您的帖子,以便我们在不这样做时提供更多帮助。

希望有帮助!

【讨论】:

  • 谢谢乔,我没有升级或安装任何扩展。使用萤火虫跟踪错误。我一直在所有步骤中编辑信息,并且能够多次重现错误。错误来自 savebillinginformation,500 内部服务器错误。 firebug trace- POST saveBilling domain.com/checkout/onepage/saveBilling 200 OK POST saveShipping domain.com/checkout/onepage/saveShipping 200 OK POST saveShippingMethod domain.com/checkout/onepage/saveShippingMethod 200 OK POST saveBilling domain.com/checkout/onepage/saveBilling 500 INTERNAL SERVER ERROR
  • 我也能够在 saveshippingmenthod 重现错误。所以问题可能与任何步骤有关。
  • 进一步更新-我能够深入研究 onepagecontroller.php 中的 savebillingaction、saveshippingaction 函数,并发现当 $this->getRequest()->isPost() 为空白时会出现错误,如果它是 1 然后它继续,并进入下一步,否则它重定向到购物车,不,我不知道为什么这不是 1 或者是因为 ajax 无法发送帖子数据但我检查了 XHR 请求,Ajax 发送帖子每次的数据。你能告诉我在这些 savebillingAction、saveShippingAction 之前和之后调用了哪些函数,以便我看一下。
  • @joseph-mastey 谢谢。如何调试单页结帐 Ajax 调用中的 500 内部服务器错误。XHR 请求发布数据但我认为它不会转到 OnePageController.php 并且 $this->getRequest()->isPost() 条件变为假,响应正文空白。
【解决方案2】:

对于遇到“必须在此操作之前收集报价总额”的任何其他人。错误,请检查您的 Apache 日志以了解 500 内部服务器错误的原因。如果是这样的:

mod_fcgid: read data timeout in 40 seconds
Premature end of script headers: index.php
process 26126 graceful kill fail, sending SIGKILL

..PHP 响应时间过长。通常它是 onepage/checkout saveOrder 操作,因为它非常繁重并且经常需要连接到第三方服务(支付网关、通讯服务,如 mailchimp 等)。这些对第三方服务的调用可能需要一段时间,具体取决于网络状态,并且可能是 PHP 超时的原因。

您可以从增加超时开始,但这不是一个好的永久解决方案,因为您首先要找出发生这种情况的原因。

New Relic 是监控这些调用的好工具(通常也是监控 Magento 商店的好工具)。

【讨论】:

    【解决方案3】:

    以防万一有人收到“必须在此操作之前收集报价总额”。错误,并且这些解决方案都没有解决他们的特定问题,我会提到我的问题是:

    皮肤/前端/base/default/js/opcheckout.js

    var params = Form.serialize(payment.form);
    

    此站点存在一个独特的 JS 错误,该错误正在清除付款表单并阻止 JS 读取其内容。您使用的模块或主题会有所不同,但请检查以确保付款表单可以正确序列化。如果没有,那可能是你的问题。

    【讨论】:

      【解决方案4】:

      由于是内部服务器错误,请尝试访问服务器的错误日志。会告诉你问题出在哪里。我在 1.7.0 中遇到过同样的问题。在我的示例中,问题出在/app/code/core/Mage/Usa/Model/Shipping/Carrier/Fedex.php

      【讨论】:

        【解决方案5】:

        我在 Princessly 商店遇到了同样的问题:

        1. 提交订单信息...”大约需要 20 到 130 秒甚至更长的时间才能通过并重定向到 PayPal 等支付网关,如果有的话,之后点击Place Order按钮,一页结账的最后一步。

        2. 如果它没有通过,很可能是因为时间太长而超时,它会将重定向回购物车,让客户购物车为空,待处理付款订单,或者,它会给出以下例外:

          必须在此操作之前收集报价总额。

          因为很明显,好吧,有些事情超时了,脚本在报价总额被收集之前结束(这只是我的理论),因此发送 支付交易失败提醒 电子邮件。

        经过12个小时的研究和调试,我终于找到了罪魁祸首和解决方案。

        Magento 默认启用 RSS 库存和新订单通知,因此每次按下 Place Order(然后保存“销售/订单”资源),缓存都会刷新,因此 RSS 将被发布。缓存清理对于 Magento 来说可能非常耗时。因此解决方案很简单。只需禁用 RSS 通知即可保存“销售/订单”资源。

        找到 /app/code/core/Mage/Rss/etc/config.xml 并找到这个块:

        <sales_order_item_save_after>
            <observers>
                <notifystock>
                    <class>rss/observer</class>
                    <method>salesOrderItemSaveAfterNotifyStock</method>
                </notifystock>
            </observers>
        </sales_order_item_save_after>
        <sales_order_item_save_after>
            <observers>
                <ordernew>
                    <class>rss/observer</class>
                    <method>salesOrderItemSaveAfterOrderNew</method>
                </ordernew>
            </observers>
        </sales_order_item_save_after>
        

        只需删除或注释掉它并在系统中刷新 Magento 缓存 => 缓存管理 => 全选 => 提交。

        现在我的商店只需 1 秒甚至更短的时间即可完成下订单并重定向到支付网关。

        【讨论】:

        猜你喜欢
        • 2013-11-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-20
        • 1970-01-01
        • 2015-12-13
        • 2013-04-30
        • 2014-10-23
        相关资源
        最近更新 更多