понедельник, 18 апреля 2022 г.

Stripe в стартапе: какой вариант интеграции выбрать?

Stripe (https://stripe.com/) - это не только платежная система со своим апи, но и готовые UI элементы и готовый web интерфейс для работы с платежами. Можно сделать удобный/красивый/функциональный платежный сервис прямо на своем сайте и на все платежные сценарии (включая refund).

Но в стартапе вместо вкладывания в прикручивание платежной системы лучше побыстрее проверить свой продукт: взлетит он или не взлетит. Захочет кто-то покупать - сделаем платежный сервис. И даже если продукт уже начал взлетать, то больше усилий хорошо бы потратить на доработку продукта, чем на удобный прием платежей: ведь важно набрать интересующуюся аудиторию, которой не важно как организованы платежные алгоритмы, которая смотрит на продукт и видит как применить его в своем бизнесе. А онлайн платежи уже есть на многих сайтах, выглядят похожими друг на друга и значит мы их точно сделаем.

Для этого сценария подходит Prebuilt Checkout page: страница на сайте Stripe, на которой уже есть все платежные инструменты. Страница показывает описание товара, количество, стоимость и предлагает оплатить заказ различными способами (сейчас самый популярный способ - это оплата через карту). Это все, что мне нужно от платежной системы на начальных этапах стартапа.

Что бы использовать эту страницу я создал нового Customer, нового Product и новый Price: сайт Stripe уже дает готовое UI для создания этих данных и на моем сайте требуются изменения только для сохранения Customer.id среди данных о моем клиенте и Price.id среди данных о моем продукте. Для начала можно даже не делать UI на сайте для ввода этих значений, а вручную сохранить их в базе.

Для ее использования мне было достаточно зарегистрироваться на сайте Stripe и при нажатии на кнопку вызвать "stripe.checkout.sessions.create" на серверной стороне:

      const session = await stripe.checkout.sessions.create({
        customer: customer.stripeId,
        line_items: [{ price: defaultPrice.stripeId, quantity: 1 }],
        payment_method_types: ['card'],
        mode: 'payment',
      });

В базе Stripe этот код создаст новую запись "намерение оплаты" и вернет url, по которой клиент сможет продолжить операцию оплаты, и мой код клиентского приложения сделает на нее переход:

window.location = url;

На этой странице клиент выполнит оплату и эта информация сохранится в базе Stripe.

Далее мне нужно только узнать об успешном окончании оплаты (и начать отправку товара/открыть новые разделы сайта). Это я могу узнать из готового UI на сайте Stripe (раздел Payments, закладка Succeeded) и начать отправку/изменить статус записи клиента на сайте.

Еще для этого сценария Stripe предлагает использовать WebHooks: Listen for events on your Stripe account so your integration can automatically trigger reactions. Для открытия разделов сайта это выглядит надежнее/быстрее, чем ручная проверка платежей и ручное обновление статуса клиента и я попробовал сделать такой обработчик:

app.post('/webhook', express.raw({ type: 'application/json' }), (req, res) => {
    ...
        event = stripe.webhooks.constructEvent(req.body, sig, webhookSecret);
    ...
    switch (event.type) {
        case 'payment_intent.succeeded':
            // Update customer.status
            break;
        // ... handle other event types
        default:
            console.log(`Unhandled event type ${event.type}`);
    }

    // Return a response to acknowledge receipt of the event
    res.json({ received: true });
});

Документация на сайте Stripe отлично описывает WebHook и различные сценарии их использования. Я сделал минимальную обработку для изменения статуса клиента в моей базе, что бы не проглядывать список успешных платежей вручную. Теперь новые разделы моего сайта будут доступны клиенту сразу после сообщения от Stripe об успешном завершении операции оплаты.

На этом первичную интеграцию платежной системы для стартапа можно завершить: на сайте есть возможность оплаты, которая реализует разные способы оплаты, реализована через сертифицированный сервис и сразу после оплаты открывает новые разделы сайта, а это все что мне сейчас требуется от платежей. Дальнейшее расширение интеграции с платежной системой (например, автоматические refund) я начну делать когда это и в самом деле потребуется в работе с клиентами.

А прямо сейчас я буду развивать мой стартап дальше.

PS: Stripe предлагает очень много возможностей для интеграции платежей на сайты, хочется воспользоваться многими его возможностями, ведь они действительно нужны в реальной работе с клиентами. Но их много и вместо развития стартапа я бы занимался интеграцией. Выбрать баланс мне помогла статья Принципы для разработки: KISS, DRY, YAGNI, BDUF, SOLID, APO и бритва Оккама : я сделал только минимально необходимое на текущем этапе стартапа, а о других сценариях подумаю, когда они возникнут в работе.

Комментариев нет:

Отправить комментарий