SDK
Library resmi untuk Node, PHP, dan Python: buat payment, verifikasi webhook, dan ambil ulang status dengan nama metode yang sama di ketiganya.
Instalasi
Ketiga SDK tanpa dependensi runtime. Node butuh versi 18 atau lebih baru, PHP 8.1 atau lebih baru (dengan ekstensi curl dan json), dan Python 3.9 atau lebih baru. Pilih bahasamu di tab kode.
@fqris/node sedang disiapkan untuk terbit di npm, fqris/fqris-php di Packagist, dan fqris di PyPI. Sementara itu, pakai contoh cURL: semua endpoint bisa dipanggil langsung lewat HTTP.Inisialisasi dan buat payment
Buat satu client dengan API key, lalu panggil resource-nya. Key harus diawali fq_live_ atau fq_test_, dan hanya boleh disimpan di backend, bukan di aplikasi Android atau browser.
Respons berupa objek yang kolomnya dibaca sebagai properti: payment.checkout_url. Di PHP objek itu hanya-baca dan kolom yang tidak ada bernilai null.
dict yang juga bisa dibaca lewat atribut. Kunci yang bentrok dengan metode dict, seperti items pada invoice, dibaca lewat invoice["items"], bukan invoice.items.Verifikasi webhook
Verifikasi signature dengan raw body sebelum body di-parse. Di Express pakai express.raw, bukan express.json(). Di PHP ambil dari php://input. Di Flask pakai request.get_data() dan di Django request.body. Toleransi waktu bawaan 5 menit.
retrieveAndAssertPaid (Node dan PHP) atau retrieve_and_assert_paid (Python): metode ini mengambil status terbaru dan hanya lolos untuk status paid. Payment refunded atau partially_refunded melempar error khusus (PaymentNotPaidError di Node dan Python, PaymentNotPaidException di PHP), jadi tidak ikut dikredit. Tangkap error itu dan balas 200 supaya FQris tidak mengirim ulang event yang sama.Event bisa datang lebih dari sekali dan tidak berurutan. Simpan event.id yang sudah diproses, beri kunci unik per payment dan per order saat mengkredit, dan balas 2xx dalam 10 detik. Panduan Webhook dan Top-up koin membahas aturan ini lengkap.
Sandbox
Pakai key fq_test_, lalu simulasikan hasil pembayaran dengan result berisi paid, expired, atau paid_late. Data mode uji terpisah total dari live.
Paginasi
List mengembalikan data, has_more, dan next_cursor, dan menerima limit (maksimal 100), starting_after, ending_before, serta filter seperti status. Untuk mengiterasi semua data, pakai listAll (Node, PHP) atau list_all (Python). Metode ini ada di payments, customers, paymentLinks, invoices, dan events.
Menangani error
Respons non-2xx, setelah retry habis, menjadi FQrisError di Node dan Python, atau FQrisException di PHP. Errornya membawa status, code, pesan, dan requestId (request_id di Python). Sertakan request id itu saat menghubungi dukungan. Kegagalan jaringan memakai status 0 dengan code NETWORK_ERROR atau TIMEOUT.
Retry dan idempotensi
SDK mengulang request yang gagal karena jaringan, timeout, 429, atau 5xx, sampai 2 kali bawaan (maxRetries di Node, max_retries di PHP dan Python), dengan backoff. Header Retry-After dihormati sampai 60 detik.
Setiap POST otomatis membawa header Idempotency-Key. Kuncinya dibuat sekali sebelum percobaan pertama dan sama di semua retry, jadi payment tidak pernah terbuat dua kali. Untuk operasi yang kamu ulang sendiri, misalnya setelah proses backend mati, berikan kunci yang stabil seperti TOPUP-88812.
409 IDEMPOTENCY_KEY_REUSED. Pakai kunci baru untuk body yang baru.Transport kustom
PHP memakai cURL secara bawaan. Untuk transport lain, misalnya wp_remote_request di WordPress atau tiruan untuk tes, implementasikan \FQris\HttpClient\HttpClientInterface dan berikan lewat opsi http_client saat membuat \FQris\Client. Python menerima http_client= juga: objek dengan metode send(method, url, headers, body, timeout). Node menerima fetch kustom lewat opsi fetch.