Использование Stripe Webhook для отправки сведений о клиенте для повторяющихся платежей с использованием Stripe
Я настроил Stripe
платежи в моем Java Spring MVC Web Application
, Я могу добавить Customer
, создать Plan
а также настроить Subscriptions
для клиента. Поскольку у меня есть регулярные платежи, я хотел бы отправить уведомление по электронной почте клиентам, как только счет будет сгенерирован, а также после того, как платеж будет сделан. Из документации Stripe, типы событий, которые мне требуются: invoice.upcoming.
, invoice.payment_succeeded
а также customer.subscription.trial_will_end
так как у меня есть испытательный срок для нескольких планов.
Я добавил конечную точку webhook в свое приложение следующим образом:
@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();
}
Я пытаюсь получить event type
а также customer Id
так что я смогу получить клиента из моей базы данных и отправить уведомление по электронной почте в зависимости от события. Так как у меня есть мой URL веб-крюка в моем localhost
Я не могу вызвать фактические данные из Stripe. Также мне не удалось найти образцы данных из документов Stripe: https://stripe.com/docs/api. Я также пытался извлечь данные чередования из события чередования чередующихся, но не смог протестировать их без некоторых примеров данных.
Есть ли способ, которым я могу получить детали, требуемые от события, а также проверить это на моем локальном хосте.
2 ответа
Во время разработки вашего веб-приложения, чтобы проверить веб-хуки, отправленные на ваш локальный хост, вы можете использовать такое решение, как ngrok.
Когда ngrok настроен и запущен, настройте Stripe для отправки веб-крючков по уникальному URL-адресу, предоставленному ngrok, например http://my-super-application.ngrok.io
например.
ngrok "перенаправит" http-запросы, которые он получает от Stripe, на ваш локальный компьютер, точно так же, как если бы Stripe отправил данные непосредственно в ваше локальное приложение.
Вместо ngrok вы также можете проверить другие решения, поиск по ключевым словам "локальные туннели".
Чтобы проверить данные, отправленные веб-зачистками Stripe с панели мониторинга Stripe, перейдите в меню "API", затем на вкладку "Веб-зацепки" нажмите кнопку "ТЕСТ", связанную с конечной точкой, которую вы хотите протестировать.
Если вы нажмете кнопку "Отправить тестовый веб-крючок", Stripe покажет вам данные, отправленные веб-крючком в разделе "Запрос". (И вы можете проверить запрос, даже если webhook не сможет получить ответ от вашей конечной точки)
Например, для invoice.upcoming
событие, вы получите что-то вроде этого:
{
"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
}
}
}
data
объект содержит customer
ID как string
За invoice.upcoming
а также invoice.payment_succeeded
идентификатор клиента, полученный как string
в data
объект.
Следующие JSON содержат событие data
объект для 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
}