System Design
Case Study: Payment System
**Stripe:** - Fees: 2.9% + $0.30 (US) - Best for: developers, startups - Features: excellent API, docs **PayPal:** - Fees: 2.9% + $0.30 - Best for: buyer trust - Features: buyer protection **Adyen:** - Fees: IC++ (interchange plus) - Best for: enterprise, global - Features: unified platform **Square:** - Fees: 2.6% + 0.10 - Best for: omnichannel (online + POS)
**Visa:** - Standard: < 0.9% and < 100 disputes/month - Early Warning: 0.9-1.8% - Excessive: > 1.8% - Penalty: $25K-$50K/month + monitoring **Mastercard:** - Excessive Chargeback Program: > 1.5% - Penalty: fines + potential termination **Target**: Keep chargeback rate < 0.5%
EU PSD2 requires SCA for online payments: - Two of three factors required: 1. Something you know (password, PIN) 2. Something you have (phone, card) 3. Something you are (fingerprint, face) - 3D Secure 2.0 satisfies SCA - Reduces fraud and chargebacks - Exemptions: < €30, recurring, low risk
Архитектура Payment System
Архитектура Payment System
Зачем это нужно?
Платежи - критическая часть любого e-commerce. Ошибки стоят реальных денег и репутации. Правильная архитектура обеспечивает надёжность, безопасность и compliance.
Что это такое?
Payment system включает: checkout flow, PSP (Payment Service Provider) интеграции, order management, ledger для учёта транзакций, и reconciliation. Ключевые требования: exactly-once semantics и PCI DSS compliance.
Как это работает?
Пример
**Payment flow с двухфазным capture:** ```typescript // Step 1: Authorize (reserve funds) const payment = await paymentService.authorize({ orderId: 'order_123', amount: { amount: 9999, currency: 'USD' }, // 99.99 paymentMethod: { type: 'card', token: 'tok_xxx' } }); // payment.status = 'authorized' // Funds reserved on customer's card // Step 2: Capture (charge) after fulfillment ready await paymentService.capture(payment.id); // payment.status = 'captured' // Money transferred // OR: Cancel if out of stock await paymentService.cancel(payment.id); // payment.status = 'cancelled' // Reservation released ```
Что вы узнали о Архитектура Payment System?
PCI DSS Compliance
PCI DSS Compliance
Зачем это нужно?
PCI DSS (Payment Card Industry Data Security Standard) - обязательные требования для всех, кто обрабатывает карточные данные. Нарушение ведёт к штрафам до 500K/месяц и запрету на приём карт.
Что это такое?
PCI DSS имеет 4 уровня compliance в зависимости от объёма транзакций. Основной принцип: минимизировать scope - не хранить и не обрабатывать полные карточные данные. Использовать токенизацию через PSP.
Как это работает?
Пример
**PCI DSS requirements summary:** ``` 12 Requirements: 1. Install/maintain firewall 2. No vendor-supplied default passwords 3. Protect stored cardholder data 4. Encrypt transmission over networks 5. Use/update anti-virus 6. Develop secure systems 7. Restrict access to cardholder data 8. Assign unique IDs to users 9. Restrict physical access 10. Track/monitor network access 11. Regularly test security 12. Maintain security policy With tokenization (SAQ-A): → Only #12 applies fully → Minimal infrastructure requirements → Annual self-questionnaire (~20 questions) ```
Что вы узнали о PCI DSS Compliance?
Idempotency: Предотвращение Дублирования
Idempotency: Предотвращение Дублирования
Зачем это нужно?
Сетевые ошибки, таймауты и ретраи могут привести к дублированию платежей. Клиент нажал 'Pay' дважды, или retry после timeout - и списали дважды. Это недопустимо.
Что это такое?
Idempotency key - уникальный идентификатор запроса. При повторном запросе с тем же ключом возвращается результат предыдущего, а не создаётся новый платёж. Ключ генерируется клиентом.
Как это работает?
Пример
**Stripe's idempotency implementation:** ```typescript // Stripe automatically handles idempotency const stripe = new Stripe(apiKey); // Same idempotency key = same result const payment1 = await stripe.paymentIntents.create( { amount: 1000, currency: 'usd', ... }, { idempotencyKey: 'order_123_attempt_1' } ); // Retry with same key returns cached result const payment2 = await stripe.paymentIntents.create( { amount: 1000, currency: 'usd', ... }, { idempotencyKey: 'order_123_attempt_1' } ); // payment1.id === payment2.id (same payment) ```
Что вы узнали о Idempotency: Предотвращение Дублирования?
Ledger и Reconciliation
Ledger и Reconciliation
Зачем это нужно?
Финансовый учёт требует точности до копейки. Ledger обеспечивает double-entry bookkeeping - каждая транзакция отражается минимум в двух счетах. Reconciliation сверяет данные с PSP для обнаружения расхождений.
Что это такое?
Double-entry ledger: дебит одного счёта = кредит другого. Reconciliation: ежедневная сверка транзакций между вашей системой, PSP и банком. Расхождения требуют расследования.
Как это работает?
Пример
**Daily reconciliation report:** ``` Reconciliation Report - 2024-01-15 ────────────────────────────────── Transactions processed: 1,234 Matched: 1,230 (99.7%) Unmatched: 4 Discrepancies: 2 Unmatched Internal → Stripe: • pay_abc123: $99.00 - No Stripe record (pending?) Unmatched Stripe → Internal: • ch_xyz789: $50.00 - Missing internal record • ch_def456: $25.00 - Missing internal record Amount Discrepancies: • pay_ghi012: Internal $100.00, Stripe $99.97 (diff: $0.03) Likely cause: Currency conversion rounding Status: NEEDS REVIEW Assigned to: finance-team@company.com ```
Что вы узнали о Ledger и Reconciliation?
Refunds и Chargebacks
Refunds и Chargebacks
Зачем это нужно?
Refunds - часть нормального бизнеса. Chargebacks (disputes) - когда клиент оспаривает транзакцию через банк. Высокий chargeback rate (> 1%) ведёт к штрафам и потере возможности принимать карты.
Что это такое?
Refunds инициируются продавцом и всегда успешны. Chargebacks инициируются клиентом через банк - продавец может оспорить, предоставив доказательства. Проигранный dispute = потеря денег + штраф.
Как это работает?
Пример
**Chargeback prevention tips:** ```typescript // 1. Clear billing descriptor // Customer sees "MYSTORE" not "STRIPE*ABCD123" await stripe.paymentIntents.create({ amount: 1000, currency: 'usd', statement_descriptor: 'MYSTORE ORDER', statement_descriptor_suffix: '1234' // Order ID }); // 2. Send order confirmation immediately await sendEmail(customer.email, { subject: 'Order Confirmed - MyStore', body: `Thank you! Your order #${order.id} for $${order.total}...` }); // 3. Proactive communication on shipping await sendEmail(customer.email, { subject: 'Your order has shipped!', body: `Track your package: ${trackingUrl}` }); // 4. Easy refund process // Better to refund than get chargeback // Chargeback = 15-25 fee + counts toward rate ```
Что вы узнали о Refunds и Chargebacks?