ZPay Engine v2.4 Pencocokan mutasi QRIS otomatis →

Otomatisasi Kasir QRIS, Lunas Tanpa Cek Bukti Bayar.

Pelanggan membayar lewat ShopeePay, ZPay memverifikasi uang masuk di rekeningmu dan mengirim sinyal lunas ke tokomu dalam hitungan detik.

3–5 dtk Kecepatan deteksi uang masuk
Rp0 / bln Tanpa biaya langganan bulanan
100% Utuh Harga barang ≤ Rp500rb bebas potongan
LIVE CHECKOUT PREVIEW
INV-2041 · Paket Premium 1 Bulan
MENUNGGU SCAN
Nominal Unik QRIS Dinamis:
Rp 50.137
Harga Rp 50.000 + Kode Unik Rp 137
Terima Bersih: Rp 50.000 (100%)
1. POST /api/payments (QRIS Dinamis dibuat) 201 Created
2. Pembaca mutasi mendeteksi kredit Rp 50.137 Menunggu...
3. Kirim Webhook HMAC payment.paid ke toko Standby
Satu kode QRIS Dinamis ZPay mendukung seluruh aplikasi bank & dompet digital nasional
ShopeePay
GoPay
DANA
myBCA
Livin' by Mandiri
BRImo
BNI Mobile
SeaBank
Bank Jago
LinkAja
OCTO Mobile
Jenius

Bagaimana ZPay bekerja dari awal sampai lunas?

Dirancang sederhana agar pemilik toko maupun developer bisa mengotomatiskan pembayaran QRIS tanpa harus menunggu kiriman screenshot bukti transfer.

TAHAP 01 · SETUP

Hubungkan QRIS Tokomu

Daftar akun dengan biaya pembuatan ringan Rp25.000 sekali bayar, lalu tempelkan QRIS usaha milikmu di dashboard.

Sekali atur di awal →
TAHAP 02 · TAGIHAN

Kode Unik Otomatis

Saat pembeli checkout via API atau Link WA, ZPay menambahkan kode unik kecil (Rp100–Rp250) ke dalam QRIS Dinamis.

Nominal langsung terkunci →
TAHAP 03 · DETEKSI

Baca Mutasi Real-Time

Pembeli scan dari aplikasi apa pun. Sistem pembaca mutasi ZPay memantau uang masuk dan mencocokkan angka uniknya.

Akurat tanpa berita transfer →
TAHAP 04 · LUNAS

Webhook & Kabar Instan

Begitu nominal cocok, status langsung berubah Lunas dan server ZPay mengirim webhook bertanda tangan HMAC ke tokomu.

Pesanan langsung diproses ✓

Mesin pembayaran yang dirancang untuk kecepatan & akurasi.

Setiap komponen dibangun untuk mencegah salah cocok nominal, menolak bukti transfer palsu, dan menjaga saldo tokomu tetap utuh.

IDENTIFIKASI OTOMATIS TANPA BERITA TRANSFER

Uji Simulasi Kode Unik & Terima Bersih

Klik salah satu nominal harga barang di bawah ini untuk melihat bagaimana ZPay menyisipkan 3 digit kode unik dan menghitung uang bersih yang masuk ke saldomu:

Nominal QRIS Pembeli:
Rp 50.000 → Rp 50.137
Potongan Harga Barang: Rp 0
Terima Bersih: Rp 50.000

Kebal Bukti Transfer Palsu

Screenshot bukti transfer mudah diedit di HP. ZPay hanya menandai pesanan Lunas jika kredit uang sungguhan tercatat di mutasi rekening.

Kiriman Screenshot Editan DITOLAK SISTEM
Mutasi Rekening Asli Cocok OTOMATIS LUNAS

Isolasi Saldo & Data

Setiap akun merchant memiliki ruang lingkup API key, riwayat tagihan, dan buku besar saldo yang terpisah penuh satu sama lain.

Webhook Auto-Retry 6 Kali

Jika server tokomu sedang penuh atau restart, ZPay otomatis mengirim ulang sinyal lunas bertahap (+30d, +2m, +10m, +30m, +2j).

Tanda Tangan HMAC-SHA256

Setiap paket webhook ditandatangani dengan secret akun dan timestamp anti-replay, lengkap dengan perlindungan anti-SSRF.

Satu sistem untuk berbagai cara jualan.

Baik kamu berjualan lewat chat WhatsApp tanpa website, maupun mengelola ribuan transaksi otomatis lewat REST API.

SKENARIO 01 · E-COMMERCE & SAAS

Checkout Website Otomatis 24 Jam Tanpa Admin Jaga

Saat pembeli menekan tombol Bayar di websitemu, backend tokomu memanggil satu endpoint POST /api/payments. Pembeli langsung melihat QRIS Dinamis, dan begitu dibayar, servermu menerima webhook payment.paid untuk memproses pesanan secara otomatis.

Alur: Checkout Pembeli → POST /api/payments → Scan QRIS → Webhook payment.paid → Pesanan Dikirim
Coba di Simulator →

Simulasi Real-Case Pembayaran QRIS Indonesia.

Uji skenario nyata transaksi di Indonesia: mulai dari pembuatan QRIS Dinamis berstandar EMVCo/NMID, pembacaan notifikasi mutasi M-Banking/E-Wallet, hingga pengiriman Webhook otomatis.

Pilih Skenario Bisnis Nyata di Indonesia:
NOTIFIKASI HP MERCHANT • BARU SAJA
Pembayaran QRIS Rp 50.137 dari GoPay berhasil masuk ke rekening.
1.1 dtk
QRIS STANDAR NASIONAL • ZEROPOINT.ID
NMID: ID1026630618860 · TID: A01
MENUNGGU BAYAR
ZPY-804192
Top-Up 284 Diamond MLBB
Aplikasi Pembeli
GoPay
Nominal Unik Terkunci (EMVCo Tag 54):
Rp 50.137
Harga Rp 50.000 + Kode Unik Rp 137 (dibayar pembeli)
Ref Bank / RRN: Menunggu scan pembeli...
Dana Bersih Masuk ke Saldomu: Rp 50.000 (100% Utuh)

Transparan di biaya, lengkap di dokumentasi.

Buka halaman khusus Harga untuk mencoba kalkulator terima bersih, atau buka Dokumentasi API lengkap untuk mulai mengintegrasikan sistemmu.

HALAMAN KHUSUS HARGA & SIMULASI

Rp25.000 Sekali Bayar · Rp0 Biaya Bulanan

Untuk harga barang Rp500.000 ke bawah, uang masuk ke saldomu utuh 100% (kode unik Rp100–Rp250 dibayar pembeli). Untuk harga di atas Rp500.000 hanya dikenakan 1%.

REST API · WEBHOOK HMAC · SANDBOX

Dokumentasi API Lengkap (cURL, Node.js, PHP, Python)

Panduan 16 bagian dari Kredensial, Buat Tagihan, Ambil/Daftar/Batalkan Tagihan, Saldo, Penarikan, Verifikasi Webhook HMAC-SHA256, hingga Sandbox Simulator.

Pertanyaan umum

Hal yang paling sering ditanyakan sebelum mulai menerima pembayaran QRIS otomatis.

Cukup 3 langkah: (1) Buat akun dan selesaikan aktivasi sekali bayar Rp25.000, (2) Unggah atau tempelkan QRIS tokomu di menu Pengaturan Dashboard, lalu (3) Buat tagihan langsung dari Dashboard / Link WA, atau pasang API Key & URL Webhook di website tokomu.
Biaya pembuatan akun hanya Rp25.000 sekali bayar dan Rp0 biaya bulanan. Untuk transaksi di bawah Rp500.000 harga barang diterima utuh (kode unik Rp100–Rp250 dibayar pembeli untuk ZPay), sedangkan untuk harga di atas Rp500.000 hanya dikenakan tambahan 1% dari harga. Lihat simulasi lengkapnya di .
Saat pembeli membayar nominal unik QRIS (misal Rp50.137), sistem pembaca mutasi ZPay mendeteksi uang masuk tersebut dalam hitungan detik, mengubah status tagihan menjadi PAID, lalu menembakkan HTTP POST JSON bertanda tangan HMAC-SHA256 ke alamat callback_url website tokomu agar pesanan langsung diproses otomatis.
Semua aplikasi bank dan dompet digital yang mendukung standar QRIS Nasional: BCA mobile, myBCA, Livin' by Mandiri, BRImo, BNI Mobile, SeaBank, Jago, GoPay, DANA, OVO, ShopeePay, dan LinkAja.

Siap mengotomatiskan pembayaran QRIS tokomu?

Buat akun sekarang, hubungkan QRIS tokomu, lalu kirim tagihan QRIS dari dashboard atau langsung dari sistem tokomu.

/ Harga & Simulasi Biaya

Biaya transparan, tanpa kejutan.

Biaya pembuatan akun ringan Rp25.000 sekali bayar di awal, Rp0 biaya bulanan, dan harga barang di bawah Rp500.000 diterima utuh 100% tanpa potongan.

KALKULATOR SIMULASI TERIMA BERSIH

Hitung uang bersih yang masuk ke saldomu

Ketik harga barang yang ingin kamu jual. Sistem akan menampilkan nominal yang dibayar pembeli beserta saldo bersih yang kamu terima:

Simulasi: harga Rp50.000
Harga barang Rp50.000
+ Kode unik (dibayar pembeli) + Rp201
Pembeli membayar di QRIS Rp50.201
− Biaya ZPay (hanya kode unik) − Rp201
Masuk bersih ke saldomu Rp50.000
SEMUA FITUR
Rp0 biaya bulanan

Biaya pembuatan akun Rp25.000 sekali bayar. Tanpa kontrak, tanpa minimal transaksi. Harga barang di bawah Rp500.000 diterima utuh.

  • QRIS dinamis yang bisa dibayar dari semua e-wallet dan m-banking
  • Konfirmasi otomatis dari mutasi rekening merchant
  • Dashboard tagihan, pembayaran, saldo, dan penarikan dana
  • Halaman bayar untuk pembeli, plus bukti bayar yang bisa diunduh
  • Link pembayaran yang bisa dipakai berulang
  • REST API, webhook bertanda tangan HMAC, dan mode uji
  • Notifikasi pembayaran lunas & OTP otomatis lewat WhatsApp (Fonnte API)
Rincian biaya
Pembuatan akun (sekali bayar) Rp25.000
Biaya bulanan atau langganan Rp0
Per transaksi: kode unik (Rp100–Rp250, dibayar pembeli) Untuk
ZPay
Tambahan untuk harga di atas Rp500.000 1% dari
harga
Penarikan dana ke DANA dan bank mitra kami Rp0
Penarikan ke bank atau e-wallet lain (BI-FAST) Rp2.500
API, webhook, dan mode uji (sandbox) Rp0
Contoh: harga Rp25.000
Harga barang Rp25.000
+ Kode unik (dibayar pembeli) + Rp201
Pembeli membayar Rp25.201
− Biaya ZPay (kode unik) − Rp201
Masuk ke saldomu Rp25.000
Contoh: harga Rp600.000
Harga barang Rp600.000
+ Kode unik (dibayar pembeli) + Rp201
Pembeli membayar Rp600.201
− Biaya ZPay (kode unik + 1%) − Rp6.201
Masuk ke saldomu Rp594.000
REST API · JSON · HTTPS · EMVCO QRIS

Dokumentasi Teknis & API ZPay

Panduan lengkap integrasi pembayaran QRIS Dinamis, arsitektur pembacaan mutasi otomatis, pembuatan link bayar, rekonsiliasi saldo, hingga verifikasi kriptografi webhook HMAC-SHA256.

Base URL
Untuk AI agent

Alur setup merchant & cara kerja pembaca mutasi

Bagaimana seseorang mendaftar, menghubungkan QRIS tokonya, hingga sistem ZPay otomatis mendeteksi uang masuk dan mengirimkan webhook lunas ke website toko.

Tahap Setup
Penjelasan Teknis & Operasional
1. Aktivasi AkunRp25.000
Calon merchant membuat akun di ZPay dan membayar biaya aktivasi satu kali Rp25.000. Sistem membuat ruang kerja terisolasi beserta pasangan kunci zp_live_, zp_test_, dan whsec_.
2. Koneksi QRIS & Rekening
Merchant menempelkan payload QRIS Statis usaha mereka di Dashboard (atau memakai rekening merchant agregator ZPay) serta mendaftarkan rekening bank/DANA tujuan pencairan.
3. Konversi EMVCo Dinamis
Saat tagihan dibuat (misal Rp50.000), mesin ZPay mencari angka kode unik 3 digit yang sedang tidak terpakai di jendela 15 menit (misal +Rp137 = Rp50.137), menyuntikkan Tag 54 EMVCo, dan menghitung ulang checksum CRC-16/CCITT-FALSE.
4. Pembacaan Mutasi & Webhook
Begitu pembeli membayar Rp50.137, jembatan pembaca mutasi ZPay mendeteksi kredit masuk, mencocokkan nominal Rp50.137 dengan tagihan pending, menandai status paid, dan menembakkan HTTP POST JSON bertanda tangan HMAC-SHA256 ke callback_url toko.

Kredensial

API key untuk memanggil API, dan secret untuk memverifikasi webhook yang kami kirim ke tokomu.

API key live (zp_live_), API key uji (zp_test_), dan secret webhook dibuat di dashboard setelah akunmu aktif.

Mulai cepat

Empat langkah dari nol sampai pembayaran pertama tercatat otomatis di sistem tokomu.

1. Buat API key

Buat API key di bagian Kredensial di atas. Simpan di environment variable server, misalnya ZPAY_API_KEY. Jangan pernah menaruhnya di kode frontend atau aplikasi mobile.

Autentikasi

Setiap request API wajib membawa API key di header Authorization. Key zp_test_ untuk mode uji (lihat Sandbox).

Header
Authorization: Bearer zp_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Content-Type: application/json
API key disimpan terenkripsi dan tersembunyi di dashboard. Hanya kamu yang bisa menampilkannya lagi, dengan password akun. Curiga bocor? Buat ulang: key lama langsung mati.
Membuat ulang API key langsung mematikan key lama. Lakukan ini kalau key pernah bocor.
API key hanya untuk server-ke-server. Request dari browser tanpa key memakai sesi dashboard, bukan API key.
API key salah atau akun nonaktif dijawab 401 invalid_api_key.

Buat tagihan

POST /api/payments

Membuat tagihan QRIS dinamis dengan nominal unik. Balasan 201 berisi tagihan baru.

amountintegerwajib
Nominal dalam rupiah, Rp1.000 sampai Rp10.000.000. Kode unik ditambahkan otomatis.
referencestring
Nomor pesanan di sistemmu (maks 100 karakter). Ikut dikirim di webhook. Tidak unik: cocokkan pembayaran lewat id, bukan reference.
descriptionstring
Keterangan yang tampil di halaman bayar (maks 200 karakter).
callback_urlurl
Penerima webhook tagihan ini. Kosong = pakai URL webhook default akunmu (tagihan uji: kosong = tanpa webhook).
redirect_urlurl
Pembeli diarahkan ke sini 5 detik setelah pembayaran diterima.
expires_ininteger
Masa berlaku dalam menit, 5 sampai 60. Default 15.
Idempotency-Keyheader
Opsional. Kirim ulang request dengan key yang sama = tagihan yang sama (200), bukan tagihan baru. Pakai nomor pesanan.
import os, requests r = requests.post( "https://zpay.zeropoint.id/api/payments", headers={ "Authorization": f"Bearer {os.environ['ZPAY_API_KEY']}", "Idempotency-Key": "INV-2041", }, json={"amount": 50000, "reference": "INV-2041", "description": "Paket Premium 1 bulan"}, timeout=15, ) r.raise_for_status() tagihan = r.json() # simpan tagihan["id"] di pesananmu (dipakai mencocokkan webhook, bukan reference) print(tagihan["pay_url"])
Respons 201
{ "id": "ZPY-7K3M9QX4R81P2", "reference": "INV-2041", "description": "Paket Premium 1 bulan", "status": "pending", "base_amount": 50000, "unique_code": 137, "amount": 50137, "qris": "0002010102122661...6304A1B2", "pay_url": "https://zpay.zeropoint.id/pay/ZPY-7K3M9QX4R81P2", "callback_url": "https://tokoku.id/webhook/zpay", "redirect_url": "https://tokoku.id/pesanan/INV-2041", "created_at": "2026-08-24T03:00:00.000Z", "expires_at": "2026-08-24T03:15:00.000Z", "paid_at": null, "late": false, "livemode": true, "link_id": null, "payment": null }
Tampilkan amount (sudah termasuk kode unik) ke pembeli. Pembayaran dengan nominal berbeda tidak bisa dicocokkan otomatis.

Ambil tagihan

GET /api/payments/:id

Status terbaru satu tagihan, termasuk detail pembayaran dan riwayat webhook-nya.

r = requests.get( "https://zpay.zeropoint.id/api/payments/ZPY-7K3M9QX4R81P2", headers={"Authorization": f"Bearer {os.environ['ZPAY_API_KEY']}"}, timeout=15, ) print(r.json()["status"])

Setelah lunas, objek payment berisi issuer (bank atau e-wallet pembayar), payer (nama yang sudah disamarkan bank), bca_ref (nomor referensi transaksi), dan transaction_at. Field webhooks berisi 20 pengiriman terakhir.

Struk gambar (PNG) untuk dikirim ke pembeli: GET /api/payments/:id/receipt.png. Hanya tagihan lunas, selain itu 404 not_paid.

Daftar tagihan

GET /api/payments

Tagihan milikmu, terbaru lebih dulu, dengan paginasi berbasis waktu.

statusstring
Saring: pending, paid, expired, atau cancelled.
from, toISO 8601
Rentang waktu, from ikut, to tidak ikut.
bystring
paid = rentang dan urutan memakai waktu bayar. Default waktu dibuat.
qstring
Cari di referensi, keterangan, ID, ref bank, nama pembayar, atau nominal persis.
issuerstring
Bank atau e-wallet pembayar, mis. DANA.
summary1
Tambahkan ringkasan: jumlah dan total seluruh hasil filter, per status, dan per sumber.
limitinteger
Jumlah per halaman, 1 sampai 200. Default 50.
before, before_idISO 8601, string
Halaman berikutnya: isi dengan next_before dan next_before_id dari respons sebelumnya.
page = None while True: params = {"status": "paid", "limit": 100} if page: params |= {"before": page["next_before"], "before_id": page["next_before_id"]} page = requests.get("https://zpay.zeropoint.id/api/payments", params=params, headers={"Authorization": f"Bearer {os.environ['ZPAY_API_KEY']}"}).json() for t in page["data"]: print(t["reference"], t["amount"]) if not page["has_more"]: break
Respons
{ "data": [ { "id": "ZPY-7K3M9QX4R81P2", "status": "paid", "amount": 50137 } ], "has_more": true, "next_before": "2026-08-24T02:00:00.000Z", "next_before_id": "ZPY-7K3M9QX4R81P2" }

Batalkan tagihan

POST /api/payments/:id/cancel

Menutup tagihan yang masih menunggu. Pembayaran yang masuk setelah dibatalkan tidak akan dicocokkan.

requests.post("https://zpay.zeropoint.id/api/payments/ZPY-7K3M9QX4R81P2/cancel", headers={"Authorization": f"Bearer {os.environ['ZPAY_API_KEY']}"})

Tagihan yang sudah lunas, kedaluwarsa, atau batal dijawab 409 not_pending. Kalau tagihan punya callback_url, event payment.cancelled ikut dikirim.

Link pembayaran & penarikan dana

POST /api/payment-links

Membuat tautan pembayaran berulang (/l/:slug) yang bisa dibagikan di chat WhatsApp, Instagram, atau tombol beli cepat.

titlestringwajib
Judul produk atau layanan yang tampil di halaman checkout pembeli.
amountinteger | null
Nominal tetap dalam Rupiah. Kosongkan (null) jika pembeli bebas mengisi nominal sendiri (misal donasi).
slugstring
Akhiran URL khusus, misal kelas-fullstack menjadi https://zpay.zeropoint.id/l/kelas-fullstack.
POST /api/withdrawals

Menarik saldo tersedia (available) ke rekening bank atau DANA terdaftar. Gratis (Rp0) ke DANA & bank mitra, atau Rp2.500 via jalur BI-FAST ke bank lain.

Saldo

GET /api/balance

Ringkasan saldo akunmu: bisa ditarik, dana tertahan beserta jadwal cairnya, dan penarikan yang sedang berjalan.

r = requests.get( "https://zpay.zeropoint.id/api/balance", headers={"Authorization": f"Bearer {os.environ['ZPAY_API_KEY']}"}, timeout=15, ) print(r.json()["available"])
Respons
{ "currency": "IDR", "available": 1250000, // bisa ditarik sekarang "held": 340000, // tertahan, menunggu jadwal pencairan "in_process": 0, // penarikan sedang diproses "withdrawn": 5000000, // total sudah ditarik (lunas) "next_release_at": "2026-10-13T12:10:00.000Z", "upcoming": [ { "at": "2026-10-13T12:10:00.000Z", "amount": 340000, "count": 12 } ], "total_received": 1590000, // settled + held "settled": 1250000, "gross": 1620000, // total bruto tagihan lunas "fee": 30000, // total biaya layanan "platform_fee": 0, "adjustments": 0, // penyesuaian saldo oleh admin "min_withdraw": 50000, "pending_withdrawals": { "count": 0, "amount": 0 }, "server_time": "2026-10-12T10:00:00.000Z" }
Field respons
availableinteger
Saldo yang bisa ditarik sekarang (rupiah).
heldinteger
Dana sudah lunas tapi belum cair, menunggu jadwal settlement bank.
next_release_atISO 8601
Kapan sebagian dana tertahan cair berikutnya (null kalau tidak ada).
upcomingarray
Jadwal pencairan dana tertahan: { at, amount, count } per batch.
in_processinteger
Total nominal penarikan yang sedang diproses.
pending_withdrawalsobject
Penarikan yang belum selesai: { count, amount }.
withdrawninteger
Total yang sudah berhasil ditarik (lunas).
total_receivedinteger
Total bersih diterima (settled + held).
gross, feeinteger
Total bruto tagihan lunas dan total biaya layanan.
adjustmentsinteger
Penyesuaian saldo manual oleh admin (bisa minus).
min_withdrawinteger
Nominal minimal satu penarikan.
Saldo selalu live. Tagihan mode uji tidak pernah jadi uang, jadi key zp_test_ pun membaca saldo live akun yang sama.

Siklus status

Setiap tagihan dimulai dari pending dan berakhir di salah satu dari tiga status final.

pending → dana masuk, nominal cocok → paid
pending → lewat batas waktu + 5 menit → expired
pending → dibatalkan lewat dashboard/API → cancelled
Menunggu pending
QR aktif dan bisa dibayar. Mutasi rekening dicek tiap 8 detik.
Lunas paid
Kredit dengan nominal persis ditemukan di mutasi rekening dalam jendela waktu tagihan.
Kedaluwarsa expired
Lewat batas waktu + 5 menit masa tenggang tanpa pembayaran yang cocok.
Batal cancelled
Dibatalkan lewat dashboard atau API sebelum dibayar.

Webhook

Kami mengirim POST JSON ke callback_url setiap kali status tagihan berubah jadi final.

Event
Dikirim saat
payment.paid
Pembayaran cocok ditemukan, tagihan lunas. Bisa datang setelah payment.expired / payment.cancelled bila admin mencocokkan pembayaran telat (data.late = true).
payment.expired
Tagihan lewat batas waktu tanpa pembayaran.
payment.cancelled
Tagihan dibatalkan.
ping
Tombol “Kirim tes” di bagian Kredensial.
Contoh kiriman
// Header X-ZPay-Event: payment.paid X-ZPay-Delivery: 1842 X-ZPay-Timestamp: 1790218892 X-Signature: 5f2b9c...a91e // hex HMAC-SHA256(secret, "<timestamp>.<body>") // Body { "id": "evt_Qm9vK8nPz1Lx4wR7", "event": "payment.paid", "created_at": "2026-08-24T03:03:12.000Z", "livemode": true, // false = event tagihan mode uji (sandbox) "data": { "id": "ZPY-7K3M9QX4R81P2", "reference": "INV-2041", "status": "paid", "base_amount": 50000, "amount": 50137, "pay_url": "https://zpay.zeropoint.id/pay/ZPY-7K3M9QX4R81P2", "paid_at": "2026-08-24T03:03:12.000Z", "late": false, "livemode": true, "link_id": null, "payment": { "issuer": "DANA", "payer": "BU**I SAN**SO", "bca_ref": "238412255", "transaction_at": "2026-08-24T03:03:08.000Z" } } }
Verifikasi tanda tangan

Hitung HMAC-SHA256(secret, timestamp + "." + body) dari body mentah, bandingkan dengan header X-Signature memakai perbandingan waktu-konstan, dan tolak timestamp yang lebih tua dari 5 menit supaya kiriman lama tidak bisa diputar ulang.

import hashlib, hmac, os, time from flask import Flask, abort, request app = Flask(__name__) SECRET = os.environ["ZPAY_WEBHOOK_SECRET"].encode() @app.post("/webhook/zpay") def zpay(): ts = request.headers.get("X-ZPay-Timestamp", "") sig = request.headers.get("X-Signature", "") expected = hmac.new(SECRET, f"{ts}.".encode() + request.get_data(), hashlib.sha256).hexdigest() if not hmac.compare_digest(expected, sig) or abs(time.time() - int(ts or 0)) > 300: abort(401) event = request.get_json() if event.get("livemode") is False: return "", 200 # event mode uji: jangan pernah menandai pesanan asli if event["event"] == "payment.paid": # cari pesanan lewat id tagihan, BUKAN reference; nominal harus sama dengan total pesanan order = find_order_by_zpay_id(event["data"]["id"]) if order and event["data"]["base_amount"] == order.total: mark_paid(order, event["id"]) # lewati kalau event.id sudah pernah diproses return "", 200
Gagal atau bukan 2xx? Dicoba ulang 6 kali: langsung, lalu +30 detik, +2 menit, +10 menit, +30 menit, +2 jam.
Balas 2xx secepatnya (batas 10 detik). Proses berat jalankan di belakang.
Event bisa terkirim lebih dari sekali. Simpan id event yang sudah diproses dan lewati duplikatnya.
Tanda tangan valid belum berarti pesanannya benar. Simpan id tagihan saat membuatnya, cari pesanan lewat data.id (bukan reference), pastikan data.base_amount sama dengan total pesanan, dan abaikan livemode: false.
URL ke jaringan privat (localhost, 10.x, 192.168.x, metadata cloud) ditolak. Redirect tidak diikuti.

Halaman bayar

Setiap tagihan punya halaman bayar siap pakai di pay_url.

Halaman bayar menampilkan QR, nominal persis, hitung mundur, tombol cek transaksi, dan berubah sendiri saat lunas. Setelah lunas, pembeli bisa mengunduh atau mencetak bukti bayar.
Kalau ada redirect_url, pembeli diarahkan ke sana 5 detik setelah lunas. Tagihan mode uji tidak dialihkan otomatis: alamatnya ditampilkan dan harus diklik.
Mau tampil di aplikasimu sendiri? Buat gambar QR dari string qris dengan library QR apa pun.
Jangan anggap pesanan lunas hanya karena pembeli kembali ke redirect_url. Selalu pegang webhook atau cek status lewat API.
Kepala halaman bayar menampilkan logo, nama toko, dan centang verifikasi dari Akun → Profil toko.
Tagihan dari link pembayaran (/l/:slug) punya link_id, reference kosong, dan webhook-nya dikirim ke URL webhook default akunmu.

Error & batasan

Semua error berbentuk { "error": "pesan untuk manusia", "code": "kode_mesin" }.

HTTP
code
Artinya
400
invalid_amount, invalid_url, invalid_expires_in, invalid_json, invalid_action
Input tidak valid. Baca pesan error-nya.
401
unauthorized, invalid_api_key
API key tidak ada, salah, atau sudah dibuat ulang.
403
account_not_active, forbidden, live_invoice
Akun belum disetujui/nonaktif, tidak punya akses, atau simulasi pada tagihan live.
404
not_found
Tagihan tidak ada atau bukan milikmu.
409
not_pending, not_final
Aksi tidak cocok dengan status tagihan saat ini.
413
payload_too_large
Body lebih dari 20 KB.
429
rate_limited, too_many_pending
Terlalu banyak request. Lihat header Retry-After.
503
amount_busy
Kode unik untuk nominal itu habis sementara. Coba lagi sebentar.
Nominal Rp1.000 sampai Rp10.000.000, ditambah kode unik kecil (default Rp100 sampai Rp250; baca unique_code di respons).
Masa berlaku 5 sampai 60 menit (default 15), plus 5 menit masa tenggang.
Tagihan menunggu Maksimal 50 per akun dalam satu waktu.
Pembuatan Maksimal 30 tagihan per menit per akun.
Request Maksimal 300 request per menit per alamat IP.
Body JSON maksimal 20 KB per request.

Coba langsung (Live API Playground)

Uji pengiriman request POST /api/payments langsung dari halaman dokumentasi ini dan lihat respons JSON mentahnya.

// Klik tombol "Kirim Request POST /api/payments" di sebelah kiri // untuk mengeksekusi simulasi pembuatan tagihan QRIS Dinamis.

Sandbox (mode uji)

POST /api/payments/:id/simulate

Uji integrasi dari buat tagihan sampai webhook tanpa uang sungguhan. Data uji terpisah total dari data live.

Pakai API key zp_test_ dari bagian Kredensial. Endpoint-nya sama persis; tagihan uji punya livemode: false.
QR tagihan uji sengaja tidak bisa dibayar. Lunasi atau kedaluwarsakan lewat endpoint ini, atau tombol di halaman bayarnya.
Webhook uji hanya dikirim ke callback_url yang diisi saat membuat tagihan uji (bukan URL default), ditandatangani secret mode uji. Server produksi yang memakai secret live otomatis menolaknya; tetap abaikan livemode: false.
Key live tidak bisa membaca tagihan uji, dan sebaliknya. Tagihan uji tidak masuk saldo, statistik, atau notifikasi.
actionstring
pay = lunas (issuer SANDBOX, bca_ref palsu), expire = kedaluwarsa. Default pay. Hanya untuk tagihan uji yang masih pending.
r = requests.post( "https://zpay.zeropoint.id/api/payments/ZPY-7K3M9QX4R81P2/simulate", headers={"Authorization": f"Bearer {os.environ['ZPAY_TEST_KEY']}"}, json={"action": "pay"}, # atau "expire" timeout=15, ) print(r.json()["status"])

Tagihan live dijawab 403 live_invoice, tagihan uji yang sudah final 409 not_pending. Tagihan uji yang tidak disimulasikan kedaluwarsa sendiri seperti tagihan live.

/ Panduan & Kurikulum Resmi

Akademi & Panduan Pembayaran QRIS ZPay

Kurikulum terstruktur seputar cara kerja QRIS Dinamis, kode unik, pencegahan bukti transfer palsu, hingga arsitektur webhook HMAC-SHA256 untuk penjual UMKM maupun software engineer.

MODUL UTAMA PILIHAN · WAJIB BACA

Bagaimana Konfirmasi Pembayaran QRIS Otomatis Bekerja Menggantikan Cek Mutasi Manual 24 Jam

Pelajari dari hulu ke hilir bagaimana sistem ZPay mengubah QRIS Statis menjadi QRIS Dinamis berstandar EMVCo, menyisipkan 3 digit kode unik, membaca notifikasi bank dalam hitungan detik, dan menangkal struk transfer editan.

Mulai Baca Modul Utama → Waktu baca: 6 menit · Dilengkapi studi kasus nyata
RINGKASAN KURIKULUM INTI
1. Konversi EMVCo Tag 54 Otomatis
2. Identifikasi 3 Digit Unik Rp100–Rp250
3. Keamanan Struk Editan 100% Kebal
JALUR 01 · NON-TEKNIS / UMKM 3 Langkah Cepat

Jalur Cepat Pemilik Toko & Admin WA

Cocok untuk jualan di WhatsApp, Instagram, atau kasir toko fisik tanpa perlu menulis kode program.

JALUR 02 · SOFTWARE ENGINEER 3 Langkah Teknis

Jalur Integrasi Full REST API & Webhook

Cocok untuk mengotomatiskan checkout website, bot Telegram/WA, dan SaaS 24 jam penuh.

Fondasi Dasar QRIS & Keamanan Toko (Format Ringkas)
Panduan Operasional Penjual & UMKM
Modul Teknis Developer & Integrasi Server

Mulai terima QRIS hari ini

Tanpa biaya bulanan. Buat akun, hubungkan QRIS tokomu, lalu kirim tagihan pertamamu.

/ Tentang

Tentang ZPay

ZPay membantu toko dan developer menerima pembayaran QRIS dengan konfirmasi otomatis, tanpa menunggu bukti transfer dan tanpa cek mutasi manual.

Apa itu ZPay

ZPay adalah payment gateway QRIS yang bekerja di atas rekening merchant QRIS. Setiap tagihan mendapat QRIS dinamis dengan nominal unik, jadi setiap uang yang masuk bisa dicocokkan ke tagihan yang tepat secara otomatis. Toko langsung tahu kapan pembeli sudah membayar, dan sistemnya bisa langsung memproses pesanan.

Cara kerjanya

  1. Buat tagihan dari dashboard, link pembayaran, atau satu request API. Nominalnya ditambah kode unik kecil (Rp100 sampai Rp250).
  2. Pembeli memindai QRIS dari aplikasi bank atau e-wallet apa pun. Nominal sudah terisi, pembeli tinggal konfirmasi.
  3. ZPay membaca mutasi rekening merchant setiap beberapa detik selama ada tagihan terbuka, lalu menandai tagihan lunas saat nominalnya cocok.
  4. Toko diberi kabar lewat webhook, dashboard, dan Telegram/WhatsApp. Saldo toko bertambah dan bisa ditarik sesuai jadwal pencairan bank.

Rekening dan nama merchant

Semua pembayaran diterima lewat rekening merchant QRIS yang terhubung dengan ZPay. Nama merchant yang tampil di aplikasi pembeli saat memindai QR adalah nama yang terdaftar di QRIS tersebut, yaitu ZERO POINT (atau nama QRIS usaha milikmu sendiri). Saldo setiap toko dicatat terpisah di ZPay dan dicairkan ke rekening bank atas nama pemilik toko.

Untuk siapa

  • Toko dan UMKM: buat tagihan dari dashboard atau bagikan link pembayaran, tanpa perlu menulis kode.
  • Developer: REST API, webhook bertanda tangan HMAC, idempotency key, dan mode uji untuk menguji integrasi tanpa uang sungguhan. Lihat .

Biaya

ZPay hanya mengenakan biaya pembuatan akun Rp25.000 sekali bayar tanpa biaya bulanan, dan penarikan dana gratis ke DANA serta bank mitra kami (ke bank lain Rp2.500 per penarikan). Biaya per transaksi hanya kode unik kecil yang dibayar pembeli, plus 1% untuk harga di atas Rp500.000. Rinciannya ada di halaman .

Keamanan

  • Semua koneksi memakai HTTPS. Password disimpan sebagai hash scrypt; API key disimpan terenkripsi dan hanya bisa ditampilkan pemiliknya dengan password.
  • Setiap toko hanya bisa melihat tagihan dan pembayarannya sendiri. Aksi penting (API key, rekening pencairan, tautan Telegram) wajib password akun.
  • Setiap webhook ditandatangani HMAC-SHA256 supaya server tokomu bisa memastikan kiriman benar dari ZPay.
  • Database dibackup otomatis dan terenkripsi; setiap perubahan penting tercatat di log audit.

Perusahaan

ZPay adalah layanan milik ZERO POINT Studio, unit rekayasa sistem pembayaran dan otomasi digital di bawah ekosistem resmi zeropoint.id.

  • Pemilik dan pendiri: Muhammad Asep Solihin
  • Platform resmi: zeropoint.id

Hubungi kami

Pertanyaan soal pendaftaran, pembayaran, atau integrasi: email zpointing0@gmail.com, WhatsApp 0858-8327-8505, atau kunjungi @zeropoint.id.

ZPay Logo ZPay
INFRASTRUKTUR PEMBAYARAN QRIS OTOMATIS

Satu akun untuk menerima QRIS Dinamis dari seluruh bank & e-wallet Indonesia.

Tidak perlu lagi mengecek mutasi rekening manual atau khawatir tertipu screenshot bukti transfer editan. Hubungkan QRIS tokomu dan biarkan ZPay bekerja 24 jam penuh.

1
Biaya Pembuatan Akun Rp25.000 Sekali Bayar
Tanpa biaya langganan bulanan. Aktif selamanya untuk UMKM maupun Developer.
2
Rp0 Potongan untuk Transaksi ≤ Rp500.000
Harga barang diterima utuh 100%. Tambahan 1% hanya untuk transaksi di atas Rp500.000.
3
REST API, Webhook HMAC-SHA256 & Link Bayar WA
Dilengkapi kunci API Live (zp_live_) dan Sandbox (zp_test_) siap pakai.
© 2026 ZPay · ZERO POINT Payment Infrastructure Enkripsi TLS 1.3 & Scrypt Hash
PORTAL AKUN MERCHANT ZPAY

Buat Akun Merchant ZPay

Daftarkan tokomu dalam 30 detik dan langsung akses Dashboard QRIS Dinamis serta kunci API Sandbox/Live.

Ingin langsung melihat isi lengkap Dashboard Merchant ZPay?
PANEL KENDALI MERCHANT ZPAY

Dashboard Toko Berkah Digital

API Key Aktif: zp_live_99281a8f3c
Saldo Tersedia (Siap Tarik)
Rp 4.850.000
Gratis tarik ke DANA / Mitra
Volume QRIS Lunas Hari Ini
Rp 1.925.412
38 tagihan terkonfirmasi otomatis
Dana Tertahan (Menunggu Cair)
Rp 340.000
Cair otomatis pukul 19:10 WIB
Kecepatan Match Mutasi
2,8 Detik
Webhook delivery 100% (200 OK)

Buat Tagihan QRIS Cepat (Kasir / Chat WA)

Otomatis +Kode Unik

Status Koneksi Sistem Toko

NMID Merchant QRIS ID1026630618860
Biaya Transaksi ≤ Rp500.000 Rp0 (Utuh 100%)
Endpoint Webhook Toko Aktif (HMAC-SHA256)

5 Transaksi QRIS Terbaru

ID Tagihan Pesanan / Reference Nominal Unik Pembayar (Issuer) Status