Create a payment via API
Last updated:
The initPayment method initiates a payment from your server. Pass the payment intent (project, amount, currency, customer reference, description) to UnitPay; UnitPay returns a hosted payment URL that you redirect the customer to. After the customer completes the payment, UnitPay notifies your callback handler — see Callback handler.
Endpoint
Send a request to https://api.unitpay.net/api. The request body uses query-string-style parameters under params[...]. Both GET and POST are accepted; production traffic should use POST over TLS.
Required parameters
| Parameter | Type | Description |
|---|---|---|
method | string | Always initPayment. |
params[paymentType] | string | Payment-method code: card, qris, va, or another method enabled on your project. Contact onboarding to see the codes available to you. |
params[projectId] | integer | Your project ID, visible in the merchant cabinet under Settings → Project. |
params[sum] | number | Payment amount in major currency units (for example, 150000.00 for IDR 150,000 or 10.00 for USD 10). Two decimal places maximum. |
params[account] | string | Customer or order identifier in your system. Returned unchanged in callbacks so you can match the result to the original order. |
params[desc] | string | Human-readable order description shown to the customer on the payment form and on the receipt. |
Optional parameters
| Parameter | Type | Description |
|---|---|---|
params[currency] | string | ISO 4217 currency code: IDR, USD, or EUR. Defaults to the project's primary currency. |
params[locale] | string | Payment-form language: en or id. Auto-detected from the customer's Accept-Language header when omitted. |
params[backUrl] | string | URL the customer is sent to if they abandon the payment. Must use a domain registered to your project. |
params[resultUrl] | string | URL the customer is sent to after a successful payment. URL-encode any query string. |
params[customerEmail] | string | Customer email used for the receipt. |
params[signature] | string | Request signature. Required when "API request signing" is enabled on the project. See Signing the request below. |
Signing the request
UnitPay signs requests with HMAC-SHA-256 using your project secret key. Reuse the same algorithm you use to verify incoming callbacks (see Callback handler — signature verification):
- Take all
params[*]values exceptparams[signature]and sort them by parameter name. - Concatenate the values, separated by the literal four-character delimiter
{up}, in this order:method, then each sorted parameter value, then your project secret key. - Hash the resulting string with SHA-256 and lowercase the hex digest.
- Pass the digest as
params[signature].
Never embed the secret key in client-side code or log it. Rotate it from Settings → Project → Secret key if you suspect compromise.
Example request
POST https://api.unitpay.net/api
Content-Type: application/x-www-form-urlencoded
method=initPayment
¶ms[paymentType]=card
¶ms[projectId]=123456
¶ms[sum]=150000.00
¶ms[currency]=IDR
¶ms[account]=order-9821
¶ms[desc]=Order%20%239821
¶ms[locale]=en
¶ms[signature]=<sha256-hex-digest>
Successful response
UnitPay replies with HTTP 200 and a JSON body that includes the hosted payment URL. Redirect the customer's browser to redirectUrl.
{
"result": {
"type": "redirect",
"paymentId": 1231231234,
"message": "Payment created.",
"receiptUrl": "https://pay.unitpay.net/receipt/1231231234-12d1fae123",
"statusUrl": "https://pay.unitpay.net/receipt/1231231234-12d1fae123",
"redirectUrl": "https://pay.unitpay.net/123456-1fc2f/card?..."
}
}
| Field | Description |
|---|---|
type | redirect — redirect the customer to redirectUrl; response — the message field is final, display it to the customer; invoice — an invoice was emailed to the customer, no further action required. |
paymentId | UnitPay's unique payment identifier. Store it alongside your account reference so you can correlate callbacks and refunds. |
redirectUrl | Hosted payment URL. Valid until the payment expires (15 minutes by default). |
receiptUrl | Hosted receipt URL the customer can revisit later. |
Error response
{
"error": {
"message": "Invalid signature.",
"code": -32010
}
}
Treat any response that contains an error object as a hard failure: do not retry blindly. Common causes are an incorrect projectId, a signature mismatch, an unsupported currency, or a payment-method code that is not enabled for your project.
Test mode
Every project has a separate test secret key and a test toggle in the merchant cabinet. Test-mode payments use the same endpoint and parameters but never move real funds, and the callback handler receives params[test]=1 for those transactions. Switch to test mode while you implement and verify your integration end-to-end before enabling live payments.
Next steps
- Generate a payment link — share a hosted payment URL without writing server-side code.
- Callback handler — verify signatures and confirm the result on your server.
- Refund a payment — issue a full or partial refund from your server.
Metode initPayment memulai pembayaran dari server Anda. Kirimkan data pembayaran (proyek, jumlah, mata uang, referensi pelanggan, deskripsi) ke UnitPay; UnitPay akan mengembalikan URL pembayaran terhosting yang dapat Anda gunakan untuk mengarahkan pelanggan. Setelah pelanggan menyelesaikan pembayaran, UnitPay akan memberi tahu callback handler Anda — lihat Penanganan callback.
Endpoint
Kirim permintaan ke https://api.unitpay.net/api. Body permintaan menggunakan parameter bergaya query-string di bawah params[...]. Baik GET maupun POST diterima; trafik produksi sebaiknya menggunakan POST melalui TLS.
Parameter wajib
| Parameter | Tipe | Deskripsi |
|---|---|---|
method | string | Selalu initPayment. |
params[paymentType] | string | Kode metode pembayaran: card, qris, va, atau metode lain yang aktif pada proyek Anda. Hubungi tim onboarding untuk mengetahui kode yang tersedia. |
params[projectId] | integer | ID proyek Anda, terlihat di kabinet merchant pada Pengaturan → Proyek. |
params[sum] | number | Jumlah pembayaran dalam satuan mata uang utama (misalnya 150000.00 untuk IDR 150.000 atau 10.00 untuk USD 10). Maksimum dua angka desimal. |
params[account] | string | Identifikasi pelanggan atau pesanan dalam sistem Anda. Dikembalikan tanpa perubahan pada callback agar Anda dapat mencocokkan hasilnya dengan pesanan asli. |
params[desc] | string | Deskripsi pesanan yang dapat dibaca pelanggan, ditampilkan pada formulir pembayaran dan kuitansi. |
Parameter opsional
| Parameter | Tipe | Deskripsi |
|---|---|---|
params[currency] | string | Kode mata uang ISO 4217: IDR, USD, atau EUR. Default mengikuti mata uang utama proyek. |
params[locale] | string | Bahasa formulir pembayaran: en atau id. Otomatis dideteksi dari header Accept-Language pelanggan jika dihilangkan. |
params[backUrl] | string | URL tujuan jika pelanggan membatalkan pembayaran. Harus menggunakan domain yang terdaftar pada proyek Anda. |
params[resultUrl] | string | URL tujuan setelah pembayaran berhasil. Lakukan URL-encode untuk semua query string. |
params[customerEmail] | string | Email pelanggan yang digunakan untuk kuitansi. |
params[signature] | string | Tanda tangan permintaan. Wajib jika "Penandatanganan permintaan API" diaktifkan pada proyek. Lihat Menandatangani permintaan di bawah. |
Menandatangani permintaan
UnitPay menandatangani permintaan dengan HMAC-SHA-256 menggunakan kunci rahasia proyek Anda. Gunakan algoritma yang sama untuk memverifikasi callback masuk (lihat Penanganan callback — verifikasi tanda tangan):
- Ambil semua nilai
params[*]kecualiparams[signature]dan urutkan berdasarkan nama parameter. - Gabungkan nilai-nilai tersebut dengan pemisah literal empat karakter
{up}, dalam urutan:method, lalu setiap nilai parameter terurut, lalu kunci rahasia proyek Anda. - Hash string yang dihasilkan dengan SHA-256 dan ubah hex digest menjadi huruf kecil.
- Sertakan digest sebagai
params[signature].
Jangan pernah menyertakan kunci rahasia di kode sisi klien atau dalam log. Lakukan rotasi melalui Pengaturan → Proyek → Kunci rahasia jika Anda mencurigai kebocoran.
Contoh permintaan
POST https://api.unitpay.net/api
Content-Type: application/x-www-form-urlencoded
method=initPayment
¶ms[paymentType]=card
¶ms[projectId]=123456
¶ms[sum]=150000.00
¶ms[currency]=IDR
¶ms[account]=order-9821
¶ms[desc]=Order%20%239821
¶ms[locale]=en
¶ms[signature]=<sha256-hex-digest>
Respons sukses
UnitPay membalas dengan HTTP 200 dan body JSON yang berisi URL pembayaran terhosting. Arahkan browser pelanggan ke redirectUrl.
{
"result": {
"type": "redirect",
"paymentId": 1231231234,
"message": "Payment created.",
"receiptUrl": "https://pay.unitpay.net/receipt/1231231234-12d1fae123",
"statusUrl": "https://pay.unitpay.net/receipt/1231231234-12d1fae123",
"redirectUrl": "https://pay.unitpay.net/123456-1fc2f/card?..."
}
}
| Field | Deskripsi |
|---|---|
type | redirect — arahkan pelanggan ke redirectUrl; response — field message bersifat final, tampilkan ke pelanggan; invoice — faktur telah dikirim via email ke pelanggan, tidak diperlukan tindakan tambahan. |
paymentId | Identifikasi unik pembayaran di UnitPay. Simpan bersama referensi account Anda agar dapat mengaitkan callback dan pengembalian dana. |
redirectUrl | URL pembayaran terhosting. Berlaku hingga pembayaran kedaluwarsa (default 15 menit). |
receiptUrl | URL kuitansi terhosting yang dapat diakses kembali oleh pelanggan. |
Respons error
{
"error": {
"message": "Invalid signature.",
"code": -32010
}
}
Anggap respons apa pun yang mengandung objek error sebagai kegagalan keras: jangan mencoba ulang tanpa pemeriksaan. Penyebab umum adalah projectId yang salah, ketidakcocokan tanda tangan, mata uang yang tidak didukung, atau kode metode pembayaran yang belum diaktifkan untuk proyek Anda.
Mode pengujian
Setiap proyek memiliki kunci rahasia uji coba terpisah dan tombol pengaturan mode uji di kabinet merchant. Pembayaran mode uji menggunakan endpoint dan parameter yang sama tetapi tidak memindahkan dana sungguhan, dan callback handler akan menerima params[test]=1 untuk transaksi tersebut. Gunakan mode uji selama Anda mengimplementasikan dan memverifikasi integrasi secara menyeluruh sebelum mengaktifkan pembayaran live.
Langkah selanjutnya
- Membuat tautan pembayaran — bagikan URL pembayaran terhosting tanpa menulis kode sisi server.
- Penanganan callback — verifikasi tanda tangan dan konfirmasi hasil pada server Anda.
- Pengembalian dana pembayaran — lakukan pengembalian penuh atau sebagian dari server Anda.