← Назад к вопросам

Где будешь чинить если не работает оплата по тесту?

2.0 Middle🔥 121 комментариев
#JavaScript Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Отладка платежей - структурированный подход

Введение

Это практический вопрос, который проверяет способность разработчика логически мыслить и находить проблемы в сложных системах. Платежи — это критично важная часть приложения, и быстрая отладка здесь ценится на вес золота.

Алгоритм отладки платежа

1. Слой Frontend - первая проверка

Проверь в браузере:

// Откройте Console (F12) и проверьте ошибки
console.error(); // Ищите красные сообщения
console.warn();  // Ищите жёлтые сообщения

// Проверьте Network tab
// 1. Ищите запросы к платежной системе (Stripe, PayPal и т.д.)
// 2. Статус должен быть 200 OK, а не 4xx или 5xx
// 3. Посмотрите Response в Network tab

// Проверьте формирование запроса
const paymentData = {
  amount: 9999, // в копейках/центах?
  currency: 'RUB', // Правильная валюта?
  token: 'tok_xxx', // Токен от платёжного провайдера?
  description: 'Payment description'
};

fetch('/api/payments', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify(paymentData)
});

Частые ошибки Frontend:

// 1. Неправильный формат суммы
const amount = 99.99; // НЕПРАВИЛЬНО - копейки должны быть целые
const amount = 9999; // ПРАВИЛЬНО - в копейках (100 копеек = 1 рубль)

// 2. Отсутствует токен
if (!token) {
  console.error('Payment token missing!'); // Токен не получен от Stripe
}

// 3. CORS ошибка
// Error: Access to XMLHttpRequest blocked by CORS
// Проверьте backend конфигурацию CORS

// 4. Неправильный Content-Type
headers: {
  'Content-Type': 'application/json' // Правильно
  // 'Content-Type': 'application/x-www-form-urlencoded' // Неправильно
}

2. Слой API - проверка запроса

На backend проверьте:

# Python (FastAPI example)
from fastapi import APIRouter, HTTPException
from pydantic import BaseModel

router = APIRouter()

class PaymentRequest(BaseModel):
    amount: int
    currency: str
    token: str
    description: str

@router.post("/api/payments")
async def create_payment(payment: PaymentRequest):
    # 1. Логируйте входящие данные
    logger.info(f"Payment request: {payment}")
    
    # 2. Валидируйте данные
    if payment.amount <= 0:
        raise HTTPException(status_code=400, detail="Amount must be positive")
    
    if not payment.token:
        raise HTTPException(status_code=400, detail="Token is required")
    
    # 3. Проверьте токен формат
    if not payment.token.startswith('tok_'):
        logger.error(f"Invalid token format: {payment.token}")
        raise HTTPException(status_code=400, detail="Invalid token")
    
    # 4. Продолжайте отладку
    return {"status": "processing"}

3. Слой платёжного провайдера - самая важная часть

Stripe пример:

import stripe
from typing import Optional

stripe.api_key = os.getenv("STRIPE_SECRET_KEY")

async def process_payment(amount: int, token: str, description: str):
    try:
        # 1. Проверьте API ключ
        if not stripe.api_key:
            raise ValueError("Stripe API key not configured")
        
        logger.info(f"Creating charge: amount={amount}, token={token}")
        
        # 2. Создайте платёж
        charge = stripe.Charge.create(
            amount=amount,
            currency="rub",
            source=token,
            description=description
        )
        
        logger.info(f"Charge created: {charge['id']}")
        
        # 3. Проверьте результат
        if charge['status'] != 'succeeded':
            logger.error(f"Charge failed: {charge['status']}")
            return {"status": "failed", "error": charge['failure_message']}
        
        return {"status": "success", "charge_id": charge['id']}
    
    except stripe.error.CardError as e:
        # Карта отклонена
        logger.error(f"Card error: {e.user_message}")
        return {"status": "failed", "error": e.user_message}
    
    except stripe.error.RateLimitError as e:
        # Много запросов
        logger.error(f"Rate limit: {e}")
        return {"status": "failed", "error": "Too many requests"}
    
    except stripe.error.AuthenticationError as e:
        # Неправильный API ключ
        logger.error(f"Auth error: {e}")
        return {"status": "failed", "error": "Authentication failed"}
    
    except Exception as e:
        logger.error(f"Unexpected error: {e}")
        return {"status": "failed", "error": str(e)}

Шаг за шагом диагностика

Пример: "Оплата не работает"

Шаг 1: Проверка Frontend

# 1. Откройте DevTools (F12)
# 2. Перейдите в Console tab
# 3. Попробуйте оплату
# 4. Ищите красные ошибки

# Типичные ошибки:
# - "Token not found"
# - "Payment amount is invalid"
# - "CORS error"

Шаг 2: Проверка Network

# 1. Network tab -> Filter по /api/payments
# 2. Кликните на запрос
# 3. Посмотрите:
#    - Status: должен быть 200 (успех) или 4xx/5xx (ошибка)
#    - Request Body: правильная ли сумма и токен?
#    - Response: что вернул сервер?

# Пример Response:
# {"status": "failed", "error": "Card declined"}

Шаг 3: Проверка логов на сервере

# SSH на сервер
ssh user@server

# Смотрите логи приложения
tail -f /var/log/app.log

# Ищите строку с платежом
grep "Payment request" /var/log/app.log
grep "Stripe error" /var/log/app.log

# Типичные ошибки в логах:
# [ERROR] Stripe API key missing
# [ERROR] Card error: Your card was declined
# [ERROR] Authentication failed: Invalid API key

Шаг 4: Проверка платёжного провайдера

# 1.登ite в админ панель Stripe/PayPal
# 2. Посмотрите историю платежей
# 3. Найдите платёж по сумме и времени
# 4. Посмотрите статус и детали

# Статусы:
# - succeeded: платёж прошёл
# - failed: платёж отклонён
# - pending: ожидание

Частые причины и решения

1. "Card Declined" (Карта отклонена)

Причина: Карта заблокирована банком
Решение: Пользователь должен использовать другую карту

2. "Invalid Token"

Причина: Токен истёк или неправильный формат
Решение: Заново запросить токен у Stripe

3. "Authentication Failed"

Причина: Неправильный API ключ
Решение: Проверить environment variable STRIPE_API_KEY

4. "CORS Error"

Причина: Frontend не может обратиться к backend
Решение: Настроить CORS в backend

FastAPI пример:
from fastapi.middleware.cors import CORSMiddleware

app.add_middleware(
    CORSMiddleware,
    allow_origins=["https://example.com"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

5. "Amount must be positive"

Причина: Сумма передана в неправильном формате
Решение: Умножить на 100 (99.99 -> 9999)

Инструменты для отладки

# 1. Curl для тестирования API
curl -X POST http://localhost:8000/api/payments \
  -H "Content-Type: application/json" \
  -d '{
    "amount": 9999,
    "currency": "RUB",
    "token": "tok_visa",
    "description": "Test payment"
  }'

# 2. Stripe CLI для локального тестирования
stripe listen --forward-to localhost:8000/webhook

# 3. Postman для интерактивного тестирования
# Создайте коллекцию с запросами платежа

# 4. Логирование
logger.info(f"Payment processing: {payment}")
logger.error(f"Payment error: {error}")

Чеклист отладки платежей

[ ] Проверены логи Frontend (Console)
[ ] Проверены запросы в Network tab
[ ] Валидирована сумма (в копейках)
[ ] Получен правильный токен
[ ] CORS настроен
[ ] API ключ установлен
[ ] Логи на сервере проверены
[ ] Платёжный провайдер проверен
[ ] Ошибка с провайдера обработана
[ ] Пользователю показано понятное сообщение об ошибке

Выводы

Отладка платежей требует системного подхода:

  1. Frontend -> Network -> Backend -> Payment Provider
  2. Логируйте на каждом этапе
  3. Проверяйте формат данных (особенно сумму)
  4. Читайте официальную документацию провайдера
  5. Используйте test mode платёжных систем
  6. Всегда показывайте пользователю понятное сообщение об ошибке