2017-09-09 1 views
0

J'ai configuré Stripe paiements dans mon Java Spring MVC Web Application. Je suis en mesure d'ajouter un Customer, créez un Plan et également mis en place Subscriptions pour le client. Depuis que j'ai des paiements récurrents, je voudrais envoyer une notification par e-mail aux clients une fois une facture est générée et aussi une fois le paiement est effectué. À partir des documentations Stripe, les types d'événements dont j'ai besoin sont invoice.upcoming., invoice.payment_succeeded et customer.subscription.trial_will_end puisque j'ai une période d'essai pour quelques plans.Utiliser Stripe webhook pour envoyer des données client obtenir pour les paiements récurrents à l'aide Stripe

J'ai ajouté un point de terminaison webhook dans mon application comme suit:

@ResponseBody 
    @RequestMapping(consumes="application/json", produces="application/json", method=RequestMethod.POST, value="/webhook-endpoint") 
    public Response stripeWebhookEndpoint(@RequestBody String stripeJsonEvent) 
    { 
     Event event = Event.GSON.fromJson(stripeJsonEvent, Event.class); 
     String type = event.getType(); 
     StripeObject stripeObject = event.getData().getObject(); 
     return Response.status(Response.Status.OK).build(); 
    } 

Je suis en train d'obtenir le event type et aussi le customer Id pour que je serai en mesure d'obtenir le client de ma base de données et envoyer notification par e-mail basée sur l'événement. Depuis que je suis mon url webhook dans mon localhost, je suis incapable de déclencher des données réelles de rayure. J'ai aussi été incapable de trouver des données échantillon des documents Stripe: https://stripe.com/docs/api#invoice_object. J'ai aussi essayé Retrive stripe data from stripe webhook event, mais incapable de le tester sans quelques exemples de données.

Y a-t-il un moyen d'obtenir les détails requis de l'événement et de le tester sur mon hôte local.

Répondre

2

Lors du développement de votre application Web, vous pouvez utiliser une solution telle que ngrok pour vérifier les webhooks envoyés à votre hôte local. Une fois ngrok configuré et en cours d'exécution, configurez Stripe pour envoyer des webhooks à l'URL unique fournie par ngrok, par exemple http://my-super-application.ngrok.io. Ngrok redirigera les requêtes http qu'il reçoit de Stripe vers votre machine locale, exactement comme si Stripe envoyait des données directement à votre application locale.

Au lieu de ngrok, vous pouvez également rechercher d'autres solutions, rechercher des mots-clés "tunnels locaux". Pour vérifier les données envoyées par les webhips Stripe depuis le tableau de bord Stripe, allez dans le menu "API", puis dans l'onglet "Webhooks", cliquez sur le bouton "TEST" correspondant au point final que vous souhaitez tester.

Si vous cliquez sur le bouton "Send webhook test", Stripe affiche les données envoyées par le webhook sous "Request". (Et vous pouvez vérifier la demande même si le webhook ne parvient pas à obtenir une réponse de votre point final)

Par exemple, pour l'événement invoice.upcoming, vous obtiendrez quelque chose comme ceci:

{ 
    "created": 1326853478, 
    "livemode": false, 
    "id": "evt_00000000000000", 
    "type": "invoice.upcoming", 
    "object": "event", 
    "request": null, 
    "pending_webhooks": 1, 
    "api_version": "2017-06-05", 
    "data": { 
     "object": { 
     "id": null, 
     "object": "invoice", 
     "amount_due": 0, 
     "application_fee": null, 
     "attempt_count": 0, 
     "attempted": true, 
     "charge": null, 
     "closed": true, 
     "currency": "jpy", 
     "customer": "cus_00000000000000", 
     "date": 1503541536, 
     "description": null, 
     "discount": null, 
     "ending_balance": 0, 
     "forgiven": false, 
     "lines": { 
      "data": [ 
      { 
       "id": "sub_BN5yNiTkAlQOye", 
       "object": "line_item", 
       "amount": 500, 
       "currency": "jpy", 
       "description": null, 
       "discountable": true, 
       "livemode": true, 
       "metadata": { 
       }, 
       "period": { 
       "start": 1507604796, 
       "end": 1510283196 
       }, 
       "plan": { 
       "id": "bplan", 
       "object": "plan", 
       "amount": 500, 
       "created": 1504352393, 
       "currency": "jpy", 
       "interval": "month", 
       "interval_count": 1, 
       "livemode": false, 
       "metadata": { 
       }, 
       "name": "B plan", 
       "statement_descriptor": null, 
       "trial_period_days": null 
       }, 
       "proration": false, 
       "quantity": 1, 
       "subscription": null, 
       "subscription_item": "si_1B0LmKE9P3qCpf5erqbpMxkI", 
       "type": "subscription" 
      } 
      ], 
      "total_count": 1, 
      "object": "list", 
      "url": "/v1/invoices/in_1AuB2KE9P3qCpf5ekFh7qpAi/lines" 
     }, 
     "livemode": false, 
     "metadata": { 
     }, 
     "next_payment_attempt": null, 
     "paid": true, 
     "period_end": 1503541536, 
     "period_start": 1503541536, 
     "receipt_number": null, 
     "starting_balance": 0, 
     "statement_descriptor": null, 
     "subscription": "sub_00000000000000", 
     "subtotal": 0, 
     "tax": null, 
     "tax_percent": null, 
     "total": 0, 
     "webhooks_delivered_at": 1503541537 
     } 
    } 
    } 
+0

merci pour la réponse, mais comment puis-je obtenir le numéro de client de l'objet de l'événement.Lorsque j'essaie event.getUserId(), il affiche La méthode getUserId() du type Event est obsolète. Tout ce dont j'ai besoin pour le moment, c'est le type d'événement et l'identifiant client pour pouvoir envoyer un email à ce client. –

+1

Selon l'exemple JSON précédent de ma réponse, si le type d'événement est 'invoice.upcoming', vous pouvez analyser le JSON les données que vous obtenez du webhook et lisez la propriété 'data.object.customer' pour obtenir l'identifiant du client. Cela fonctionnerait-il pour votre cas d'utilisation? –

+0

StripeObject stripeObject = événement.getData(). GetObject(); donnera l'objet. Je ne vois toujours pas de méthode pour obtenir le client de cet objet. –

1

l'objet data contient l'ID customer comme string

Pour invoice.upcoming et invoice.payment_succeeded l'ID client a reçu comme string dans data objet.

Après JSON contiennent l'événement data objet pour invoice.upcoming

{ 
    "object": { 
    "object": "invoice", 
    "amount_due": 30000, 
    "application_fee": null, 
    "attempt_count": 0, 
    "attempted": false, 
    "charge": null, 
    "closed": false, 
    "currency": "gbp", 
    "customer": "cus_ATtwlQqRx75cxxx", 
    "date": 1505559958, 
    "description": null, 
    "discount": null, 
    "ending_balance": null, 
    "forgiven": false, 
    "lines": { 
     "object": "list", 
     "data": [ 
     { 
      "id": "sub_AU9VONtkvz9xxx", 
      "object": "line_item", 
      "amount": 30000, 
      "currency": "gbp", 
      "description": null, 
      "discountable": true, 
      "livemode": false, 
      "metadata": { 
      }, 
      "period": { 
      "start": 1505559958, 
      "end": 1508151958 
      }, 
      "plan": { 
      "id": "package_1", 
      "object": "plan", 
      "amount": 30000, 
      "created": 1492282426, 
      "currency": "gbp", 
      "interval": "month", 
      "interval_count": 1, 
      "livemode": false, 
      "metadata": { 
      }, 
      "name": "Package 1", 
      "statement_descriptor": null, 
      "trial_period_days": null 
      }, 
      "proration": false, 
      "quantity": 1, 
      "subscription": null, 
      "subscription_item": "si_1A9BCcJ7IsZfBU9bw4Cxxx", 
      "type": "subscription" 
     } 
     ], 
     "has_more": false, 
     "total_count": 1, 
     "url": "/v1/invoices/in_xxxxxnV9RmPcl/lines" 
    }, 
    "livemode": false, 
    "metadata": { 
    }, 
    "next_payment_attempt": 1505563558, 
    "paid": false, 
    "period_end": 1505559958, 
    "period_start": 1502881558, 
    "receipt_number": null, 
    "starting_balance": 0, 
    "statement_descriptor": null, 
    "subscription": "sub_AU9VONtkvz9xxx", 
    "subtotal": 30000, 
    "tax": null, 
    "tax_percent": null, 
    "total": 30000, 
    "webhooks_delivered_at": null 
    }, 
    "previous_attributes": null 
}