Как настроить обратный вызов в инициализаторе? - PullRequest
0 голосов
/ 22 февраля 2019

Я использую Koudoku для подписки.Я хочу делать разные вещи после получения веб-крючка Stripe.

В документах он показывает, что вы можете добавить обратный вызов, например:

Koudoku.setup do |config|
  config.subscriptions_owned_by = :user
  config.stripe_publishable_key = ENV['STRIPE_PUBLISHABLE_KEY']
  config.stripe_secret_key = ENV['STRIPE_SECRET_KEY']

  # add webhooks
  config.subscribe 'charge.failed', YourChargeFailed
end

Что я могуне могу понять, как написать YourChargeFailed часть.Я пробовал что-то вроде:

 config.subscribe 'order.payment_succeeded', ActiveRecord::Subscription.after_successful_payment

, но я получаю undefined method after_successful_payment for #<Class:0x007fb845849b30>

Как я могу успешно подписаться на события Stripe, захватить возвращаемые данные и инициировать функцию обратного вызова?

Спасибо!

ОБНОВЛЕНИЕ

Вот то, что я пробовал, и соответствующие ошибки, которые я получаю:

purchaseases_helper.rb

module PurchasesHelper
  require 'stripe'

  def stripe_webhook(event)
    puts 'Purchases Helper'
    puts 'invoice.payment_succeeded'
    @customer = Stripe::Customer.retrieve(event[:data][:object][:customer])

    @user = User.find_by(email: @customer[:email])

    @badge = Badge.find_by(condition: '2019Purchase')
    @badges_user = BadgesUser.find_by(user_id: @user.id, badge_id: @badge.id)
    # if @badges_user === nil
    #   BadgesUser.create(user_id: user.id, badge_id: badge.id)
    # end
    puts 'badge created'
  end
end

инициализаторы / koudoku.rb

Koudoku.setup do |config|
  include ::PurchasesHelper

  config.subscribe 'charge.succeeded' do |event|
    puts 'charge created'
    ::PurchasesHelper.stripe_webhook(event)
  end

end

ОШИБКА:

undefined method `stripe_webhook' for PurchasesHelper:Module excluded from capture: Not configured to send/capture in environment 'development'

NoMethodError (undefined method `stripe_webhook' for PurchasesHelper:Module):

Другая попытка:

Koudoku.setup do |config|
  config.subscribe 'charge.succeeded' do |event|
    puts 'charge created'
    PurchasesHelper.stripe_webhook(event)
  end
end

ОШИБКА:

undefined method `stripe_webhook' for PurchasesHelper:Module excluded from capture: Not configured to send/capture in environment 'development'

NoMethodError (undefined method `stripe_webhook' for PurchasesHelper:Module):

3-я попытка:

Koudoku.setup do |config|
  include PurchasesHelper

  config.subscribe 'charge.succeeded' do |event|
    puts 'charge created'
    stripe_webhook(event)
  end

end

ОШИБКА:

A copy of PurchasesHelper has been removed from the module tree but is still active! excluded from capture: Not configured to send/capture in environment 'development'

ArgumentError (A copy of PurchasesHelper has been removed from the module tree but is still active!):

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Я вижу только одну проблему с вашим кодом.

module PurchasesHelper
  require 'stripe'

  def self.stripe_webhook(event) # NB self.
    puts 'Purchases Helper'
    puts 'invoice.payment_succeeded'
    @customer = Stripe::Customer.retrieve(event[:data][:object][:customer])

    @user = User.find_by(email: @customer[:email])

    @badge = Badge.find_by(condition: '2019Purchase')
    @badges_user = BadgesUser.find_by(user_id: @user.id, badge_id: @badge.id)
    # if @badges_user === nil
    #   BadgesUser.create(user_id: user.id, badge_id: badge.id)
    # end
    puts 'badge created'
  end
end

, а затем вы вызываете его, говоря:

Koudoku.setup do |config|
  config.subscribe 'charge.succeeded' do |event|
    puts 'charge created'
    PurchasesHelper.stripe_webhook(event)
  end
end

Это должно работать

Подождите, но почему?!

Modules - это способ группировки методов, классов и констант.Modules дает вам два основных преимущества.

  1. предоставляет пространство имен и предотвращает конфликты имен
  2. реализует функцию смешивания (когда вы include их)

Вы определили метод экземпляра в Module, который при включении будет появляться в каждом экземпляре объекта.

, но в этом случае вы этого не делаете.Вы хотите вызвать stripe_webhook для самого Module.

, добавив self. stripe_webhook в этом случае = PurchasesHelper. stripe_webhook, что является способом определения методов для класса / модуля.

Вы можете даже делать более причудливые вещи, такие как:

class Animal
  def self.all
    %w[dog cat bird]
  end
end

def Animal.include?(a)
  self.all.include?(a)
end

Animal.include?('cat') # true
Animal.include?('virus') # false

, так что вы даже можете определять методы класса Animal вне области класса, и это будет работать.

Подводя итог:

в этом примере:

module PurchasesHelper
  def self.stripe_webhook(event)
    #...
  end
end

равно

module PurchasesHelper
  def PurchasesHelper.stripe_webhook(event)
    #...
  end
end

, поэтому простое добавление self позволяет вам звонить PurchasesHelper.stripe_webhook

0 голосов
/ 22 февраля 2019

В документах Koudoku говорится, что он на самом деле использует stripe_event для обработки этого https://github.com/integrallis/stripe_event

Итак, глядя на примеры strip_event, вы можете передать блок и сделать все, что вам нужно, или передать что-то, отвечающееcall метод https://github.com/integrallis/stripe_event#usage

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...