Terima pembayaran

Kasera Pay Checkout

Redirect pembeli ke halaman pembayaran yang kami host dan kelola.

Buat permintaan pembayaran, redirect pembeli ke checkout_url, lalu tunggu webhook-nya. Integrasinya cukup itu — Anda tidak perlu bikin UI pembayaran sama sekali. Request di bawah tidak mengirim object checkout, jadi halamannya pakai default checkout akun Anda; kirim checkout kalau satu pembayaran butuh langkah atau data yang berbeda. checkout_url tetap dikembalikan.

curl https://pay.kasera.id/v1/transactions \
  -H "Authorization: Bearer kp_live_..." \
  -H "Idempotency-Key: order-1234" \
  -H "Content-Type: application/json" \
  -d '{
    "amount": 150000,
    "description": "Kaos komunitas",
    "external_id": "ORD-1234",
    "return_url": "https://toko.example/selesai"
  }'

# 201 — send the buyer to checkout_url:
# { "id": "payreq_9b2f...", "checkout_url": "https://pay.kasera.id/p/xK3f...", ... }

Anda yang menentukan langkahnya

checkout.steps adalah alurnya, berupa array nama langkah. Pembeli melewatinya sesuai urutan yang Anda kirim, dan langkah yang tidak Anda sertakan tidak akan muncul. Semua yang ada di bawah checkout hanya berlaku untuk halaman ini — Direct API tidak punya halaman, jadi semuanya diabaikan.

LangkahPembeliDiatur oleh
customerMengisi formis_name_required, is_email_required, is_phone_required
payment_methodMemilih metode pembayaranpayment_methods
paymentScan QR, salin kode, atau di-redirect ke aplikasinyaTidak ada — selalu terakhir

Default-nya ["customer", "payment_method", "payment"]. Buang customer kalau Anda sudah punya data pembelinya; buang payment_method kalau payment_methods hanya berisi satu kode. Taruh payment_method di depan kalau Anda ingin pembeli memilih cara bayar sebelum mengetik apa pun — urutan di array sama dengan urutan yang dilewati pembeli.

payment selalu terakhir dan tidak bisa dibuang — kalau tidak Anda sertakan, kami yang menambahkannya. Membuang customer padahal ada metode yang butuh field yang belum Anda isi ditolak 422 customer_required saat create, bukan baru ketahuan saat pembeli mentok di tengah jalan.

Tiga alur dari dua field

checkout.steps dan payment_methods bersama-sama menentukan seberapa banyak yang dilakukan pembeli dan seberapa banyak yang sudah Anda tentukan untuk mereka.

checkout.stepsSiapa yang memilihPembeli melihat
["customer", "payment_method", "payment"]PembeliForm → pilih metode → bayar
["payment_method", "payment"]Anda mengisi datanya, pembeli memilih metodenyaPilih metode → bayar
["payment"]Anda yang memilih semuanyaBayar — satu layar

Baris terakhir perlu dibahas, karena banyak yang tidak menyangka halaman hosted bisa begini. Aplikasi Anda sendiri yang menampilkan tombol pembayaran dan menentukan metodenya; kami hanya menampilkan layar metode itu — nomor VA, QR, redirect, form kartu — lengkap dengan instruksi dan countdown-nya. Pilihannya tetap di tangan Anda, tanpa harus bikin empat layar pembayaran.

{
  "amount": 150000,
  "external_id": "ORD-1234",

  "payment_methods": ["va_bca"],
  "customer": { "name": "Budi Santoso" },
  "checkout": { "steps": ["payment"] }
}

Kalau langkah payment_method dibuang, payment_methods harus berisi tepat satu kode. Dua kode tanpa pilihan metode tidak masuk akal — itu ditolak 422 saat create, bukan diam-diam memakai yang pertama, karena memakai yang pertama berarti checkout Anda tidak pernah menawarkan metode kedua tanpa ketahuan.

Langkah customer

Form-nya menanyakan nama, email, dan nomor telepon. Field mana yang muncul ditentukan saat create — oleh object checkout yang Anda kirim, atau, kalau tidak dikirim, oleh setelan metode pembayaran merchant:

FieldMinta denganWajib juga kalau
namecheckout.is_name_requiredVirtual Account ditawarkan
emailcheckout.is_email_requiredKartu ditawarkan
phonecheckout.is_phone_requiredE-wallet ditawarkan

Ada dua hal yang menentukan isi form ini, dan keduanya digabung: apa yang Anda minta, dan apa yang dibutuhkan metode yang ditawarkan. Field yang sudah Anda kirim di customer tidak akan ditanyakan lagi — jadi prefill dan meminta data ke pembeli bukan dua mode berbeda, tapi dua sisi dari aturan yang sama.

{
  "amount": 150000,
  "external_id": "ORD-1234",

  "checkout": {
    "steps": ["customer", "payment_method", "payment"],
    "is_name_required": true,
    "is_email_required": true
  }
}
{
  "amount": 150000,
  "external_id": "ORD-1234",

  "checkout": { "steps": ["payment_method", "payment"] },
  "customer": {
    "name": "Budi Santoso",
    "email": "budi@toko.dev"
  }
}

Apa pun yang diketik pembeli dikembalikan di customer pada transaksinya dan di webhook payment.paid — field yang sama dengan yang bisa Anda prefill, jadi kode Anda cukup membaca dari satu tempat.

Langkah payment_method

Secara default halaman ini menawarkan semua metode yang aktif di akun Anda. Kirim payment_methods — array berisi kode seperti ["va_bca", "qris"] — untuk menawarkan hanya itu, sesuai urutannya. Kirim satu kode saja dan langkah ini bisa Anda buang sepenuhnya: pembeli langsung masuk ke halaman pembayarannya. Lihat metode pembayaran untuk daftar kodenya.

Langkah payment

  • Nama usaha Anda — yang disetujui saat verifikasi, supaya pembeli tahu kepada siapa mereka membayar.
  • Nominal, description Anda, dan rincian yang Anda kirim di order_items.
  • QR, kode pembayaran, atau redirect ke provider untuk metode yang dipilih, lengkap dengan instruksi dan countdown sampai expires_at.
  • Setelah dibayar: konfirmasi, dan tombol kembali ke return_url Anda dengan tambahan ?id=payreq_...&status=succeeded.

Anggap redirect return_url sebagai navigasi, bukan bukti. Pembeli bisa sampai ke URL itu tanpa membayar. Proses pesanan berdasarkan webhook payment.paid atau GET /v1/transactions/:id dari server Anda, jangan pernah dari redirect saja.

Kenapa ini pilihan default

Setiap metode baru yang kami tambahkan langsung muncul di sini tanpa Anda deploy apa pun, dan langkah yang Anda tentukan menyesuaikan sendiri — kalau Virtual Account ditawarkan, field nama otomatis muncul di langkah customer dan daftar banknya di pilihan metode. Integrasi checkout yang ditulis hari ini sudah siap menerima metode yang belum ada. Pilih Direct API hanya kalau pembayaran harus terjadi di dalam layar yang Anda kendalikan.