【问题标题】:JSON syntax error in Opencart 2.0.3.2 RC multi storeOpencart 2.0.3.2 RC 多商店中的 JSON 语法错误
【发布时间】:2015-10-02 16:17:02
【问题描述】:

通过 github 我安装了 2.0.3.2。我的数字海洋 VPS 上的 RC 版本。一切似乎都很好,但就像许多其他人一样,我遇到了 JSON 语法错误的问题。我花了几个小时阅读有关

的论坛页面

所有这些解决方案似乎都不起作用...当我终于发现我的 VPS 访问受限于 IP 地址并删除了此限制时,订单历史更新似乎工作正常,所以我认为一切正常。

今天我尝试编辑订单时,弹出相同的以下错误。所以我又开始在论坛上寻找解决方案。

当我在尝试一些事情时非常沮丧时,我遇到了这种奇怪的行为。在订单编辑的第一页上出现错误,但是当我选择标准商店时...一切正常...我可以按照我的意愿编辑订单...但是当我将选项切换回store 下订单...它直接响应相同的错误(见附件)。

我不确定在 2.0.3+ 上是否有其他多商店用户的商店运行良好?

你能和我一起思考吗?可能与跨域资源共享政策有关吗?欢迎所有建议!

【问题讨论】:

  • Opencart 2.0.3.2 版本不是 OpenCart 官方发布的。所以,我认为,你需要使用 OpenCart 2.0.3.1。

标签: json opencart opencart2.x multistore


【解决方案1】:

转到设置,编辑您的商店(不是默认), 并在第一个选项卡(一般)上,确保您的 SSL URL 已设置。

如果您没有 SSL,则设置与商店 URL 相同的值。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    可能是您提到的跨域政策问题。我在 1.5.6 上解决了这个问题以及跨域 cookie 问题(据我所知,它在任何版本上都无法正常工作),方法是添加:

    xhrFields: { withCredentials: true },
    

    在 AJAX 请求中以及在接收标头上设置 access-control-allow-credentials。这里的技巧是,要让跨域标头以这种方式工作,您需要明确声明允许的 URL(即,Header set Access-Control-Allow-Origin "*"工作)。下一个技巧是您不想接受来自任何 URL 的这些标头。

    为了解决这个问题,我在 manual.php 控制器中添加了类似的内容 - 在 2.0+ 中将是 api/order.php(对于跨域 cookie 共享 common/header.php 也是如此):

    $this->load->model('setting/store');
    $allowed[] = trim(HTTP_SERVER,'/');
    $allowed[] = trim(HTTPS_SERVER, '/');
    $stores = $this->model_setting_store->getStores();
    foreach ($stores as $store) {
        if ($store['url']) $allowed[] = strtolower(trim($store['url'],'/'));
        if ($store['ssl']) $allowed[] = strtolower(trim($store['ssl'],'/'));
    }
    if (isset($this->request->server['HTTP_REFERER'])) {
        $url_parts = parse_url($this->request->server['HTTP_REFERER']);
        $origin = strtolower($url_parts['scheme'] . '://' . $url_parts['host']);
        if (in_array($origin,$allowed)) {
            header("access-control-allow-origin: " . $origin);
            header("access-control-allow-credentials: true");
        } else {
            header("access-control-allow-origin: *");
        }
    } else {
        header("access-control-allow-origin: *");
    }
    header("access-control-allow-headers: Origin, X-Requested-With, Content-Type, Accept");
    header("access-control-allow-methods: PUT, GET, POST, DELETE, OPTIONS");
    

    这基本上会创建一个包含所有可接受 URL 的数组,如果请求有效,它会明确设置 HTTP 标头以允许 cookie 和会话数据。这主要是对跨域 cookie 共享的修复,但我觉得它也可能有助于解决 2.0 api 问题。

    【讨论】:

    • 感谢您的回复。我应该把这段代码放在什么函数/类中?我只能找到文件:admin/controller/sale/order.php。有一个公共函数 api()。在那里试过,但没有用。我在哪个文件中更改 ajax 请求?
    • 如果您熟悉 php 和 apache 并花时间了解框架以及您正在尝试做什么,您应该能够弄清楚这一点。如果没有,您可能需要考虑聘请开发人员或访问 opencart 支持论坛以了解如何实施此类解决方案。
    【解决方案3】:

    我的一个同事发现 api 调用总是通过 ssl 完成的,我所要做的就是在商店(而不是主)设置中的 SSL 字段中添加正常的商店 url。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-25
      • 1970-01-01
      • 2017-01-17
      • 2015-06-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多