Stripe NoMethodError: undefined method `charges' for nil:NilClass in Rails Console

Stripe NoMethodError: undefined method `charges' for nil:NilClass in Rails Console

我正在尝试让我的应用通过 Webhook 记录来自 Stripe 的成功扣款。这是基于 Chris Oliver 关于 Stripe Webhooks 的 GoRails 讨论。我正在使用 Koudoku gem 来建立 Stripe 功能。当我尝试将 JSON 对象加载到费用表中时,我 运行 遇到了错误。

这是我尝试记录事件时出现的错误:

RecordCharges.new.call(event)
Subscription Load (0.3ms)  SELECT  "subscriptions".* FROM "subscriptions" WHERE "subscriptions"."stripe_id" = ? LIMIT 1  [["stripe_id", "cus_withheldforexample"]]
NoMethodError: undefined method `charges' for nil:NilClass

在我的应用中,用户有一个订阅。订阅有很多费用。费用属于订阅。

架构如下:

create_table "charges", force: :cascade do |t|
t.string   "stripe_id"
t.string   "amount"
t.string   "card_last4"
t.string   "card_type"
t.string   "card_exp_month"
t.string   "card_exp_year"
t.datetime "created_at",      null: false
t.datetime "updated_at",      null: false
t.integer  "subscription_id"
end

create_table "subscriptions", force: :cascade do |t|
t.string   "stripe_id"
t.integer  "plan_id"
t.string   "last_four"
t.integer  "coupon_id"
t.string   "card_type"
t.float    "current_price"
t.integer  "user_id"
t.datetime "created_at",    null: false
t.datetime "updated_at",    null: false
end

我的Stripe.rb文件

class RecordCharges
def call(event)
    charge = event.data.object 
    subscription = Subscription.find_by(stripe_id: charge.customer)

    subscription.charges.create(
        stripe_id: charge.id,
        amount: charge.amount,
        card_last4: charge.source.last4,
        card_type: charge.source.brand,
        card_exp_month: charge.source.exp_month,
        card_exp_year: charge.source.exp_year 
        )
end
end

StripeEvent.configure do |events|
events.subscribe 'charge.succeeded', RecordCharges.new
end

有什么建议吗?谢谢!

Subscription.find_by(stripe_id: charge.customer) 归零。要么你的 charge 没有 customer and/or 你没有 Subscriptionstripe_id.

如果您执行 find_by!,您的应用将引发适当的错误,如果您的应用设置正确,它将在生产中出现 404。