Shopify 无法从自定义运营商服务获取费率



我正在构建一个返回自定义运费的私人 Shopify 应用程序。按照 API 文档,并在本教程的帮助下,我创建了一个功能性的概念验证,该验证在我的商店中返回了一些示例运费。

但是,该概念验证应用程序是用PHP构建的,最终版本必须使用Ruby on Rails。因此,我创建了一个Rails应用程序,它返回与PHP应用程序完全相同的内容 - 但由于某种原因,费率根本不显示在Shopify后端中。

我注意到唯一不同的是 HTTP 标头(我尝试过使用它们来匹配 PHP 应用程序,但无济于事)。我在这里缺少什么明显的东西吗?

以下是 HTTP 响应标头的比较:

.PHP:

Connection: Keep-Alive
Content-Encoding: gzip
Content-Length: 186
Content-Type: text/html; charset=UTF-8
Date: Tue, 16 May 2017 13:00:30 GMT
Keep-Alive: timeout=5, max=100
Server: Apache/2.4.18 (Ubuntu)
Vary: Accept-Encoding

导轨:

Cache-Control: max-age=0, private, must-revalidate
Connection: keep-alive
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
Date: Tue, 16 May 2017 12:57:38 GMT
ETag: W/"ce885edaa10636b3b7459dca958f44dd"
Server: nginx
Transfer-Encoding: chunked
Vary: Accept-Encoding
X-Request-Id: 54e2575e-c86a-4f44-a315-d0a3fbbc13f9
X-Runtime: 0.616974

同样,Shopify可以很好地处理PHP响应,但在Rails响应上静默失败。在第二个(Rails)块中是否有任何Shopify可能会拒绝的内容?

Shopify 不幸的是,它没有提供错误日志或调试此类问题的方法——无论它们是否从您的应用程序中提取费率。

这是我的 Railsrates_controller.rb

class RatesController < ApplicationController
def index
ups_rates = {
rates: [
{
service_name: 'Endertech Overnight',
service_code: 'ETON',
total_price: '000',
currency: 'USD',
min_delivery_date: (DateTime.now + 1.days).strftime('%F %T %z'),
max_delivery_date: (DateTime.now + 2.days).strftime('%F %T %z')
},
{
service_name: 'Endertech Regular',
service_code: 'ETREG',
total_price: '000',
currency: 'USD',
min_delivery_date: (DateTime.now + 3.days).strftime('%F %T %z'),
max_delivery_date: (DateTime.now + 7.days).strftime('%F %T %z')
}
]
}
# Tested returning both application/json (default) or text/html
#render json: ups_rates
render body: ups_rates.to_json, content_type: "text/html"
end
end

我怀疑 Shopify 缓存非常积极,所以我也尝试破坏和重新创建我的私人应用程序和运营商服务,以及更改callback_url。到目前为止,没有任何效果。

经过大量挖掘,我找到了答案: Shopify 通过POST请求费率,但我的应用程序只响应GET

作为快速修复,我在routes.rb中创建了一个静态路由:

Rails.application.routes.draw do
post 'customrates', to: 'rates#index'
end

回想起来,这在文档中有明确说明,我只是没有注意到(毕竟,费率请求直观地似乎是GET操作)。

对于遇到此问题的其他任何人,请尝试通过 CURL 将POST发送到您的callback_url,只是为了验证它是否返回了应有的内容:

curl -X POST http://yourcallbackurl.com

最新更新