Terima pembayaran

Kasera Pay Checkout

Arahkan pembeli ke halaman pembayaran yang kami host dan kami rawat.

Buat permintaan pembayaran, arahkan pembeli ke checkout_url, lalu tunggu webhooknya. Itu seluruh integrasinya — Anda tidak menulis UI pembayaran sama sekali. Permintaan di bawah tidak mengirim object checkout, jadi halamannya memakai default checkout akun Anda; kirim checkout kalau satu pembayaran butuh langkah atau pertanyaannya sendiri. 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...", ... }

Langkahnya Anda yang menentukan

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

LangkahPembeliDiatur oleh
customerMengisi formulirnyais_name_required, is_email_required, is_phone_required
payment_methodMemilih metode pembayaranpayment_methods
paymentMemindai, menyalin kode, atau diarahkan ke aplikasinyaTidak ada — selalu terakhir

Default-nya ["customer", "payment_method", "payment"]. Hilangkan customer kalau Anda sudah memegang data pembelinya; hilangkan payment_method kalau payment_methods hanya menyebut satu kode. Taruh payment_method di depan kalau Anda lebih suka pembeli memilih cara membayar sebelum mengetik apa pun — urutannya adalah urutan yang mereka lewati.

payment selalu terakhir dan tidak bisa dihilangkan — kalau tidak Anda sebut, kami yang menambahkannya. Menghilangkan customer padahal ada metode yang membutuhkan field yang belum Anda isi ditolak 422 customer_required saat create, bukan ditemukan pembeli di jalan buntu.

Tiga alur dari dua field

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

checkout.stepsSiapa yang memilihPembeli melihat
["customer", "payment_method", "payment"]PembeliFormulir → pemilih → bayar
["payment_method", "payment"]Anda mengisi datanya, pembeli memilih metodenyaPemilih → bayar
["payment"]Anda yang memilih semuanyaBayar — satu layar

Baris terakhir layak disebut, karena itu yang orang tidak sangka bisa dilakukan halaman hosted. Aplikasi Anda sendiri yang menampilkan tombol pembayaran dan menentukan metodenya; kami hanya menggambar layar metode itu — nomor VA, QR, redirect, formulir kartu — lengkap dengan instruksi dan hitung mundurnya. Pilihannya tetap milik Anda, tanpa harus membangun empat layar pembayaran.

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

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

Kalau langkah payment_method dihilangkan, payment_methods harus menyebut tepat satu kode. Dua kode tanpa pemilih tidak ada jawabannya — itu ditolak 422 saat create, bukan diam-diam mengambil yang pertama, karena mengambil yang pertama berarti merilis checkout yang tanpa suara tidak pernah menawarkan metode kedua.

Langkah customer

Formulirnya menanyakan nama, email, dan nomor telepon. Yang mana yang muncul ditentukan saat create — oleh object checkout yang Anda kirim, atau, kalau Anda tidak mengirimnya, oleh setelan metode pembayaran milik 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 mengisi formulir ini, dan keduanya digabung: apa yang Anda minta, dan apa yang dibutuhkan metode yang ditawarkan. Field yang sudah Anda kirim di customer tidak pernah ditanyakan lagi — jadi mengisi di muka dan mengumpulkan bukan dua mode, melainkan dua ujung 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 yang tadinya bisa Anda isi sendiri, jadi kode Anda membacanya dari satu tempat saja.

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. Sebutkan satu kode saja dan langkah ini bisa Anda hilangkan sepenuhnya: pembeli langsung mendarat di 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 penyedia untuk metode yang dipilih, lengkap dengan instruksi dan hitung mundur menuju 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. Penuhi pesanan berdasarkan webhook payment.paid atau GET /v1/transactions/:id dari server Anda, jangan pernah dari redirect saja.

Kenapa ini pilihan default

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