Чекліст виходу в Production
Чекліст виходу в Production
Від «воно працює локально» до «воно готове для реальних грошей»
Розробники часто недооцінюють різницю між «платіж пройшов у Sandbox» та «система готова до прийому реальних платежів». Перехід у production — це не просто зміна API-ключів. Це комплексна перевірка: технічна, безпекова, операційна та юридична.
Цей чекліст — ваш останній рубіж перед Go-Live.
Блок 1: Конфігурація та середовища
✅ Ключі та секрети
- Production ключі збережено у Secret Manager / Environment Variables, НЕ у коді або
appsettings.json - Sandbox ключі видалено або заблоковано в production оточенні
IsSandbox = falseдля production,trueдля всіх інших оточень- Webhook URL оновлено з ngrok → production domain
✅ Environment конфігурація
ASPNETCORE_ENVIRONMENT = Production- Окремі
appsettings.Development.json/appsettings.Production.json - Retry policy для HTTP-клієнтів налаштовано (Polly)
- Timeout для PSP API-запитів: рекомендовано 30 секунд
// Обов'язковий патерн для безпечного отримання секретів у production
builder.Configuration
.AddEnvironmentVariables()
.AddUserSecrets<Program>(optional: true); // Тільки для Development!
// Перевірка наявності обов'язкових налаштувань
var liqPayKey = builder.Configuration["LiqPay:PrivateKey"]
?? throw new InvalidOperationException(
"LiqPay:PrivateKey is not configured. " +
"Set via environment variable or Secret Manager.");
Блок 2: Безпека
PCI DSS Self-Assessment
Пройдіть SAQ відповідного рівня (для більшості — SAQ-A або SAQ-A-EP) та зберігайте результат. Ряд PSP вимагає підтвердження при укладанні договору.
HTTPS обов'язковий
Усі платіжні endpoints повинні працювати виключно через HTTPS. Додайте:
app.UseHttpsRedirection();
app.UseHsts(); // HTTP Strict Transport Security
CSP заголовки
app.Use(async (context, next) =>
{
context.Response.Headers.Append("Content-Security-Policy",
"default-src 'self'; " +
"script-src 'self' https://static.liqpay.ua https://js.stripe.com; " +
"frame-src https://www.liqpay.ua https://js.stripe.com; " +
"connect-src 'self' https://api.stripe.com");
await next();
});
Rate Limiting на платіжних endpoints
builder.Services.AddRateLimiter(opts =>
{
opts.AddFixedWindowLimiter("payments", o =>
{
o.PermitLimit = 10;
o.Window = TimeSpan.FromMinutes(1);
o.QueueLimit = 0;
});
});
// Застосовуємо до платіжних endpoints
group.RequireRateLimiting("payments");
Перевірка підписів webhook налаштована для всіх PSP
Переконайтесь, що верифікація підпису активна для LiqPay (SHA1), Monobank (ECDSA) та Stripe (HMAC-SHA256) у production конфігурації.
Блок 3: Логування та моніторинг
Що потрібно логувати:
// Логуємо бізнес-події (без PII та даних картки)
_logger.LogInformation(
"Payment {PaymentId} created. Provider: {Provider}, Amount: {Amount} {Currency}",
payment.Id, payment.Provider, payment.Amount, payment.Currency);
_logger.LogWarning(
"Payment {PaymentId} failed. ProviderError: {Error}",
payment.Id, result.ErrorMessage);
// Webhook
_logger.LogInformation(
"Webhook received from {Provider}: event={EventId}, status={Status}",
provider, eventId, status);
Що НЕ потрібно логувати:
- PAN (номер картки) — навіть у замаскованому вигляді без потреби
- CVV/CVC — ніколи
- Токени PSP — лише для debugging з рівнем Trace
- Повний webhook payload — лише з маскуванням чутливих полів
Метрики для моніторингу:
Блок 4: Надійність та відмовостійкість
// Retry policy для PSP HTTP-клієнтів
builder.Services.AddHttpClient<LiqPayClient>()
.AddStandardResilienceHandler(config =>
{
config.Retry.MaxRetryAttempts = 3;
config.Retry.Delay = TimeSpan.FromSeconds(1);
config.TotalRequestTimeout.Timeout = TimeSpan.FromSeconds(30);
config.CircuitBreaker.SamplingDuration = TimeSpan.FromMinutes(1);
});
Graceful degradation: якщо PSP недоступний, відображайте зрозуміле повідомлення («Платіжний сервіс тимчасово недоступний. Спробуйте через кілька хвилин.»), а не generic 500.
Блок 5: Юридична готовність
📄 Договір з PSP
📋 Публічна оферта
🔒 Політика конфіденційності
🧾 Фіскалізація
20-пунктовий Go-Live Checklist
Технічна готовність
□ 1. Production API ключі налаштовані через env variables
□ 2. Sandbox флаг IsSandbox = false у production
□ 3. HTTPS + HSTS налаштовано
□ 4. Webhook URL оновлено до production домену
□ 5. Webhook підписи верифікуються для всіх PSP
□ 6. Ідемпотентна обробка webhook реалізована
□ 7. Rate limiting на платіжних endpoints
□ 8. Retry policy для PSP HTTP-клієнтів (Polly)
□ 9. Graceful error handling (ProblemDetails, user-friendly messages)
□ 10. Таймаути на всіх HTTP-запитах до PSP (≤30 секунд)
Безпека
□ 11. PAN, CVV ніде не зберігаються у вашій БД
□ 12. Логи маскують чутливі дані
□ 13. CSP headers налаштовано
□ 14. Пройдено SAQ відповідного рівня
Моніторинг
□ 15. Алерти на payment_success_rate < 80%
□ 16. Алерти на webhook_processing_lag > 30s
□ 17. Логи платіжних подій збираються (ELK/Sentry/Datadog)
Операційна готовність
□ 18. Задокументована процедура повернення коштів (для support team)
□ 19. Тестовий end-to-end платіж у production Sandbox виконано
Юридична готовність
□ 20. Договір з PSP підписано, публічна оферта + конфіденційність розміщені
Корисні посилання
Підсумок модуля
Ви пройшли повний шлях: від розуміння того, що відбувається за лаштунками кожного платежу (чотирьохстороння модель, авторизація → клірінг → розрахунок), до практичної реалізації трьох провайдерів на абстракції IPaymentProvider, глибокого розуміння webhook, підписок та повернень.
Ключові принципи, що залишаться з вами назавжди:
- Не торкайся даних карток — делегуй PSP
- Ідемпотентність — захист від дублювань на всіх рівнях
- Стан-машина — чітка модель переходів між статусами платежу
- Verification через підпис — ніколи не довіряй webhook без перевірки
- Тестуй на кожному рівні — unit, integration, sandbox
Платіжний код вимагає максимальної уваги до деталей. Зате система, що правильно реалізована, стає конкурентною перевагою вашого продукту — надійністю, яку клієнти відчувають кожного разу, коли натискають «Оплатити».
Тестування платіжних інтеграцій
Стратегії тестування платіжної підсистеми — Sandbox режими, тестові картки, unit/integration тести з mock-провайдерами, webhook тестування та CI/CD.
Валідація з FluentValidation в ASP.NET Core
Глибокий огляд FluentValidation: AbstractValidator, ланцюжки правил, кастомна логіка, вкладена валідація та автоматична інтеграція з ASP.NET Core pipeline.