← Назад к вопросам
Где будешь чинить если не работает оплата по тесту?
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 ключ установлен
[ ] Логи на сервере проверены
[ ] Платёжный провайдер проверен
[ ] Ошибка с провайдера обработана
[ ] Пользователю показано понятное сообщение об ошибке
Выводы
Отладка платежей требует системного подхода:
- Frontend -> Network -> Backend -> Payment Provider
- Логируйте на каждом этапе
- Проверяйте формат данных (особенно сумму)
- Читайте официальную документацию провайдера
- Используйте test mode платёжных систем
- Всегда показывайте пользователю понятное сообщение об ошибке