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.
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.
il est beaucoup plus facile maintenant d'utiliser le stripe_event
gem:
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.