Bagaimana membuat tagihan pembayaran?
Kirim POST /payment berisi nominal, kode metode, dan data pembeli. Balasan 201 Created memuat invoice, payment_link ke halaman bayar SekaliPay, dan detail bayar sesuai metode. Tagihan berlaku 30 menit.
Isi halaman ini dicocokkan dengan kode API per 16 Oktober 2026.
Ke mana permintaan dikirim?#
/api/v1/gateway/payment- Batas per menit:
- 5 permintaan per menit per API key
- Tanda tangan:
- Wajib di kedua mode
Field apa saja yang dikirim?#
merchant_ref_idstringWajib- ID pesanan dari sistem Anda, maksimal 191 karakter, unik per akun (akun lain boleh memakai ref yang sama). Pakai huruf, angka,
-, dan_saja supaya aman di URL cek status. amountintegerWajib- Nominal yang Anda terima, dalam rupiah. Minimal 100 dan harus di antara
min_amountdanmax_amountmetode. payment_codestringWajib- Kode metode dari
GET /payment-methods. Metode harus aktif di akun Anda. customer_namestringWajib- Nama pembeli, maksimal 100 karakter.
customer_emailstringWajib- Email pembeli yang valid, maksimal 100 karakter.
customer_phonestringWajib- Nomor HP pembeli, maksimal 20 karakter.
callback_urlstringOpsional- URL webhook khusus transaksi ini, maksimal 500 karakter. Harus alamat publik;
localhostdan IP privat ditolak. Kosong berarti URL di dasbor. return_urlstringOpsional- Tujuan browser pembeli setelah membayar, maksimal 500 karakter. Kosong berarti URL di dasbor. Lihat Pengalihan pembeli.
metadataobjectOpsional- Data bebas untuk keperluan Anda. Disimpan bersama transaksi, tetapi tidak dikirim balik di respons API maupun webhook.
Berapa yang dibayar pembeli?#
amount adalah yang Anda terima. Biaya metode ditambahkan di atasnya, jadi pembeli membayar total = amount + fee. Pada contoh di bawah, Anda menerima Rp 150.000 dan pembeli membayar Rp 151.500. Biaya tiap metode ada di halaman biaya.
Seperti apa contoh permintaannya?#
BODY='{"merchant_ref_id":"ORDER-2026-00184","amount":150000,"payment_code":"QRIS","customer_name":"Budi Santoso","customer_email":"[email protected]","customer_phone":"081234567890","callback_url":"https://toko-anda.id/webhook/sekalipay","return_url":"https://toko-anda.id/checkout/selesai"}'
SIGNATURE=$(printf '%s' "$BODY" | openssl dgst -sha256 -hmac "$SEKALIPAY_SECRET_KEY" | sed 's/^.* //')
curl -X POST https://sekalipay.com/api/v1/gateway/payment \
-H "X-API-Key: $SEKALIPAY_API_KEY" \
-H "X-Signature: $SIGNATURE" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
--data-raw "$BODY"$body = json_encode([
'merchant_ref_id' => 'ORDER-2026-00184',
'amount' => 150000,
'payment_code' => 'QRIS',
'customer_name' => 'Budi Santoso',
'customer_email' => '[email protected]',
'customer_phone' => '081234567890',
'callback_url' => 'https://toko-anda.id/webhook/sekalipay',
'return_url' => 'https://toko-anda.id/checkout/selesai',
]);
$signature = hash_hmac('sha256', $body, getenv('SEKALIPAY_SECRET_KEY'));
$ch = curl_init('https://sekalipay.com/api/v1/gateway/payment');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $body,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'Accept: application/json',
'X-API-Key: ' . getenv('SEKALIPAY_API_KEY'),
'X-Signature: ' . $signature,
],
]);
$response = json_decode(curl_exec($ch), true);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);import { createHmac } from "node:crypto";
const body = JSON.stringify({
"merchant_ref_id": "ORDER-2026-00184",
"amount": 150000,
"payment_code": "QRIS",
"customer_name": "Budi Santoso",
"customer_email": "[email protected]",
"customer_phone": "081234567890",
"callback_url": "https://toko-anda.id/webhook/sekalipay",
"return_url": "https://toko-anda.id/checkout/selesai"
});
const signature = createHmac("sha256", process.env.SEKALIPAY_SECRET_KEY)
.update(body)
.digest("hex");
const res = await fetch("https://sekalipay.com/api/v1/gateway/payment", {
method: "POST",
headers: {
"Content-Type": "application/json",
Accept: "application/json",
"X-API-Key": process.env.SEKALIPAY_API_KEY,
"X-Signature": signature,
},
body,
});
const result = await res.json();Contoh di atas untuk mode IP Whitelist. Untuk Enhanced HMAC, pakai helper di Autentikasi.
Apa isi respons sukses?#
{
"status": true,
"message": "OK",
"data": {
"merchant_ref_id": "ORDER-2026-00184",
"invoice": "SPY1791446400K3QZ",
"amount": 150000,
"fee": 1500,
"total": 151500,
"payment_code": "QRIS",
"payment_link": "https://sekalipay.com/payment/SPY1791446400K3QZ",
"qr_link": "https://sekalipay.com/payment/SPY1791446400K3QZ/qris",
"virtual_account": null,
"checkout_url": null,
"payment_guide": null,
"expired_at": "2026-10-08T08:30:00.000000Z",
"status": "pending",
"is_sandbox": false
}
}invoicestring- Nomor invoice SekaliPay, mis.
SPY1791446400K3QZ. Simpan untuk pencocokan dan saat menghubungi dukungan. amountinteger- Nominal yang Anda terima.
feeinteger- Biaya transaksi, dibayar pembeli.
totalinteger- Yang harus dibayar pembeli.
payment_linkstring- Halaman bayar SekaliPay. Selalu terisi; cara termudah adalah mengarahkan pembeli ke sini.
qr_linkstring | null- Gambar QR untuk metode QRIS.
virtual_accountstring | null- Nomor VA untuk metode virtual account.
checkout_urlstring | null- Tautan ke aplikasi atau halaman e-wallet.
payment_guidestring | null- Petunjuk bayar dalam HTML bila mitra menyediakannya. Sanitasi sebelum ditampilkan.
expired_atstring- Batas bayar, ISO 8601 UTC, 30 menit setelah tagihan dibuat.
statusstring- Selalu
pendingsaat dibuat. is_sandboxbooleantruebila dibuat dalam mode sandbox.
Detail bayar yang terisi bergantung metodenya; yang tidak relevan bernilai null.
Bagaimana mengulang permintaan dengan aman?#
merchant_ref_id adalah kunci idempotensi. Bila permintaan Anda timeout dan hasilnya tidak diketahui, kirim ulang dengan ref yang sama. Kalau tagihannya sudah terbuat, balasannya 409 PAYMENT_ALREADY_EXISTS berisi data tagihan itu, bukan tagihan kedua.
{
"status": false,
"message": "PAYMENT_ALREADY_EXISTS",
"data": {
"merchant_ref_id": "ORDER-2026-00184",
"invoice": "SPY1791446400K3QZ",
"amount": 150000,
"fee": 1500,
"total": 151500,
"payment_code": "QRIS",
"payment_link": "https://sekalipay.com/payment/SPY1791446400K3QZ",
"qr_link": "https://sekalipay.com/payment/SPY1791446400K3QZ/qris",
"expired_at": "2026-10-08T08:30:00.000000Z",
"status": "pending"
}
}Permintaan yang ditolak dengan galat lain (4xx selain 409, atau 5xx) tidak menyimpan apa pun, jadi ref yang sama boleh dipakai lagi.
Galat apa yang khusus endpoint ini?#
| HTTP | Kode | Arti |
|---|---|---|
| 403 | MERCHANT_KYC_INCOMPLETE | Verifikasi merchant belum lengkap. data.onboarding_url menunjuk halaman untuk melengkapinya. |
| 400 | PAYMENT_METHOD_NOT_AVAILABLE | Kode metode tidak dikenal, atau metodenya sedang nonaktif. |
| 403 | PAYMENT_METHOD_NOT_ENABLED | Metode ada tetapi belum diaktifkan di akun Anda. |
| 400 | AMOUNT_OUT_OF_RANGE | Nominal di luar rentang metode; data memuat min_amount dan max_amount. |
| 409 | PAYMENT_ALREADY_EXISTS | merchant_ref_id ini sudah punya tagihan; data berisi tagihan tersebut. |
| 409 | DUPLICATE_REF_ID | Dua permintaan dengan ref yang sama tiba bersamaan dan yang ini kalah. Cek status ref tersebut. |
| 500 | PAYMENT_GATEWAY_ERROR | Mitra pembayaran menolak atau tidak menjawab. Tidak ada yang tersimpan; coba lagi dengan ref yang sama atau metode lain. |
| 500 | INTERNAL_SERVER_ERROR | Kesalahan di sisi kami; detailnya tidak dikirim. Coba lagi, atau hubungi dukungan dengan waktu kejadian dan merchant_ref_id. |
Ditambah galat validasi 422 dan galat autentikasi; lihat Kode galat.
Siap memakai kunci Anda sendiri?
Masuk ke dasbor merchant untuk mengambil API key dan secret key, mengatur mode akses dan URL webhook, serta mengunduh koleksi Postman berisi kunci akun Anda.
Masuk ke dasbor
