ruby-on-rails - secret - stripe ruby
Webhook de la raya en los carriles (3)
Ahora es mucho más fácil usar la gema stripe_event
:
Sé que hay otra pregunta similar a esta, pero no creo que se haya hecho o respondido muy bien.
Básicamente, tengo una aplicación de Rails en funcionamiento donde los usuarios pueden registrarse para mi suscripción, ingresar la información de la tarjeta de crédito, etc. Eso es todo. Pero necesito manejar la situación en la que la tarjeta de un usuario se rechaza en algún momento durante esta suscripción recurrente.
Los tipos de eventos que envían están aquí: https://stripe.com/docs/api?lang=ruby#event_types .
Tengo problemas para acceder al objeto charge.failed en mi aplicación.
Los documentos en webhooks también están aquí: https://stripe.com/docs/webhooks , y cualquier ayuda sería muy apreciada.
Esta es una situación de prueba menos que ideal ...
Stripe necesita una forma de "forzar" los webhooks para propósitos de prueba. Actualmente, la suscripción más corta que puede hacer es por 1 semana (en modo de prueba); sería mucho más útil si pudiera configurarlo para 1 minuto, 1 hora, o simplemente para que la devolución de llamada se produzca en tiempo real, de modo que pueda probar su sistema de respuesta API.
Las pruebas locales son excelentes, pero nada reemplaza al mundo real, en vivo, a través de Internet, webhooks / callbacks. Tener que esperar una semana (!) Ralentiza seriamente los proyectos.
Necesitas crear un controlador para aceptar y manejar básicamente las solicitudes. Es bastante sencillo, aunque no tan sencillo para envolver tu mente inicialmente. Aquí hay un ejemplo de mi 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
El receptor def es la vista a la que tiene que apuntar los webhooks en la interfaz de banda. La vista recibe el json y lo estoy usando para actualizar el perfil del usuario en caso de que un pago falle o tenga éxito.