AutoGopay
Dokumentasi

Panduan & API Reference

Dari menghubungkan GoPay Merchant sampai menerima webhook pembayaran. Base URL: https://pga-pay.vip/api/v1

Panduan Memulai

Ikuti 6 langkah berikut untuk menerima pembayaran QRIS pertama Anda.

  1. 1

    Daftar akun

    Buka /register (email atau Google). Paket trial gratis otomatis aktif bila disediakan admin. Jika tidak, pilih paket di menu Langganan.

  2. 2

    Siapkan QRIS statis

    Buka aplikasi GoBiz (atau stiker QRIS Gojek), scan kode QR dengan aplikasi pemindai QR biasa, lalu salin teks hasilnya. Teks diawali 000201 dan berakhir dengan 4 karakter CRC.

  3. 3

    Hubungkan GoPay

    Menu Hubungkan GoPay → masukkan nomor HP merchant → masukkan kode OTP yang dikirim lewat SMS/WhatsApp → pilih merchant dan tempel string QRIS statis. OTP tidak disimpan; token disimpan terenkripsi dan bisa dihapus lewat tombol Putuskan.

  4. 4

    Uji lewat dashboard

    Menu Pembayaran → Buat tagihan uji dengan nominal kecil (mis. Rp1.000). Bayar QR yang muncul memakai e-wallet apa pun. Status akan berubah menjadi Lunas otomatis dan notifikasi muncul realtime.

  5. 5

    Buat API key

    Menu API & Webhook → Buat key. Salin key (diawali iak_) dan simpan sebagai environment variable di server Anda. Key tidak akan ditampilkan lagi.

  6. 6

    Pasang webhook (disarankan)

    Isi URL webhook default di menu yang sama, tekan Kirim webhook tes, lalu verifikasi signature seperti contoh pada bagian Verifikasi Signature.

Cara kerja deteksi pembayaran. Setiap tagihan diberi kode unik 1–99 yang ditambahkan ke nominal (mis. Rp50.000 → Rp50.037). Sistem membaca mutasi akun GoPay Merchant Anda, lalu mencocokkan nominal persis dengan tagihan pending. Karena itu pelanggan harus membayar sesuai total_amount, bukan amount awal.

Autentikasi

Sertakan API key pada setiap request lewat header X-API-Key (atau Authorization: Bearer <key>). Semua request dan respons berformat JSON. Gunakan HTTPS dan jangan pernah menaruh API key di kode front-end.

X-API-Key: iak_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Content-Type: application/json

Format respons:

// sukses
{ "success": true, "data": { ... } }

// gagal
{ "success": false, "error": { "code": "invalid_amount", "message": "..." } }

Rate limit: 120 request/menit per API key. Berlebih → HTTP 429 rate_limited.

GET /api/v1/account mengembalikan status langganan dan koneksi GoPay — cocok untuk tes API key.

Buat Pembayaran

POST https://pga-pay.vip/api/v1/payment/create

ParameterTipeWajibKeterangan
amountintegerYaNominal rupiah (1 – 10.000.000), tanpa desimal.
referencestringTidakID order di sistem Anda (maks 100). Idempotent: memanggil ulang dengan reference & amount sama selagi pending mengembalikan tagihan yang sama.
descriptionstringTidakCatatan internal (maks 190).
expire_minutesintegerTidakMasa berlaku 5 – 1440 menit. Default 30.
callback_urlstringTidakURL webhook khusus tagihan ini (menimpa webhook default). Harus URL http(s) publik.
use_unique_codebooleanTidakDefault true. Jika false, tidak ada kode unik; hanya satu tagihan pending per nominal yang sama.

Contoh request:

Respons 201 Created:

{
  "success": true,
  "data": {
    "payment_id": "pay_3f9a1c0b7d2e4a5f6b81",
    "reference": "INV-90281",
    "description": null,
    "status": "pending",
    "amount": 50000,
    "unique_code": 37,
    "total_amount": 50037,
    "qris_string": "00020101021226...6304ABCD",
    "payment_url": "https://pga-pay.vip/pay/pay_3f9a1c0b7d2e4a5f6b81",
    "expires_at": "2026-10-10T15:30:00+07:00",
    "paid_at": null,
    "created_at": "2026-10-10T15:00:00+07:00",
    "idempotent": false
  }
}

Dua cara menampilkan pembayaran ke pelanggan: (1) arahkan ke payment_url — halaman checkout dengan QR, hitung mundur, dan status live; atau (2) render sendiri qris_string menjadi QR code di aplikasi Anda dan tampilkan total_amount.

Cek Status

GET https://pga-pay.vip/api/v1/payment/status/{payment_id}

{payment_id} boleh berupa payment_id maupun reference milik Anda. Memanggil endpoint ini juga memicu pengecekan mutasi (maks sekali per ±5 detik per akun).

curl https://pga-pay.vip/api/v1/payment/status/INV-90281 -H "X-API-Key: $AUTOGOPAY_KEY"

Status: pending → paid | expired | cancelled. Sebaiknya jadikan webhook sebagai sumber utama dan status polling sebagai cadangan (interval ≥ 5 detik).

Daftar & Batalkan

GET https://pga-pay.vip/api/v1/payment/list?status=paid&limit=20&page=1

Parameter opsional: status (pending|paid|expired|cancelled), limit (1–100), page. Respons berisi payments[] dan pagination.

POST https://pga-pay.vip/api/v1/payment/cancel

curl -X POST https://pga-pay.vip/api/v1/payment/cancel \
  -H "X-API-Key: $AUTOGOPAY_KEY" -H "Content-Type: application/json" \
  -d '{"payment_id": "pay_3f9a1c0b7d2e4a5f6b81"}'

Hanya tagihan pending yang bisa dibatalkan; selain itu → 409 not_cancellable.

Objek Payment

payment_idID unik tagihan (pay_ + 20 hex).
referenceID order dari sistem Anda.
statuspending | paid | expired | cancelled.
amountNominal asal (integer rupiah).
unique_codeKode unik 0–99 yang ditambahkan.
total_amountamount + unique_code — nominal yang harus dibayar pelanggan.
qris_stringPayload QRIS dinamis (EMV), render sebagai QR.
payment_urlHalaman checkout publik.
expires_at / paid_at / created_atWaktu format ISO 8601 (zona Asia/Jakarta).

Webhook

Saat status tagihan berubah, kami mengirim POST JSON ke callback_url tagihan atau URL webhook default Anda. Balas dengan HTTP 2xx secepatnya (timeout 8 detik).

Event: payment.paid, payment.expired, payment.cancelled, payment.test (tombol uji).

Header:

Content-Type: application/json
User-Agent: AutoGopay-Webhook/1.0
X-AutoGopay-Event: payment.paid
X-AutoGopay-Delivery: 1042
X-AutoGopay-Timestamp: 1791626400
X-AutoGopay-Signature: sha256=9b74c9897bac770ffc029102a200c5de...

Body:

{
  "event": "payment.paid",
  "created_at": "2026-10-10T15:01:12+07:00",
  "data": { "payment_id": "pay_3f9a...", "reference": "INV-90281", "status": "paid", "amount": 50000, "total_amount": 50037, "paid_at": "2026-10-10T15:01:12+07:00", ... }
}

Retry: bila gagal (non-2xx / timeout), pengiriman diulang dengan jeda 1 mnt, 5 mnt, 15 mnt, 1 jam, 6 jam (maks 6 percobaan). Webhook bisa terkirim lebih dari sekali — buat handler Anda idempoten (cek payment_id sudah diproses atau belum).

Verifikasi Signature

Signature = HMAC-SHA256(secret, timestamp + "." + raw_body) dalam hex. secret ada di menu API & Webhook (diawali whsec_). Selalu hitung dari raw body (bukan hasil re-encode JSON) dan tolak bila timestamp lebih dari 5 menit.

Kode Error

HTTPcodeArti
400invalid_jsonBody bukan JSON valid.
401missing_api_key / invalid_api_keyHeader kosong atau key salah/dicabut.
402subscription_inactiveLangganan belum aktif / habis.
403account_suspendedAkun ditangguhkan admin.
403email_unverifiedEmail akun belum diverifikasi (bila admin mewajibkannya).
404not_foundPembayaran / endpoint tidak ditemukan.
409gopay_not_connectedGoPay belum terhubung atau sesi berakhir.
409duplicate_reference / reference_in_usereference sudah lunas / punya tagihan pending berbeda.
409too_many_pending / not_cancellableSlot nominal habis / status tidak bisa dibatalkan.
413payload_too_largeBody > 64 KB.
422invalid_amount / invalid_expire / invalid_callback_url / invalid_referenceValidasi parameter gagal.
429rate_limitedMelebihi 120 request/menit.
500server_errorKesalahan server.

Praktik Terbaik

  • Selalu gunakan reference unik per order agar pembuatan tagihan aman diulang (idempotent).
  • Tampilkan total_amount (bukan amount) dan peringatkan pelanggan untuk membayar persis nominal tersebut.
  • Anggap webhook sebagai sumber kebenaran utama; polling status hanya cadangan dan jangan lebih sering dari 5 detik.
  • Verifikasi signature + timestamp, dan buat handler idempoten.
  • Simpan API key & webhook secret di environment variable; cabut dan buat ulang bila bocor.
  • Untuk transaksi bernilai besar, cocokkan juga di aplikasi GoBiz Anda sebelum mengirim barang.

Troubleshooting

Pastikan pelanggan membayar tepat sama dengan total_amount dan masih dalam masa berlaku. Buka menu Hubungkan GoPay → Tes koneksi. Bila sesi berakhir, hubungkan ulang dengan OTP.
Itu balasan gateway GoBiz: alamat endpoint login tidak dikenali di host yang dipanggil (GoBiz bisa memindahkan/mengubah endpoint). Sistem otomatis mencoba host alternatif; jalankan Admin → Pengaturan → "Tes koneksi GoBiz" (tanpa mengirim OTP) untuk melihat host mana yang aktif. Jika semua host menjawab "no Route matched", path endpoint berubah dan perlu diperbarui; jika "Tidak terjangkau"/"Diblokir", hosting memblokir koneksi keluar atau IP-nya ditolak GoBiz/Cloudflare.
OTP login GoBiz/GoPay Merchant dikirim lewat SMS, bukan WhatsApp. Pastikan nomor terdaftar di GoBiz, SIM aktif dan bisa menerima SMS (cek folder spam/pesan terblokir), tunggu ±2 menit lalu pakai tombol Kirim ulang. Terlalu sering meminta OTP dapat dibatasi sementara; tunggu 15 menit.
Akun belum terhubung, QRIS statis belum diisi, atau Anda memutus koneksi. Selesaikan 3 langkah di menu Hubungkan GoPay.
Pastikan string QRIS statis disalin utuh dari hasil scan. Uji dengan nominal kecil menggunakan beberapa aplikasi pembayaran sebelum dipakai produksi.
Cek menu API & Webhook → Pengiriman terakhir (status & kode HTTP). URL harus publik (bukan localhost/IP privat) dan merespons 2xx dalam 8 detik.

Layanan ini memakai antarmuka tidak resmi GoBiz; lihat Syarat & Ketentuan terkait risiko akun.