2012-03-09 5 views
19

Я знаю, что существует другой вопрос, который существует подобным этому, но я не думаю, что он был задан/ответил очень хорошо.Stripe Webhook on Rails

В основном у меня есть рабочее рельсовое приложение, в котором пользователи могут подписаться на мою подписку, ввести информацию о кредитной карте и т. Д. Это все работает. Но мне нужно обработать ситуацию, когда карта пользователя отклоняется в какой-то момент во время этой повторяющейся подписки.

Виды событий, которые они отправляют, находятся здесь: https://stripe.com/docs/api?lang=ruby#event_types.

У меня возникли проблемы с доступом к объекту charge.failed в моем приложении.

Документы на веб-узлах также находятся здесь: https://stripe.com/docs/webhooks, и любая помощь будет очень признательна.

+0

Возможный дубликат [Использование веб-кнопок Stripe с Rails] (http://stackoverflow.com/questions/9371566/using-stripe-webhooks-with-rails) – Hauleth

ответ

39

Вам необходимо создать контроллер, чтобы в принципе принимать и обрабатывать запросы. Это довольно прямолинейно, хотя и не так прямо, чтобы сначала обернуть ваш разум. Вот пример моего hooks_controller.rb:

class HooksController < ApplicationController 
    require 'json' 

    Stripe.api_key = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 

    def receiver 

    data_json = JSON.parse request.body.read 

    p data_json['data']['object']['customer'] 

    if data_json[:type] == "invoice.payment_succeeded" 
     make_active(data_event) 
    end 

    if data_json[:type] == "invoice.payment_failed" 
     make_inactive(data_event) 
    end 
    end 

    def make_active(data_event) 
    @profile = Profile.find(User.find_by_stripe_customer_token(data['data']['object']['customer']).profile) 
    if @profile.payment_received == false 
     @profile.payment_received = true 
     @profile.save! 
    end 
    end 

    def make_inactive(data_event) 
    @profile = Profile.find(User.find_by_stripe_customer_token(data['data']['object']['customer']).profile) 
    if @profile.payment_received == true 
     @profile.payment_received = false 
     @profile.save! 
    end 
    end 
end 

Приемник Защиту является мнение, что вы должны указать на webhooks к на границе полосы. В представлении появляется json, и я использую его для обновления профиля пользователя в случае неудачного или успешного выполнения платежа.

+0

Nice !! Я думаю, что ты прав, сначала это было немного запугивающе, но как только я понял, это было неважно. Мой контроллер действительно выглядел примерно так (хотя и не так красиво). Благодаря! – Zach

+2

Очень полезно! FYI результат анализа JSON не является равнодушным хешем, поэтому вы можете вместо этого выполнить event_json = JSON :: parse (request.body.read) .with_indifferent_access. – runako

+10

Для лучшей практики [безопасности] используйте идентификатор события ('data_json ['id']') для извлечения объекта Stripe :: Event, а затем извлеките данные из него, так как это наверняка законно. - Как указано на странице ссылки веб-хостов Stripe (https://stripe.com/docs/webhooks). – anxiety

0

Это меньше, чем идеал тестирования ситуация ...

нашивки нужен способ «заставить» webhooks для целей тестирования. В настоящее время самая короткая подписка, которую вы можете сделать, составляет 1 неделю (в тестовом режиме); было бы намного полезнее, если бы вы могли установить его на 1 минуту, 1 час или даже просто вызвать обратный вызов в реальном времени, чтобы вы могли протестировать свою систему ответа API.

Местные тесты отличные, но ничто не заменяет реальный мир, живут, через Интернет, веб-хосты/обратные вызовы. Приходится ждать неделю (!), Серьезно замедляя проекты.

+0

В настоящее время минимум 1 день, но по-прежнему согласен с вами. – Francisco

 Смежные вопросы

  • Нет связанных вопросов^_^