我目前正在为我的 Rails 应用程序开发 stripe webhook,但遇到了问题。除
checkout.session.completed
之外的所有事件均有效。
我的主要目标是当事件 booking.paid
发生时,将付款状态 true
更改为 checkout.session.completed
。 stripe webhooks 日志为我提供了事件 checkout.session.completed
的 500 内部服务器错误。我认为问题出在我的 Webhook 控制器中,但我就是不知道出了什么问题。任何帮助都会很棒!
这是我的 Webhooks_controller:
class WebhooksController < ApplicationController
skip_before_action :authenticate_user!
skip_before_action :verify_authenticity_token
def create
payload = request.body.read
sig_header = request.env['HTTP_STRIPE_SIGNATURE']
event = nil
begin
event = Stripe::Webhook.construct_event(
payload, sig_header, Rails.application.credentials[:stripe][:webhook]
)
rescue JSON::ParserError => e
status 400
return
rescue Stripe::SignatureVerificationError => e
# Invalid signature
puts "Signature error"
p e
return
end
# Handle the event
case event.type
when 'checkout.session.completed'
# session = event.data.object
# @booking.session.client_reference_id.paid = true
booking = Booking.find_by(checkout_session_id: event.data.object.id)
booking.update(paid: true)
end
render json: { message: 'success' }
end
end
我恰好正在编写与您完全相同的功能,所以我很高兴它出现在我的队列中。
快速浏览一下代码,没有什么特别突出的地方。如果我们知道唯一不起作用的事件是
checkout.session.completed
,并且这是我们正在处理的唯一事件,那么问题就会缩小一点......所以这就是我所做的:
$ stripe listen --forward-to http://localhost:3000/webhook_events
我注释掉了事件的实际处理,因此它只是处理事件。
然后我在新终端中使用 Stripe CLI 来触发
checkout.session.completed
事件:
$ stripe trigger checkout.session.completed
201
,Stripe 很高兴。因此,正如前面的答案所表明的那样,我认为问题在于您更新
Booking
模型,因此我有一些建议可以使使用 webhooks 变得更容易:
2xx
响应。Booking
模型。该作业的参数可以像 Stripe 结帐会话 ID 一样简单。我希望这有帮助,祝你好运!
我认为问题可能出在
Booking.find_by
方法上。尝试添加一行来检查 booking
的值,然后再更新其状态。
当“checkout.session.completed”时
在此使用 print(session) 它将在控制台中显示影响或在结账会话中显示 500 错误的错误
stripe webhooks 旨在处理很少的代码,然后传递到另一个路由。您的 Booking 集合可能太大,搜索太长,导致 Webhook 崩溃。看看这个