3.7 KiB
3.7 KiB
Integrasi Midtrans Credit Card (Core API + 3DS)
Dokumen ini merangkum integrasi kartu kredit/debit menggunakan Midtrans Core API dan 3DS, sebagaimana diimplementasikan dalam proyek ini.
Prasyarat
- Akun Midtrans Sandbox dengan
Client KeydanServer Key. - Dependensi backend:
express,cors,dotenv,midtrans-clientterpasang. - Dependensi frontend: loader skrip
MidtransNew3dsvia utilmidtrans3ds.ts.
Konfigurasi Environment
-
Frontend (
.env.local):VITE_MIDTRANS_CLIENT_KEY="<client key sandbox>"VITE_MIDTRANS_ENV="sandbox"atauproductionVITE_API_BASE_URL="http://localhost:8000/api"
-
Backend (
.env):MIDTRANS_SERVER_KEY="<server key sandbox>"MIDTRANS_CLIENT_KEY="<client key sandbox>"(opsional, untuk referensi log)MIDTRANS_IS_PRODUCTION=false
Alur Frontend
- Memuat skrip
MidtransNew3dsdinamis viaensureMidtrans3ds()saat mountCardPanel. - Mengambil input pengguna:
card_number,expiry (MM/YY),cvv. - Validasi minimal: panjang nomor kartu (13–19), bulan 01–12, CVV 3–4.
- Tokenisasi kartu:
getCardToken({ card_number, card_exp_month, card_exp_year, card_cvv }). - Mengirim
token_idke backend melaluipostChargedengan payload:
{
"payment_type": "credit_card",
"transaction_details": { "order_id": "<orderId>", "gross_amount": <amount> },
"credit_card": { "token_id": "<tokenId>", "authentication": true, "save_token_id": true|false }
}
- Menangani 3DS: jika respons berisi
redirect_url, panggilauthenticate3ds(redirect_url)(SDK akan mengarahkan ke challenge 3DS dan kembali lagi). - Mengaktifkan tombol "Cek Status Pembayaran" ketika charge sukses (
capture/settlement) atau setelah 3DS dimulai (statelocked).
Alur Backend
-
Endpoint
POST /api/payments/charge- Menggunakan
midtrans-clientCoreApi. - Meneruskan payload dari frontend, memastikan
credit_card.authentication = true. - Mengembalikan respons Midtrans termasuk
transaction_statusdanredirect_urljika 3DS diperlukan.
- Menggunakan
-
Endpoint
GET /api/payments/:orderId/status- Memanggil
core.status(orderId)untuk mendapatkan status terbaru transaksi. - Digunakan oleh UI untuk halaman status pembayaran.
- Memanggil
Menjalankan Proyek
- Backend:
npm run server(default padahttp://localhost:8000). - Frontend:
npm run devlalu bukahttp://localhost:5173(atau port alternatif yang dipilih Vite).
Pastikan VITE_API_BASE_URL menunjuk ke http://localhost:8000/api agar frontend memanggil backend yang tepat.
Catatan Keamanan
- Jangan pernah mengekspos
MIDTRANS_SERVER_KEYdi frontend atau file publik. - Token kartu (
token_id) hanya diproduksi di frontend melaluiMidtransNew3dsdan dikirim ke backend yang memegangserverKey.
Referensi
- Midtrans Docs: Credit Card with 3DS (Core API).
- Contoh:
coreApiSimpleExample.jsuntuk pola panggilan Core API.
Webhook & ERP Callback
- Endpoint webhook Midtrans:
POST /api/payments/webhook(server Express)- Verifikasi
signature_key = sha512(order_id + status_code + gross_amount + MIDTRANS_SERVER_KEY). - Menerima notifikasi status dan menandai sukses untuk
settlement(umum) ataucapturedenganfraud_status=accept(kartu).
- Verifikasi
- ERP Notification (opsional, via env feature flag):
- Konfigurasi
.envbackend:ERP_NOTIFICATION_URL="https://apibackend.erpskrip.id/paymentnotification/"ERP_CLIENT_ID="<dari ERP>"ERP_MERCANT_ID="<dari ERP>"ERP_ENABLE_NOTIF=true
- Payload dikirim saat sukses:
{ "data": { "mercant_id": "<id>", "status_code": "200", "nominal": "<gross_amount>", "client_id": "<id>" }, "signature": "sha512(mercant_id + status_code + nominal + client_id)" }
- Konfigurasi