Project

General

Profile

Actions

Инструкция фронтенд-разработчикам

Как создавать Payment Methods через Stripe для нашего приложения
📌 Цель

Пассажир должен добавить свою карту, чтобы мы могли:

  • безопасно сохранять карту (Stripe vault)
  • автоматически списывать деньги после поездки (off-session)
  • проводить SCA-подтверждение (3D-Secure)

Для этого используется SetupIntent + Stripe Elements.

1️⃣ Шаг 1. Запросить SetupIntent с бэкенда

Дергаем ручку "Create setup intent object" - POST /api/payments/setup_intents

Получаем

{
    "data": {
        "id": "seti_1SUmTQK65qfXWkSiVIM19pAC",
        "client_secret": "seti_1SUmTQK65qfXWkSiVIM19pAC_secret_TRfp4egUtC6WlqSvYDjYruElmCEFjez",
        "payment_method_types": [
            "card"
        ],
        "account_id": "0cf6a16f-6492-4190-842b-f1563e7e3d7b",
        "user_id": "5f0d292c-f3f7-4a2a-b129-a1d0761cfb12",
        "stripe_account_id": null
    },
    "status": true
}

client_secret нужен фронту, чтобы вызвать Stripe.confirmCardSetup().


2️⃣ Шаг 2. Инициализация Stripe на фронте

import { loadStripe } from '@stripe/stripe-js';

const stripe = await loadStripe(PUBLIC_STRIPE_KEY);

3️⃣ Шаг 3. Создать Card Element и собрать данные карты

const elements = stripe.elements();
const cardElement = elements.create('card');
cardElement.mount('#card-element');

4️⃣ Шаг 4. Подтвердить SetupIntent (3D-Secure + сохранение карты)

const { setupIntent, error } = await stripe.confirmCardSetup(
  clientSecret,
  {
    payment_method: {
      card: cardElement,
      billing_details: {
        name: userFullName,
      },
    },
  }
);

Если всё ok:

setupIntent.status === "succeeded"
setupIntent.payment_method // <-- вот это нужно передать на бэкенд

Если ошибка:

  • insufficient authentication
  • card declined
  • 3DS failed
  • Фронту нужно отобразить сообщение.

5️⃣ Шаг 5. Отправить payment_method на бэкенд

POST /api/payments/payment_methods
Content-Type: application/json
Authorization: Bearer <token>

{
  "payment_method": "pm_123456789"
}

Бэкенд:

  • привязывает payment_method к Customer
  • сохраняет в базе
  • теперь карта готова к off-session оплатам

Updated by Dmitry Vasilev 3 months ago · 9 revisions