πŸ“š Developer API Docs

Panduan integrasi QRIS Dinamis, Webhook & Payment API β€” FN CREATIVE Payment Gateway.

1. Kredensial API

Setiap request wajib menyertakan header berikut β€” nilai di bawah ini milik akun Anda setelah login:

Login merchant agar docs menampilkan x-api-key, id_merchant, dan webhook_secret valid (bukan contoh).
Header
x-api-key
API Key merchant
β€” login dulu β€”
Header
id_merchant
ID merchant 12 digit
β€”
Webhook
webhook_secret
Secret tanda tangan webhook
β€”

Base URL

https://pay.fncreative.org/api

2. Create Transaction

POST/qris/create

Generate QRIS dinamis + kode unik. Gunakan total_amount dari response sebagai nominal wajib dibayar.

Kode unik kecil per tier: produk Rp 1–5 rb (+11–60), Rp 5–10 rb (+21–90), Rp 10–500 rb (+31–150). Contoh base Rp 10.000 β†’ total sekitar Rp 10.021–10.090.

FieldKeterangan
order_id *ID unik transaksi (INV-1001)
amount *Nominal dasar integer (min 1000)
keteranganDeskripsi opsional
callback_urlOverride webhook URL (opsional)
curl_setopt_array($curl, array(
  CURLOPT_URL => 'https://pay.fncreative.org/api/qris/create',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_CUSTOMREQUEST => 'POST',
  CURLOPT_POSTFIELDS => '{
    "order_id": "INV-123",
    "amount": 10000,
    "keterangan": "Pembayaran Invoice #123"
  }',
  CURLOPT_HTTPHEADER => array(
    'Content-Type: application/json',
    'x-api-key: YOUR_API_KEY',
    'id_merchant: YOUR_MERCHANT_ID'
  ),
));
Ingat: Customer wajib bayar tepat total_amount, bukan nominal dasar amount.
Masa berlaku QR: default 5 menit sejak dibuat. Lihat field expired_at dan expired_menit di response β€” jangan hardcode 60 menit di UI merchant.

Response (201)

{
  "status": true,
  "message": "Transaction Created Successfully",
  "data": {
    "order_id": "INV-123",
    "amount": "10000.00",
    "amount_uniq": "45.00",
    "total_amount": "10045.00",
    "status": "PENDING",
    "expired_at": "2026-06-13 16:05:01",
    "expired_menit": "5",
    "signature": "...",
    "keterangan": "Pembayaran Invoice #123",
    "qris_image": "data:image/png;base64,...",
    "qr_string": "00020101..."
  }
}

3. Masa Berlaku QR & Kode Unik

Setiap transaksi QRIS dinamis memiliki batas waktu pembayaran. Nilai aktual platform saat ini (live dari GET /api/docs/meta):

ParameterNilaiArti
unique_code.slot_minutes5 menitQR PENDING mengunci slot kode unik selama ini
unique_code.expire_minutes5 menitQR otomatis EXPIRED jika belum dibayar
unique_code.match_window_minutes180 menitTransaksi SUCCESS tetap mengunci slot (anti bentrok)

Alur merchant

  1. Panggil POST /qris/create β†’ tampilkan QR + total_amount + countdown dari expired_at.
  2. Customer bayar dalam waktu aktif β†’ webhook PAID atau polling GET /qris/status/{order_id} β†’ SUCCESS.
  3. Lewat waktu tanpa bayar β†’ status EXPIRED β†’ buat QR baru (disarankan order_id baru).
Webhook hanya dikirim saat pembayaran sukses (PAID). Untuk QR expired, pantau via polling status atau UI merchant sendiri.
Pesan β€œSlot kode unik sedang penuh” jarang terjadi: slot pending dipulihkan otomatis setelah masa berlaku QR. Jika muncul, tunggu beberapa menit atau gunakan nominal/tier berbeda.

4. Webhook Callback

Server merchant harus merespon HTTP 200 OK. Callback dikirim saat pembayaran sukses β€” field status bernilai PAID (bukan SUCCESS seperti di API status/history).

Webhook URL tidak wajib saat daftar. Isi callback_url di body /qris/create jika ingin notifikasi otomatis. Tanpa URL, gunakan polling GET /qris/status/{order_id}.

Validasi Signature

Secret webhook akun Anda: β€”

signature = HMAC_SHA256(
  YOUR_WEBHOOK_SECRET,
  order_id + "|" + status + "|" + total_amount + "|" + payment_date
)
{
  "order_id": "INV-123",
  "status": "PAID",
  "amount": 10000,
  "total_amount": 10045,
  "payment_date": "2026-06-01 21:48:01",
  "created_at": "2026-06-01 21:18:01",
  "updated_at": "2026-06-01 21:48:01",
  "keterangan": "Pembayaran Invoice #123",
  "direct_url": null,
  "signature": "..."
}

5. Check Status

GET/qris/status/{order_id}

Header sama seperti create: x-api-key + id_merchant. Status di response API: PENDING, SUCCESS, atau EXPIRED.

6. Transaction History

GET/qris/history?page=1

7. Ringkasan Harian

GET/qris/summary?date=2026-06-01

Menampilkan total transaksi sukses dan pendapatan per hari (zona Asia/Jakarta). Parameter date opsional β€” default hari ini.

FieldArti
revenue.gross_amountTotal uang masuk (nominal dibayar customer, termasuk kode unik)
revenue.base_amountTotal harga dasar produk (tanpa kode unik)
revenue.success_countJumlah transaksi SUCCESS di tanggal tersebut
activity.pending_todayQR dibuat hari itu yang masih PENDING
Atau buka Dashboard Merchant β€” login dengan email + password untuk melihat pendapatan, saldo, dan API key.

8. Login & Dashboard

POST/merchants/login

Dashboard web memakai session token (Bearer). API integrasi tetap memakai x-api-key.

{
  "email": "dev@tokoabc.com",
  "password": "password-anda"
}

Response berisi session_token. Kredensial API lihat via GET /merchants/me setelah login (bukan di body login).

GET/merchants/me

Header: Authorization: Bearer <session_token>

9. Dompet & Penarikan

Fee platform: 0,7% dari total pembayaran (termasuk kode unik) per transaksi SUCCESS. Di atas Rp 500.000: tambahan biaya admin 0,7% (total 1,4%). Penarikan minimum Rp 25.000.

Notifikasi Telegram untuk merchant diatur lewat dashboard web (menu Telegram). Admin platform tetap menerima semua alert operasional.

EndpointFungsi
GET /merchants/walletSaldo, fee, rekening bank
PUT /merchants/bank-accountSimpan rekening penarikan
POST /merchants/withdrawAjukan penarikan (session)
GET /merchants/withdrawalsRiwayat penarikan
PUT /merchants/callback-urlSimpan/hapus webhook URL default (session)
GET /merchants/telegram-notifyStatus notifikasi Telegram merchant
PUT /merchants/telegram-notifySimpan Chat ID & aktif/nonaktif
POST /merchants/telegram-notify/linkBuat link hubung bot Telegram
POST /merchants/telegram-notify/testKirim pesan tes ke Telegram merchant
GET /merchants/wallet/ledgerMutasi saldo (session)
callback_url harus HTTPS publik (bukan localhost/IP privat). Isi per transaksi di body /qris/create atau saat daftar.

Best Practice Integrasi (Produksi)

  • Tampilkan total_amount besar di checkout β€” bukan hanya amount.
  • Countdown dari expired_at (timezone server UTC/WIB sesuai field).
  • Satu order_id = satu invoice. Jangan create ulang berkali-kali tanpa perlu.
  • Jika masih PENDING, API mengembalikan QR yang sama β€” cek status dulu sebelum create baru.
  • Setelah EXPIRED, create dengan order_id baru atau hapus record expired (reuse order_id diperbolehkan setelah expired).
  • Validasi webhook dengan webhook_secret + HMAC β€” abaikan callback tanpa signature valid.
  • Fee platform (0,7% / 1,4% di atas Rp 500.000) hanya pada transaksi SUCCESS β€” EXPIRED tidak dikenai fee.

Status Types

StatusArti
PENDINGMenunggu pembayaran β€” QR masih aktif sampai expired_at
SUCCESSPembayaran berhasil β€” saldo merchant dikredit (setelah fee)
EXPIREDQR kadaluarsa (Β±5 menit default) β€” buat QR baru untuk customer

Onboarding Partner

User bisa daftar sendiri tanpa hubungi admin:

  1. Buka https://pay.fncreative.org/register/
  2. Isi nama, email, password, dan opsional callback_url webhook HTTPS
  3. Setujui Syarat & Ketentuan dan Kebijakan Privasi
  4. Sistem menampilkan x-api-key, id_merchant, dan webhook_secret
  5. Login kapan saja di /login/ β€” API key yang sama terlihat di dashboard
Webhook URL default bisa diatur di Dashboard β†’ Webhook URL Default atau per transaksi via callback_url di body /qris/create.
Integrasi bot/website: informasikan customer bahwa QR berlaku Β±5 menit dan nominal wajib tepat total_amount. Detail teknis: bagian Masa Berlaku QR.

API Registrasi (opsional)

POST/merchants/register
{
  "name": "Toko ABC",
  "email": "dev@tokoabc.com",
  "password": "password-min-8",
  "password_confirm": "password-min-8",
  "store_name": "Toko ABC",
  "callback_url": "https://tokoabc.com/webhook/fn-payment",
  "terms_accepted": true
}