Kembali ke Blog
    Web Development
    Next.js
    Payment Gateway

    Tutorial Integrasi Xendit Payment Gateway ke Website Next.js Custom Indonesia

    12 menit baca6 Oktober 2026KayFreyTech Editorial Team

    Integrasi Xendit ke website Next.js custom dilakukan dengan memanggil Xendit Invoice API dari Route Handler (API Route), mengarahkan pelanggan ke halaman pembayaran Xendit, lalu menerima konfirmasi via webhook. Proses ini bisa selesai dalam satu hari kerja dengan API key sandbox, sebelum go-live ke production.

    Key Takeaways

    • Xendit mendukung 20+ metode pembayaran Indonesia: transfer bank, e-wallet (OVO, GoPay, DANA, ShopeePay), kartu kredit, QRIS, dan retail outlet
    • API key Xendit terdiri dari dua jenis: Secret Key (server-side only) dan Public Key — jangan pernah expose Secret Key di client/browser
    • Webhook wajib dikonfigurasi untuk menerima notifikasi pembayaran berhasil secara real-time dari Xendit
    • Untuk verifikasi keabsahan webhook, selalu validasi header x-callback-token yang dikirim Xendit
    • Xendit SDK Node.js tersedia dan menyederhanakan integrasi — tidak perlu raw HTTP request

    Mengapa Xendit Jadi Pilihan Utama Payment Gateway untuk Website Custom Indonesia

    Dari pengalaman kami membangun 30+ website custom untuk bisnis Indonesia sejak 2023, pilihan payment gateway berdampak langsung pada konversi, waktu rekonsiliasi keuangan, dan beban maintenance jangka panjang. Xendit secara konsisten menjadi pilihan kami untuk website Next.js karena tiga alasan utama.

    Pertama, dokumentasi API yang komprehensif dan SDK Node.js yang terawat. Dibandingkan provider lain, dokumentasi Xendit jarang outdated dan SDK-nya kompatibel dengan environment Next.js App Router maupun Pages Router. Ini secara nyata mempersingkat waktu implementasi — dari yang biasanya 3–5 hari menjadi 1–2 hari untuk integrasi dasar.

    Kedua, cakupan metode pembayaran yang relevan untuk pasar Indonesia. Menurut perbandingan payment gateway Indonesia yang dipublikasikan Albatech, Xendit mendukung virtual account semua bank besar (BCA, Mandiri, BNI, BRI), seluruh e-wallet utama, QRIS, dan kartu kredit/debit Visa/Mastercard dalam satu integrasi API — tidak perlu multi-provider. Lihat perbandingan lengkap Midtrans vs Xendit vs DOKU di sini.

    Ketiga, model pricing tanpa biaya setup. Xendit tidak memungut biaya bulanan — hanya komisi per transaksi berhasil. Ini ideal untuk startup dan UMKM yang belum memiliki volume transaksi besar, karena tidak ada fixed cost yang memberatkan.

    20+
    Metode pembayaran
    1–2 hari
    Waktu integrasi dasar
    Gratis
    Biaya setup

    Persiapan: Setup Akun Xendit dan Konfigurasi Proyek Next.js

    1. Daftar Akun Xendit dan Dapatkan API Key

    Daftar di dashboard.xendit.co dan lengkapi data bisnis Anda. Untuk mulai development, Anda tidak perlu menunggu verifikasi selesai — API key sandbox tersedia langsung setelah registrasi. Di dashboard, navigasi ke Settings → API Keys. Anda akan mendapatkan dua kunci:

    • •Secret Key (prefix xnd_development_ atau xnd_production_) — hanya untuk server-side
    • •Public Key — untuk operasi client-side seperti tokenisasi kartu kredit

    Peringatan keamanan: Secret Key TIDAK BOLEH ada di kode client-side (komponen React, browser), di-commit ke repository, atau di-log di console. Simpan hanya di environment variable server-side.

    2. Install Xendit SDK dan Konfigurasi Environment

    Install package SDK resmi Xendit untuk Node.js:

    npm install xendit-node

    Tambahkan API key ke file .env.local:

    XENDIT_SECRET_KEY=xnd_development_XXXXXXXXXXXXXXXXXX
    XENDIT_WEBHOOK_TOKEN=token-verifikasi-webhook-anda
    NEXT_PUBLIC_BASE_URL=http://localhost:3000

    Pastikan XENDIT_SECRET_KEY tanpa prefix NEXT_PUBLIC_ — variabel dengan prefix tersebut akan diekspos ke browser oleh Next.js.

    Implementasi Xendit di Next.js: Dari Invoice Hingga Konfirmasi Pembayaran

    Berikut adalah alur implementasi yang kami pakai di setiap proyek e-commerce dan website custom dengan fitur pembayaran. Stack ini sudah diuji di production dengan beban ratusan transaksi per hari.

    Buat API Route untuk Generate Invoice

    Buat file app/api/create-payment/route.ts(App Router) atau pages/api/create-payment.ts(Pages Router):

    // app/api/create-payment/route.ts
    import { NextRequest, NextResponse } from 'next/server';
    import Xendit from 'xendit-node';
    
    const xendit = new Xendit({ secretKey: process.env.XENDIT_SECRET_KEY! });
    const { Invoice } = xendit;
    
    export async function POST(req: NextRequest) {
      const { orderId, amount, customerEmail, description } = await req.json();
    
      const invoice = await Invoice.createInvoice({
        externalID: orderId,
        amount,
        description,
        payerEmail: customerEmail,
        successRedirectURL: `${process.env.NEXT_PUBLIC_BASE_URL}/pembayaran/sukses`,
        failureRedirectURL: `${process.env.NEXT_PUBLIC_BASE_URL}/pembayaran/gagal`,
        currency: 'IDR',
      });
    
      return NextResponse.json({ invoiceUrl: invoice.invoiceUrl, invoiceId: invoice.id });
    }

    Konfigurasi Webhook untuk Konfirmasi Pembayaran

    Xendit mengirim notifikasi real-time ke endpoint webhook Anda setiap kali status pembayaran berubah. Buat handler di app/api/xendit-webhook/route.ts:

    // app/api/xendit-webhook/route.ts
    import { NextRequest, NextResponse } from 'next/server';
    
    export async function POST(req: NextRequest) {
      // Validasi webhook token dari Xendit
      const callbackToken = req.headers.get('x-callback-token');
      if (callbackToken !== process.env.XENDIT_WEBHOOK_TOKEN) {
        return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
      }
    
      const payload = await req.json();
    
      if (payload.status === 'PAID') {
        const orderId = payload.external_id;
        // Update status order di database Anda
        await updateOrderStatus(orderId, 'paid');
        // Kirim email konfirmasi ke pelanggan, trigger fulfillment, dll.
      }
    
      return NextResponse.json({ received: true });
    }

    Daftarkan URL webhook di dashboard Xendit: Settings → Webhooks → Invoice Paid. Format URL: https://yourdomain.com/api/xendit-webhook

    Trigger Pembayaran dari Komponen React

    Di sisi client, panggil API Route untuk mendapatkan URL invoice, lalu arahkan pelanggan ke halaman pembayaran Xendit:

    // Contoh handler tombol "Bayar Sekarang"
    const handleCheckout = async () => {
      const res = await fetch('/api/create-payment', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({
          orderId: `ORDER-${Date.now()}`,
          amount: totalHarga,
          customerEmail: email,
          description: 'Pembelian produk XYZ',
        }),
      });
    
      const { invoiceUrl } = await res.json();
      window.location.href = invoiceUrl; // redirect ke halaman bayar Xendit
    };

    Metode Pembayaran Xendit yang Tersedia dan Rekomendasi untuk Bisnis Indonesia

    Xendit secara default mengaktifkan semua metode pembayaran di halaman invoice yang di-generate. Anda bisa membatasinya via parameter paymentMethods jika ingin mengontrol opsi yang tersedia untuk use case tertentu.

    Virtual Account (Recommended)

    BCA, Mandiri, BNI, BRI, Permata, BSI, CIMB

    Konversi tertinggi di Indonesia — familier untuk semua segmen usia

    E-Wallet

    OVO, GoPay, DANA, ShopeePay, LinkAja

    Ideal untuk segmen 18–35 tahun, mobile-first

    QRIS

    Semua dompet digital yang mendukung QRIS

    Satu QR code untuk semua provider — sangat praktis

    Kartu Kredit/Debit

    Visa, Mastercard, JCB

    Mendukung cicilan 0% dengan bank tertentu

    Untuk bisnis yang menarget segmen B2B atau klien korporat, pertimbangkan juga mengaktifkan Batch Disbursement API Xendit untuk pengeluaran massal (cashback, refund, payroll). Ini yang membedakan Xendit dari sekadar payment gateway menjadi platform keuangan lengkap.

    Tips Keamanan dan Best Practice untuk Production

    Dari audit keamanan yang kami lakukan pada 10+ website klien dengan integrasi payment Indonesia, mayoritas celah keamanan bukan dari Xendit-nya, melainkan dari cara implementasi di sisi developer. Berikut hal-hal yang wajib diperhatikan.

    Selalu validasi jumlah di server, bukan dari client

    Jangan percaya nilai amount yang dikirim dari browser. Selalu hitung ulang total harga di server berdasarkan ID produk dan kuantitas yang diambil dari database — bukan dari payload request. Pola umum yang salah: client kirim { amount: 1000 } → server langsung pakai nilai itu. Penyerang bisa mengirim amount = 1 untuk membayar produk Rp 500.000.

    Validasi x-callback-token di setiap webhook

    Siapapun bisa mengirim POST request ke endpoint webhook Anda dengan payload palsu yang mengklaim pembayaran berhasil. Header x-callback-token yang dikirim Xendit harus selalu diverifikasi — nilainya ada di dashboard Xendit dan harus disimpan di environment variable server.

    Idempotency: tangani webhook duplikat

    Xendit bisa mengirim webhook yang sama lebih dari sekali jika server Anda tidak merespons HTTP 200 dalam waktu yang ditentukan. Implementasikan idempotency check: simpan invoice_id yang sudah diproses di database, dan skip jika sudah ada. Ini mencegah email konfirmasi dikirim dua kali atau stok dikurangi dua kali.

    Gunakan HTTPS dan test dengan ngrok saat development

    Xendit hanya mengirim webhook ke URL HTTPS. Untuk development lokal, gunakan ngrok: `npx ngrok http 3000`. Salin URL https yang dihasilkan ke dashboard Xendit sebagai webhook URL sementara. Jangan lupa ganti kembali ke URL production sebelum deploy.

    FAQ — Pertanyaan yang Sering Ditanyakan

    Apakah Xendit gratis untuk dipakai di website Next.js?

    Xendit tidak memungut biaya setup atau biaya bulanan. Model biayanya berbasis transaksi: Xendit mengambil persentase dari setiap pembayaran berhasil (umumnya 1,5–2,9% tergantung metode). Untuk volume rendah (< Rp 50 juta/bulan), Xendit sangat terjangkau dibandingkan membangun integrasi payment sendiri. Bandingkan dengan Midtrans yang juga menerapkan model serupa — detailnya bisa dicek di perbandingan resmi provider.

    Apa perbedaan Xendit Invoice API dan Payment Request API?

    Invoice API menghasilkan halaman pembayaran hosted di Xendit (pelanggan diarahkan ke URL xendit.co). Cocok untuk implementasi cepat tanpa perlu desain UI sendiri. Payment Request API (lebih baru) memberikan kontrol penuh: Anda render UI pembayaran sendiri di dalam website, lalu memanggil Xendit API di background. Untuk website custom Next.js dengan desain branded, Payment Request API lebih disarankan agar pengalaman pembayaran terasa seamless.

    Bagaimana cara tes integrasi Xendit tanpa transaksi uang nyata?

    Xendit menyediakan environment sandbox yang terpisah dari production. Gunakan API key dari dashboard Xendit tab "Test Mode". Kartu kredit test: nomor 4000000000000002 (Visa), expired date bebas di masa depan, CVV bebas. Untuk e-wallet: DANA, OVO, dan GoPay sandbox bisa di-trigger via API. Transfer bank virtual account: bayar via simulasi di dashboard Xendit → Settings → Test Payments.

    Apakah Xendit webhook harus menggunakan HTTPS?

    Ya, Xendit hanya mengirim webhook ke URL HTTPS. Selama development lokal, gunakan tools seperti ngrok atau Cloudflare Tunnel untuk mengekspos localhost ke HTTPS. Perintah: `ngrok http 3000` lalu gunakan URL https yang dihasilkan sebagai webhook endpoint di dashboard Xendit. Jangan lupa ganti ke URL production sebelum go-live.

    Seberapa lama proses approval Xendit untuk akun produksi bisnis Indonesia?

    Proses verifikasi Xendit untuk bisnis Indonesia biasanya memakan waktu 1–5 hari kerja tergantung kelengkapan dokumen. Dokumen yang dibutuhkan: KTP pemilik/direktur, NPWP bisnis, SIUP/NIB (jika ada), dan rekening bank atas nama bisnis. Xendit mendukung pengguna perorangan (freelancer/solopreneur) dengan proses verifikasi lebih ringan. Selama menunggu approval, fitur sandbox tetap bisa dipakai untuk development.

    Butuh Bantuan Implementasi Payment Gateway untuk Website Bisnis Anda?

    KayFreyTech menyediakan jasa pembuatan website custom Next.js dengan integrasi payment gateway end-to-end — dari setup Xendit, konfigurasi webhook, manajemen order, hingga dashboard admin untuk rekonsiliasi transaksi. Lebih dari 30 website bisnis Indonesia sudah kami bangun sejak 2023 dengan track record PageSpeed 95+.

    Artikel Terkait

    Chat dengan kami!