parseEnable()'s generic fallback (return true for an unset var) is correct for the payment-method toggles it's shared with, but wrong for a security gate: LOG_EXPOSE_API controlled whether /api/logs*, /openapi.json, and /docs serve anything at all, and previously defaulted to true (open) when the env var was absent, contradicting what .env.example already documented as the safe default. Now explicitly defaults to 'false'. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> |
||
|---|---|---|
| postman | ||
| public | ||
| scripts | ||
| server | ||
| src | ||
| tests | ||
| .env.example | ||
| .gitignore | ||
| README.md | ||
| ecosystem.config.cjs | ||
| eslint.config.js | ||
| index.html | ||
| package-lock.json | ||
| package.json | ||
| postcss.config.cjs | ||
| tailwind.config.ts | ||
| tsconfig.app.json | ||
| tsconfig.json | ||
| tsconfig.node.json | ||
| vite.config.ts | ||
README.md
Midtrans Middleware (CIFO)
Vite + React frontend dan Express backend untuk integrasi pembayaran Midtrans (Core API + Snap) dengan sistem ERP.
Struktur Project
server/ Express backend (single-file: server/index.cjs)
src/ Frontend React (checkout, halaman /pay, dashboard demo)
postman/ Postman collection — seluruh endpoint API
tests/ Script testing manual untuk backend
scripts/ Utility script (mis. fetch-logos.mjs)
Setup
- Duplikasi file contoh env dan isi nilainya:
cp .env.example .env
Isi .env sesuai kebutuhan — lihat .env.example untuk daftar lengkap variabel beserta penjelasannya (Midtrans key, EXTERNAL_API_KEY, PAYMENT_LINK_SECRET, LOG_BASIC_AUTH_USER/PASS, dll). Generate secret yang kuat dengan:
node -e "console.log(require('crypto').randomBytes(32).toString('base64url'))"
- Install dependencies:
npm install
- Jalankan backend dan frontend (dua terminal terpisah):
npm run server # backend Express, default http://localhost:8000
npm run dev # frontend Vite, default http://localhost:5173
API Backend
Dokumentasi lengkap seluruh endpoint ada di dua tempat:
- Interaktif (Scalar) — buka
http://localhost:8000/docsdi browser (dilindungi HTTP Basic Auth, kredensial sama dengan/api/logs*, lihatLOG_BASIC_AUTH_USER/LOG_BASIC_AUTH_PASS). Spec mentah tersedia di/openapi.json. - Postman — import
postman/Midtrans-Middleware.postman_collection.json, sudah berisi seluruh route (payment link, charge, snap token, webhook, logs, dev/test endpoints) dikelompokkan per folder.
Detail arsitektur & alur pembayaran ada di server/README.md.
Alat Bantu Operasional
- Log viewer —
http://localhost:8000/api/logs/view(dilindungi Basic Auth). Bisa filter per level, cari teks/order_id, dan klik nilai apa pun untuk trace lintas baris log yang berkaitan. Log otomatis dihapus setelahLOG_RETENTION_DAYS(default 30 hari). - Payment link dibuat lewat
POST /api/payment-links(payload langsungorder_id/nominal/customer/expire_at) atauPOST /createtransaksi(payload ERPmercant_id/item[]).
Catatan Integrasi Midtrans
- Client Key hanya digunakan di frontend (mis. tokenisasi kartu/3DS, Snap.js). Server Key tidak pernah dikirim ke frontend.
- Order pembayaran punya dua alur: (1) link yang dibagikan ke pelanggan (dibuat lewat
/createtransaksiatau/api/payment-links, di-resolve oleh halaman/pay/:token), dan (2) checkout langsung dari browser (/api/payments/charge,/api/payments/snap/token) tanpa pra-registrasi — keduanya diberi rate limit untuk mencegah abuse. order_idyang mengandung karakter selain alfanumerik/- _ ~ .(mis.:) otomatis disanitasi jadi.sebelum dikirim ke Midtrans.- Status real-time dapat diimplementasikan via polling (TanStack Query) atau webhook (
POST /api/payments/notification) yang meneruskan notifikasi ke ERP.
Struktur Env di Kode Frontend
Akses env melalui modul src/lib/env.ts:
Env.API_BASE_URLEnv.MIDTRANS_CLIENT_KEYEnv.MIDTRANS_ENV
Lisensi
Internal project — CIFO Group.