Skip to content

About

๐Ÿ’ณ Hono + Vercel + Turso DB ๊ธฐ๋ฐ˜ ๊ตญ๋‚ด PG๋ง(PortOne) ๋ฐ ๊ธ€๋กœ๋ฒŒ PayPal ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๊ฒฐ์ œ API ์ฝ”์–ด ๋ฐฑ์—”๋“œ.

Resources

Stars

5 stars

Watchers

0 watching

Forks

Latest commit

ย 

History

25 Commits

Folders and files

NameName
Last commit message
Last commit date
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿ’ณ payment-backend (๊ตญ๋‚ด PG๋ง ๋ฐ ๊ธ€๋กœ๋ฒŒ PayPal ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๊ฒฐ์ œ ์ฝ”์–ด)

์šด์˜ API: payment-backend-tan.vercel.app

์›น ๋žœ๋”ฉ ํŽ˜์ด์ง€ ์—†์ด API ๊ฒฝ๋กœ๋กœ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค. ์ƒํƒœ ํ™•์ธ์€ ํ—ˆ์šฉ๋œ Origin์„ ํฌํ•จํ•ด ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

curl -H "Origin: https://ai-ing.org" https://payment-backend-tan.vercel.app/api/v1/health

License: MIT Hono PortOne PayPal

Hono + Vercel Serverless + Turso DB ํ™˜๊ฒฝ ์œ„์— ๊ตฌ์ถ•๋œ ๋Œ€ํ•œ๋ฏผ๊ตญ PG์‚ฌ(ํ† ์ŠคํŽ˜์ด๋จผ์ธ , ์นด์นด์˜คํŽ˜์ด, ์นด๋“œ ๋“ฑ) ์—ฐ๋™์„ ์œ„ํ•œ PortOne V2 ์–ด๋Œ‘ํ„ฐ ๋ฐ ํ•ด์™ธ ๊ฒฐ์ œ๋ฅผ ์œ„ํ•œ PayPal Checkout ํ†ตํ•ฉ ๊ฒฐ์ œ API ์ฝ”์–ด ๋ฐฑ์—”๋“œ์ž…๋‹ˆ๋‹ค.


๐Ÿ—๏ธ ์•„ํ‚คํ…์ฒ˜ ๋ฐ ๋„๋ฉ”์ธ ๋ชจ๋ธ

๊ฒฐ์ œ์˜ ์‹ ๋ขฐ์„ฑ ํ™•๋ณด ๋ฐ ์ •๋ฐ€ ์ •์‚ฐ/๊ฐ์‚ฌ๋ฅผ ์œ„ํ•ด ์•„๋ž˜์™€ ๊ฐ™์€ ํ‘œ์ค€ ํšŒ๊ณ„์›์žฅ(Ledger) ๋ฐ ์ค‘๋ณต์š”์ฒญ๋ฐฉ์ง€(Idempotency) ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

flowchart LR
    Order["Order\n์ฃผ๋ฌธ/๊ฒฐ์ œ ์˜๋„ ์˜๋ขฐ"]
    Payment["PaymentAttempt\nPG์‚ฌ/๊ฒฐ์ œ ์ˆ˜๋‹จ ์‹œ๋„ ์ด๋ ฅ"]
    ProviderEvent["ProviderEvent\nPG/PayPal ์™ธ๋ถ€ ์ƒํƒœ ๋กœ๊ทธ"]
    Settlement["SettlementRecord\n์ˆ˜์ˆ˜๋ฃŒ/์ˆœ์•ก/์ง€๊ธ‰ ์ •์‚ฐ"]
    Ledger["LedgerEntry\nํšŒ๊ณ„ ์›์žฅ ๋ณต์‹ ๋ถ€๊ธฐ ๊ธฐ์ž…"]
    Audit["AuditLog\n์ƒํƒœ ์ „์ด ๋ฐ ํ–‰์œ„ ์ด๋ ฅ"]
    Idem["IdempotencyRecord\n์ค‘๋ณต ํŠธ๋žœ์žญ์…˜ ๋ฐฉ์ง€"]

    Order --> Payment
    Payment --> ProviderEvent
    ProviderEvent --> Settlement
    Settlement --> Ledger
    Order --> Audit
    Payment --> Audit
    Idem -. protects .-> Order
    Idem -. protects .-> Payment
Loading

ํ…Œ์ด๋ธ” ์„ค๊ณ„ ์š”์•ฝ

  • orders: ์ฃผ๋ฌธ ํ˜น์€ ๊ธฐ๋ถ€ ์š”์ฒญ ์˜๋„. ์ฃผ๋ฌธ๊ธˆ์•ก, ํ†ตํ™”(KRW, USD ๋“ฑ), ํ˜„์žฌ ์ƒํƒœ ์ €์žฅ.
  • payment_attempts: ๊ฒฐ์ œ์‚ฌ(PortOne ๋˜๋Š” PayPal) ๊ฑฐ๋ž˜ ๊ณ ์œ  ์‹๋ณ„์ž์™€ ์—ฐ๊ฒฐ๋œ ์‹ค์ œ ๊ฒฐ์ œ ์Šน์ธ/์‹œ๋„ ๊ธฐ๋ก.
  • provider_events: PG/PayPal๋กœ๋ถ€ํ„ฐ ์ˆ˜์‹ ๋œ Webhook ์›๋ณธ ๋ฐ API ์‘๋‹ต ์ƒ์„ธ ํŽ˜์ด๋กœ๋“œ ๋ณด๊ด€.
  • settlement_records: ๊ฒฐ์ œ ๋Œ€ํ–‰ ์ˆ˜์ˆ˜๋ฃŒ(Fee), ๋งค์ถœ ์ˆœ์•ก(Net) ๋ฐ ์ •์‚ฐ(Payout) ๋Œ€๊ธฐ ๊ด€๋ฆฌ.
  • ledger_entries: ๊ฑฐ๋ž˜๋ณ„ ์ฐจ๋ณ€(Debit)/๋Œ€๋ณ€(Credit) ํšŒ๊ณ„ ์›์žฅ ๊ธฐ๋ก.
  • idempotency_records: ์ค‘๋ณต ๊ฒฐ์ œ ์‹œ๋„ ๋ฐ ๋„คํŠธ์›Œํฌ ์žฌ์š”์ฒญ ์˜ค๋ฅ˜ ๋ฐฉ์ง€์šฉ ํ‚ค ๊ฒ€์ฆ ํ…Œ์ด๋ธ”.

๐Ÿ”„ ๊ฒฐ์ œ ์ฒ˜๋ฆฌ ํŒŒ์ดํ”„๋ผ์ธ

1. ๊ตญ๋‚ด PG ์—ฐ๋™ (PortOne V2)

๊ตญ๋‚ด ์‹ ์šฉ์นด๋“œ, ์นด์นด์˜คํŽ˜์ด, ํ† ์ŠคํŽ˜์ด ๋“ฑ์€ PortOne SDK๋ฅผ ํ†ตํ•ด ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ๊ฒฐ์ œ์ฐฝ์„ ํ˜ธ์ถœํ•œ ๋’ค ๋ฐฑ์—”๋“œ์—์„œ ๊ฒ€์ฆ ๋ฐ ์ •์‚ฐ์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

sequenceDiagram
    participant User as ์‚ฌ์šฉ์ž
    participant Front as ํ”„๋ก ํŠธ์—”๋“œ (React)
    participant Back as ๋ฐฑ์—”๋“œ (Hono)
    participant DB as ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (Turso)
    participant PG as PortOne / PG์‚ฌ

    User->>Front: ๊ฒฐ์ œ/๊ธฐ๋ถ€ ๊ธˆ์•ก ์ž…๋ ฅ
    Front->>Back: POST /api/v1/orders (์ฃผ๋ฌธ ์ƒ์„ฑ)
    Back->>DB: orders + idempotency ์ƒ์„ฑ
    Back-->>Front: orderId ๋ฐ˜ํ™˜
    Front->>PG: PortOne.requestPayment() ํ˜ธ์ถœ (PG์ฐฝ ํ™œ์„ฑํ™”)
    User->>PG: ์ธ์ฆ ๋ฐ ๊ฒฐ์ œ ์Šน์ธ ์™„๋ฃŒ
    PG-->>Front: ๊ฒฐ์ œ ์„ฑ๊ณต ์‘๋‹ต (paymentId, txId ๋ฐ˜ํ™˜)
    Front->>Back: POST /api/v1/orders/{orderId}/payment-attempts/portone (์Šน์ธ ์‚ฌ์‹ค ์ „๋‹ฌ)
    Back->>DB: payment_attempts ๊ธฐ๋ก ๋ฐ orders ์ƒํƒœ 'PAID'๋กœ ์—…๋ฐ์ดํŠธ
    Back->>DB: ์ •์‚ฐ ๊ธฐ๋ก(settlement_records) & ํšŒ๊ณ„ ์›์žฅ(ledger_entries) ๊ธฐ์ž…
    Back-->>Front: ์ฒ˜๋ฆฌ ์™„๋ฃŒ ์‘๋‹ต
    Front-->>User: ๊ฒฐ์ œ ์™„๋ฃŒ ํŽ˜์ด์ง€ ํ‘œ์‹œ
Loading

2. ๊ธ€๋กœ๋ฒŒ ํ•ด์™ธ ๊ฒฐ์ œ (PayPal)

ํ•ด์™ธ ์นด๋“œ๋Š” PayPal Orders/Capture API ๋ฐ Webhook ๋ฐฑ์Šคํ†ฑ ๊ฒ€์ฆ์„ ๋ฐ”ํƒ•์œผ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

sequenceDiagram
    participant User as ์‚ฌ์šฉ์ž
    participant Front as ํ”„๋ก ํŠธ์—”๋“œ (React)
    participant Back as ๋ฐฑ์—”๋“œ (Hono)
    participant DB as ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (Turso)
    participant PP as PayPal API

    User->>Front: ๊ฒฐ์ œ/๊ธฐ๋ถ€ ์ •๋ณด ์ž…๋ ฅ
    Front->>Back: POST /api/v1/orders
    Back-->>Front: orderId
    Front->>Back: POST /api/v1/orders/{orderId}/payment-attempts/paypal
    Back->>PP: /v2/checkout/orders (์ฃผ๋ฌธ ์ƒ์„ฑ ์š”์ฒญ)
    PP-->>Back: PayPal Order ID + approveUrl ๋ฐ˜ํ™˜
    Back-->>Front: redirectUrl (approveUrl) ์ „๋‹ฌ
    Front->>User: PayPal ๋กœ๊ทธ์ธ/์ฒดํฌ์•„์›ƒ ํŽ˜์ด์ง€๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ
    User->>PP: ๊ฒฐ์ œ ์Šน์ธ
    PP-->>Back: ๋ฆฌํ„ด URL ํ˜ธ์ถœ (GET /paypal/return?attemptId=...)
    Back->>PP: /orders/{id}/capture (๊ฒฐ์ œ ์บก์ฒ˜ ํ™•์ •)
    Back->>DB: ์ƒํƒœ ์—…๋ฐ์ดํŠธ ๋ฐ ์ •์‚ฐ/์›์žฅ ์ผ๊ด„ ๊ธฐ์ž…
    Back-->>Front: ๊ฒฐ์ œ ์„ฑ๊ณต ํŽ˜์ด์ง€ ์ด๋™
Loading

๐Ÿ› ๏ธ ์ฃผ์š” API ๋ช…์„ธ

1. Public API

  • POST /api/v1/orders : ์‹ ๊ทœ ๊ฒฐ์ œ ์ฃผ๋ฌธ ์ƒ์„ฑ (๋ฉฑ๋“ฑ์„ฑ ํ‚ค ์ œ๊ณต ๊ฐ€๋Šฅ)
  • POST /api/v1/orders/:orderId/payment-attempts/portone : PortOne PG์‚ฌ ๊ฒฐ์ œ ์Šน์ธ ๋‚ด์—ญ ์—ฐ๋™ ๋ฐ ์›์žฅ ๊ธฐ์ž…
  • POST /api/v1/orders/:orderId/payment-attempts/paypal : PayPal ๊ฒฐ์ œ ์Šน์ธ ์š”์ฒญ ๋ฐœ์†ก
  • GET /paypal/return : PayPal ์Šน์ธ ํ›„ ์บก์ฒ˜ ์ฝœ๋ฐฑ ๊ฒฝ๋กœ
  • POST /api/v1/webhooks/paypal : PayPal ์ •์‚ฐ ๋ฐ์ดํ„ฐ ์‹ฑํฌ ๋ฐ ๋ฐฑ์Šคํ†ฑ ์›นํ›…
  • GET /api/v1/orders/:orderId : ํŠน์ • ์ฃผ๋ฌธ ์ƒ์„ธ ์กฐํšŒ

2. Admin API (X-Admin-Password ๊ฒŒ์ดํŠธ์›จ์ด)

  • GET /api/v1/admin/dashboard : ์ „์ฒด ๊ฑฐ๋ž˜์•ก, ์ˆ˜์ˆ˜๋ฃŒ, ์ˆ˜๋‹จ๋ณ„ ์ ์œ ์œจ ํ†ต๊ณ„ ๋Œ€์‹œ๋ณด๋“œ
  • GET /api/v1/admin/tables : ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ” ๋ชฉ๋ก ๋ฐ˜ํ™˜
  • GET /api/v1/admin/tables/:tableName/rows : ํŠน์ • ํ…Œ์ด๋ธ” ๋ฐ์ดํ„ฐ ์กฐํšŒ (ํŽ˜์ด์ง• ์ง€์›)
  • PATCH /api/v1/admin/tables/:tableName/rows/:rowId : ์ˆ˜๋™ ์ •์‚ฐ ์ƒํƒœ ๋ฐ ๋น„์ •์ƒ ๊ฑฐ๋ž˜ ์ •์ • ์กฐ์น˜

โš™๏ธ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋ฐ ์„ค์ • (.env)

์•„๋ž˜ ๋„๋ฉ”์ธ๊ณผ ์ž๊ฒฉ์ฆ๋ช…์€ ์„ค์ • ์˜ˆ์‹œ์ด๋ฉฐ, ํ˜„์žฌ ์šด์˜ API ์ฃผ์†Œ๋Š” ์œ„ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

FRONTEND_BASE_URL=https://pay.ai-ing.org
PUBLIC_BASE_URL=https://api.pay.ai-ing.org
CORS_ALLOWED_ORIGINS=https://pay.ai-ing.org,https://www.ai-ing.org

# Admin
ADMIN_PASSWORD=your_secure_password

# Database (Turso SQL DB)
TURSO_DATABASE_URL=libsql://your-db-name.turso.io
TURSO_AUTH_TOKEN=your_turso_auth_token

# PayPal
PAYPAL_ENV=sandbox # sandbox or live
PAYPAL_CLIENT_ID=your_paypal_client_id
PAYPAL_CLIENT_SECRET=your_paypal_client_secret
PAYPAL_WEBHOOK_ID=your_paypal_webhook_id

๐Ÿ“„ ๋ผ์ด์„ ์Šค (License)

๋ณธ ๊ฒฐ์ œ ์ฝ”์–ด ๋ฐฑ์—”๋“œ ํ”„๋กœ์ ํŠธ๋Š” **MIT License**์— ์˜๊ฑฐํ•˜์—ฌ ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค.

About

๐Ÿ’ณ Hono + Vercel + Turso DB ๊ธฐ๋ฐ˜ ๊ตญ๋‚ด PG๋ง(PortOne) ๋ฐ ๊ธ€๋กœ๋ฒŒ PayPal ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๊ฒฐ์ œ API ์ฝ”์–ด ๋ฐฑ์—”๋“œ.

Resources

Stars

5 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages