即使在发送确认 HTTP 状态代码 200 后,Webhook 回调也不会停止

Webhook callbacks are not stopping even after sending acknowledge HTTP status code 200

我正在将 Ruby on Rails 应用程序与 BigCommerce 集成。我已注册回调以接收有关订单创建或发货创建的通知。下订单时,它会向我的服务器发送回调,然后我会进行一些处理并使用 HTTP 状态代码 200 确认请求发送方,这与文档中提到的相同。但是 webhook 仍然会在一段时间内触发回调。谁能告诉我如何确认 webhook 并停止接收来自 webhook 的回调?

这是我处理它的示例代码。

order_id =params['data']["orderId"].to_i
store_hash = params['producer'].split('/').last
store = Store.find_by(store_hash: store_hash)
connection = prepare_connection(store, store_hash)

vars = prepare_variable_hash(order_id, connection)

send_notification_email(vars['email'],
  store.email,
  q_subject.html_safe,
  q_body.html_safe
)

render nothing: true, status: 200

在我的服务器控制台中,我收到以下日志。

Rendered text template (0.0ms)
Completed 200 OK in 11883ms (Views: 0.6ms | ActiveRecord: 0.7ms)

我们是否必须在回复时设置任何 header?或者只是状态代码 200 可以吗?

发回 200 响应是您应该做的,以提醒 BigCommerce 端您已收到网络钩子。您遇到的问题是您超过了 BigCommerce 方面的 10 秒超时限制。

Completed 200 OK in 11883ms (Views: 0.6ms | ActiveRecord: 0.7ms)

根据以上所述,您的系统需要超过 10 秒的时间才能将您的响应返回给 BigCommerce。因此,webhook 服务器在收到您的响应并将 webhook 放入重试队列之前关闭连接。

我建议不要在接收时尝试对 webhook 进行如此多的处理。队列系统更适合处理 BigCommerce webhook。这意味着当你收到一个 webhook 时,你应该将它放入你端的队列中并立即给出 200 响应。然后,您将拥有一组单独的工作人员,这些工作人员正在处理您设置的队列中的 webhook 消息。

无法增加 BigCommerce 服务器上强制执行的超时限制。