Webhook à rayures sur Rails

je sais qu'il existe une autre question semblable à celle-ci, mais je ne pense pas qu'elle ait été posée/répondue très bien.

fondamentalement, j'ai une application de travail rails où les utilisateurs peuvent s'inscrire pour mon abonnement, entrer des informations de carte de crédit, etc. C'est tout ce travail. Mais je dois gérer la situation où la carte d'un utilisateur est refusée à un moment donné au cours de cet abonnement récurrent.

Les types d'événements qu'ils envoient sont ici: https://stripe.com/docs/api?lang=ruby#event_types.

j'ai du mal à accéder à la charge.objet échoué dans mon application.

Les docs sur les webhooks sont également ici: https://stripe.com/docs/webhooks, et toute aide serait grandement appréciée.

19
demandé sur Zach 2012-03-09 05:09:51

3 réponses

vous devez créer un controller pour accepter et traiter les requêtes. C'est assez simple, bien que pas aussi simple pour envelopper votre esprit au départ. Voici un exemple de mon 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

le récepteur def est la vue que vous devez pointer les webhooks sur l'interface de bande. La vue reçoit le json, et je l'utilise pour mettre à jour le profil de l'utilisateur dans le cas où un paiement échoue ou réussit.

39
répondu rubyplusplus 2012-03-10 21:25:49

il est beaucoup plus facile maintenant d'utiliser le stripe_event gem:

https://github.com/integrallis/stripe_event

10
répondu Richard Ortega 2013-05-08 17:05:12

C'est un de moins que l'idéal de tests de situation...

Stripe a besoin d'un moyen de "forcer" les webhooks à des fins de test. Actuellement, l'abonnement le plus court que vous pouvez faire est pour 1 semaine (en mode test); il serait beaucoup plus utile si vous pouviez le régler pour 1 minute, 1 heure, ou même tout simplement provoquer le rappel de se produire en temps réel, de sorte que vous pouvez tester votre système de réponse API.

les tests locaux sont super, mais rien ne remplace le monde réel, en direct, sur internet, webhooks/rappels. Avoir à attendre une semaine (!) ralentit sérieusement les projets.

0
répondu rcd 2014-04-08 20:08:54