Использование 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
}
Другие вопросы по тегам