2012-03-09 8 views
19

Sé que hay otra pregunta similar a esta, pero no creo que se haya preguntado/respondido muy bien.Stripe Webhook on Rails

Básicamente tengo una aplicación de rieles de trabajo donde los usuarios pueden suscribirse, ingresar información de la tarjeta de crédito, etc. Eso está funcionando. Pero necesito manejar la situación en la que se rechaza la tarjeta de un usuario 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.

+0

posible duplicado de [Uso de webhooks de banda con rieles] (http://stackoverflow.com/questions/9371566/using-stripe-webhooks-with-rails) – Hauleth

Respuesta

39

Necesita crear un controlador para básicamente aceptar y manejar las solicitudes. Es bastante sencillo, aunque no es tan sencillo como para pensar inicialmente. He aquí 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 opinión de que hay que señalar las WebHooks que 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.

+0

¡¡Guay !! Creo que tienes razón, fue un poco intimidante al principio, pero una vez que lo descubrí, no fue un gran problema. Mi controlador realmente se veía algo así (aunque no tan bonito). ¡Gracias! – Zach

+2

¡Muy útil! FYI el resultado del análisis JSON no es un hash indiferente, por lo que es posible que desee hacer event_json = JSON :: parse (request.body.read) .with_indifferent_access en su lugar. – runako

+10

Para la mejor práctica de [seguridad], use la identificación del evento ('data_json ['id']') para recuperar el objeto Stripe :: Event, y luego tome los datos de eso, ya que es seguro. - Como se indica en [la página de referencia de los webhooks de Stripe] (https://stripe.com/docs/webhooks). – anxiety

0

Ésta es una menos que ideal situación de prueba ...

raya necesita una forma de WebHooks "fuerza" 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 pudieras configurarlo durante 1 minuto, 1 hora o incluso simplemente hacer que la devolución de llamada se realice en tiempo real, para que puedas probar tu sistema de respuesta API.

Las pruebas locales son geniales, pero nada reemplaza el mundo real, en vivo, a través de Internet, enlaces web/devoluciones de llamada. Tener que esperar una semana (!) Ralentiza seriamente los proyectos.

+0

Hoy en día, el mínimo es de 1 día pero aún así estoy de acuerdo con usted. – Francisco