Lewati ke konten utama

Mulai cepat

Integrasi pembayaran minimal: membuat tagihan melalui API dan menangani notifikasi pembayaran. Bagian terakhir membahas pengiriman pesanan. Contohnya berdiri sendiri; tidak ada SDK yang digunakan.

tip

Bekerja dengan agen AI? Berikan kepadanya versi markdown halaman ini. Isinya cukup rinci untuk membangun integrasi bagi situs atau toko Anda.

Prasyarat

NilaiTempat mendapatkannya
Kunci APIBagian Integrasi (Integrations)
ID proyekBagian Proyek (Projects)
Kunci rahasia webhook (Webhook secret)Pengaturan proyek

Di pengaturan proyek yang sama, atur Webhook URL—alamat penangan notifikasi di server Anda. Hanya HTTPS; pengalihan tidak diikuti.

Contoh-contoh ini menggunakan nilai uji—ganti dengan milik Anda.

Membuat tagihan

POST https://api.bitsby.app/invoices/create, kunci API dikirim di header Authorization.

ParameterWajibNilai
projectIdyaID proyek, UUID
amountFiatyaJumlah tagihan
currencyFiatyaMata uang: USD, EUR, RUB
timeToPayyaBatas waktu pembayaran dalam jam: 0.5, 1, 3, 6, 12
descriptiontidakDeskripsi, ditampilkan kepada pembeli di halaman pembayaran
serviceDatatidakData layanan, tidak ditampilkan kepada pembeli. Kami menyarankan mengirim nomor pesanan: nilai ini dikembalikan dalam notifikasi pembayaran
curl -X POST https://api.bitsby.app/invoices/create \
-H "Authorization: Token MSvL2ltaDZdWVjmZURURMVWhqSJLT2NURjhL2Fla1Z1T1IxQTltKs1T3Ay" \
-F "projectId=9deea1e2-0c08-41a3-bdc2-a34eada3892d" \
-F "amountFiat=49.90" \
-F "currencyFiat=USD" \
-F "timeToPay=1" \
-F "description=Order 4172" \
-F "serviceData=order-4172"

Respons:

{
"result": "success",
"data": {
"id": "ade9550d-3dc7-4fd3-b94e-3b4c12aaaa0c",
"uid": "MXNj4m8HhcM4",
"createDatetime": "2026-09-14 10:12:03",
"timeToPayDatetime": "2026-09-14 11:12:03",
"commissionFiatUSD": 0.5,
"amountFiatUSD": 49.9,
"url": "https://dash.bitsby.app/invoices/pay/MXNj4m8HhcM4"
}
}

Simpan data.id bersama pesanan dan arahkan pembeli ke data.url—halaman pembayaran. Sampaikan tautannya dengan cara apa pun: pengalihan, email, pesan bot. Tagihan berlaku hingga timeToPayDatetime (UTC).

Menangani notifikasi

Saat tagihan beralih ke status Dibayar (Paid), layanan mengirim permintaan POST ke Webhook URL proyek. Isinya JSON; tanda tangannya ada di header:

HeaderNilai
X-TimestampWaktu pengiriman, unix time dalam detik
X-Signaturesha256= + HMAC-SHA256 heksadesimal dari string <timestamp>.<request body>

Kunci penandatanganannya adalah kunci rahasia webhook. Tanda tangan dihitung atas isi permintaan mentah, jadi verifikasi dulu sebelum mengurai JSON.

<?php
$secret = 'k7QwR2mZ9tXbN4vL8sJpH3dF6yA1cE0u';

$body = file_get_contents('php://input');
$timestamp = $_SERVER['HTTP_X_TIMESTAMP'] ?? '';
$signature = $_SERVER['HTTP_X_SIGNATURE'] ?? '';

// Reject replayed requests: allow up to 5 minutes of clock drift
if (abs(time() - (int)$timestamp) > 300) {
http_response_code(400);
exit;
}

$expected = 'sha256='.hash_hmac('sha256', $timestamp.'.'.$body, $secret);

if (!hash_equals($expected, $signature)) {
http_response_code(403);
exit;
}

$invoice = json_decode($body, true)['invoice'];

if ($invoice['status'] === 'paid') {
// $invoice['serviceData'] — the order id passed at creation: 'order-4172'
// $invoice['amountFiat'] — the original invoice amount: 49.9
// Issue the order here, see the next section
}

http_response_code(200);

Balas dengan kode 2xx dalam 10 detik. Kode lain, pengalihan, atau waktu habis dihitung sebagai pengiriman gagal: layanan melakukan percobaan ulang dengan interval yang meningkat dari 5 menit hingga 24 jam, lalu berhenti. Alihkan pemrosesan yang lama ke antrean: balas 200 dulu, baru proses pesanannya.

Format lengkap notifikasi dan referensi field-nya ada di bagian Webhook URL.

Pengiriman pesanan

Notifikasi terverifikasi dengan status paid mengonfirmasi pembayaran. Langkah pengirimannya:

  1. Temukan pesanan berdasarkan invoice.serviceData—nilai yang dikirim saat pembuatan tagihan (order-4172).
  2. Periksa berdasarkan invoice.id apakah tagihan ini sudah pernah diproses. Notifikasi dengan invoice.id yang sama dapat datang lebih dari sekali—kirim pesanan sekali saja dan simpan penanda telah diproses.
  3. Verifikasi jumlah dan mata uang terhadap invoice.amountFiat dan invoice.currencyFiat—keduanya nilai asli tagihan dan tidak pernah berubah. amountFiatUSD ditimpa dengan jumlah yang benar-benar diterima. Bandingkan jumlah sebagai angka, bukan string: nol di belakang dibuang, sehingga 49.90 tiba sebagai 49.9. Jika nilainya tidak cocok dengan pesanan, arahkan tagihan ke peninjauan manual alih-alih pengiriman—kasus seperti ini dibahas di Pencocokan pembayaran dan selisih jumlah.
  4. Kirim pesanan dan tandai sebagai telah diproses.

Jangan memeriksa batas waktu pembayaran saat pengiriman: pembayaran bisa saja terkonfirmasi on-chain setelah timeToPayDatetime, dan merchant dapat mencocokkan pembayaran dengan tagihan secara manual. Notifikasi itu sendiri sudah mengonfirmasi pembayaran.

Langkah selanjutnya