Files
vmall/apps/api/migrations/0025_checkout_request_header_hash.sql
Chengdong Zhang a7cd392bd4 feat(payments): configurable checkout payments — wallet + Stripe crypto, original-method refunds (add-configurable-payments)
- payment domain: payments/memberships/attempts/receipts/refunds/commands/events, legacy-demo provenance (0024), checkout header-hash idempotency (0025)
- wallet collection all-or-none across shop orders; group-wide cancellation; checkout cutover, status-only payOrder removed
- Stripe crypto-only Checkout adapter, raw-body HMAC webhooks, durable command worker with leases
- original-method refunds with receipt/allocation budgets; refund_pending/refund_failed aftersale states
- admin channel CRUD/revisions/audit/verify + operations list/detail/reconcile; secret-ref allowlist (VMALL_PAYMENT_*), env-fixed demo/sandbox/live
- mall/mobile checkout pay surfaces, admin console pages; shared contract updated
- pre-launch leftovers recorded in docs/TBD-payments.md

cargo test -p vmall-api green twice; four frontend builds green; browser smoke: mall wallet checkout paid, admin channels/operations verified
2026-10-15 16:14:28 +08:00

11 lines
582 B
SQL

-- Owner-scoped checkout idempotency needs a stable comparison even when the
-- caller has already cleared their cart between requests. The full request
-- hash covers the cart snapshot, which differs on an empty cart; the header
-- hash is the same input minus the cart so a legitimate replay (cart cleared)
-- still matches while a different currency/address/group intent is rejected
-- as 409. Existing rows default to an empty header hash and continue to
-- allow legacy replay until upgraded.
ALTER TABLE checkout_requests
ADD COLUMN header_hash TEXT NOT NULL DEFAULT '';