JSON Opencart 2.0.3.2 RC 多商店语法错误
JSON syntax error in Opencart 2.0.3.2 RC multi store
通过github 我安装了2.0.3.2。我的数字海洋上的 RC 版本 VPS。一切似乎都工作正常,但就像许多其他人一样,我遇到了 JSON 语法错误的问题。我花了几个小时阅读有关
的论坛页面
- API 必须做的用户
- API 必须指定的用户
- 必须关闭的维护模式
- json = array();解决方案
- 和 cUrl 环回限制(包括 vqmod curl 环回解决方法)http://forum.opencart.com/viewtopic.php?f=191&t=146714
所有这些解决方案似乎都不起作用...当我最终发现我的 VPS 访问限制在 IP 地址上并删除此限制时,订单历史记录更新似乎工作正常所以我以为一切都好。
今天当我尝试编辑订单时,弹出了同样的错误。所以我开始再次浏览论坛以寻求解决方案。
虽然我对尝试的事情感到非常沮丧,但我遇到了这种奇怪的行为。在订单编辑的第一页上出现错误,但是当我 select 标准商店时......一切正常......我可以完全按照我想要的方式编辑订单......但是当我切换返回订单所在商店的选项...它直接响应相同的错误(见附件)。
我不确定是否有任何其他使用 2.0.3+ 的多商店用户的商店运行良好?
你能和我一起思考吗?可能是跨源资源共享策略的问题吗?欢迎所有建议!
可能是您提到的跨源策略问题。我在 1.5.6 上解决了这个问题以及跨域 cookie 问题(据我所知在任何版本上都没有正常工作)通过添加:
xhrFields: { withCredentials: true },
在AJAX请求中以及在接收header上设置access-control-allow-credentials
。这里的技巧是,为了使跨源 headers 以这种方式工作,您需要明确声明允许的 URL(即,Header set Access-Control-Allow-Origin "*"
将 不 工作)。下一个技巧是您不想接受来自任何 URL.
的这些 header
为了解决这个问题,我在 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 header 以允许 cookie 和 session 数据。这主要是针对 cross-domain cookie 共享的修复,但我感觉它也可能有助于解决 2.0 api 问题。
我的一位同事发现 api 调用总是通过 ssl 完成,我所要做的就是在商店设置的 SSL 字段中添加普通商店 url (不是主要的)。
转到“设置”,编辑您的商店(不是“默认”),
在第一个选项卡 (General) 上,确保您的 SSL URL 已设置。
如果您没有 SSL,则设置与商店相同的值 URL。
希望对您有所帮助。
通过github 我安装了2.0.3.2。我的数字海洋上的 RC 版本 VPS。一切似乎都工作正常,但就像许多其他人一样,我遇到了 JSON 语法错误的问题。我花了几个小时阅读有关
的论坛页面- API 必须做的用户
- API 必须指定的用户
- 必须关闭的维护模式
- json = array();解决方案
- 和 cUrl 环回限制(包括 vqmod curl 环回解决方法)http://forum.opencart.com/viewtopic.php?f=191&t=146714
所有这些解决方案似乎都不起作用...当我最终发现我的 VPS 访问限制在 IP 地址上并删除此限制时,订单历史记录更新似乎工作正常所以我以为一切都好。
今天当我尝试编辑订单时,弹出了同样的错误。所以我开始再次浏览论坛以寻求解决方案。
虽然我对尝试的事情感到非常沮丧,但我遇到了这种奇怪的行为。在订单编辑的第一页上出现错误,但是当我 select 标准商店时......一切正常......我可以完全按照我想要的方式编辑订单......但是当我切换返回订单所在商店的选项...它直接响应相同的错误(见附件)。
我不确定是否有任何其他使用 2.0.3+ 的多商店用户的商店运行良好?
你能和我一起思考吗?可能是跨源资源共享策略的问题吗?欢迎所有建议!
可能是您提到的跨源策略问题。我在 1.5.6 上解决了这个问题以及跨域 cookie 问题(据我所知在任何版本上都没有正常工作)通过添加:
xhrFields: { withCredentials: true },
在AJAX请求中以及在接收header上设置access-control-allow-credentials
。这里的技巧是,为了使跨源 headers 以这种方式工作,您需要明确声明允许的 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 header 以允许 cookie 和 session 数据。这主要是针对 cross-domain cookie 共享的修复,但我感觉它也可能有助于解决 2.0 api 问题。
我的一位同事发现 api 调用总是通过 ssl 完成,我所要做的就是在商店设置的 SSL 字段中添加普通商店 url (不是主要的)。
转到“设置”,编辑您的商店(不是“默认”), 在第一个选项卡 (General) 上,确保您的 SSL URL 已设置。
如果您没有 SSL,则设置与商店相同的值 URL。
希望对您有所帮助。