Panduan: Membuat Transaksi

Diperbarui 15 Okt 2026

API ini aktif untuk gateway.astrapay.biz.id (Base URL: https://gateway.astrapay.biz.id). Auth memakai header x-api-key: pk_live_xxx per project. Rate limit 100/menit per API Key.

Daftar isi Panduan

  1. Memulai & Persyaratan
  2. Cara Kerja Pembayaran (Untuk Pemula)
  3. Membuat Transaksi (API)
  4. Payment Link (Halaman Bayar Siap Pakai)
  5. Status Transaksi & Cek Order
  6. Webhook (Notifikasi Otomatis)
  7. Error & Rate Limit
  8. Metode Pembayaran
  9. Contoh Kode Integrasi (PHP, JS, Python)

Persyaratan

Untuk membuat transaksi, Anda harus memiliki akun dan Proyek di AstraPay Gateway. Dari proyek tersebut, Anda mengambil slug, api_key, dan webhook_secret-nya.

Jika belum memiliki, silakan daftar, login, lalu buat project di dashboard → Project. API key hanya tampil sekali saat dibuat. Project nonaktif / key salah → 401. Key sandbox pk_test_* ditolak di live → 403.

Cara Kerja Pembayaran (Untuk Pemula)

AstraPay Gateway memudahkan Anda menerima pembayaran QRIS tanpa verifikasi manual slip transfer:

  1. Membuat Order: Toko Anda membuat tagihan melalui API atau tombol Buat Transaksi di dashboard.
  2. Mendapatkan QRIS & Kode Unik: Sistem menerbitkan QRIS dengan nominal yang ditambahkan kode unik kecil (contoh: tagihan Rp 50.000 menjadi Rp 50.123). Kode unik ini yang menjadi penanda otomatis transaksi Anda.
  3. Customer Membayar: Customer memindai QRIS memakai aplikasi apa saja (BCA, Mandiri, BRI, BNI, GoPay, OVO, Dana, ShopeePay, dll) dan membayar nominal tepat sampai 3 digit terakhir.
  4. Otomatis Lunas: Sistem membaca mutasi masuk secara instan (1–3 detik). Transaksi otomatis berubah status menjadi paid, saldo toko Anda langsung bertambah, dan webhook otomatis diteruskan ke server toko Anda.

Pengaturan Biaya (Fee Payer)

Biaya QRIS adalah 0.7%. Di detail proyek, Anda bebas memilih siapa yang menanggung biaya:

API

API ini memakai 1 QRIS pusat di gateway.astrapay.biz.id. Selalu kirim reference unik (misal INV-001) agar rekonsiliasi pesanan Anda mudah dilacak.

Rate Limit

Endpoint

POST https://gateway.astrapay.biz.id/api/orders/{slug}
GET  https://gateway.astrapay.biz.id/api/orders/{slug}?status=pending&per_page=15
GET  https://gateway.astrapay.biz.id/api/orders/{slug}/k7x2m9qd4zp-1760524800

Wajib: {slug} = slug project kamu + header x-api-key milik slug tersebut. Key project lain ditolak walau valid.

Request

curl --request POST \
  --url https://gateway.astrapay.biz.id/api/orders/tokosaya \
  --header 'Content-Type: application/json' \
  --header 'x-api-key: pk_live_xxx' \
  --data '{
    "amount": 50000,
    "reference": "INV-001",
    "webhook_url": "https://tokomu.com/webhook",
    "redirect_url": "https://tokomu.com/thanks",
    "expires_in": 600
  }'

Body Parameter

PropertyTypeRequiredKeterangan
amountintegerYaNominal rupiah. min 100, max 100.000.000. QRIS praktis ±10jt/scan ikut limit regulasi BI.
referencestringTidakNo. invoice kamu, max 100 char.
webhook_urlstringTidakEstafet notifikasi order.paid saat transaksi lunas. Max 255 char.
redirect_urlstringTidakURL redirect customer setelah pembayaran berhasil/batal. Max 500 char.
expires_inintegerTidakDetik kedaluwarsa. min 300, max 600, default 600. QRIS selalu expired 10 menit (WIB).

Metode pembayaran yang didukung:

Response

Response sukses (HTTP 201 Created):

{
  "ok": true,
  "data": {
    "id": "k7x2m9qd4zp-1760524800",
    "reference": "INV-001",
    "base_amount": 50000,
    "fee_qris": 350,
    "service_fee": 351,
    "credit_amount": 50000,
    "pay_amount": 50351,
    "redirect_url": "https://tokomu.com/thanks",
    "status": "pending",
    "is_sandbox": false,
    "qris": "000201010212...",
    "checkout_url": "https://gateway.astrapay.biz.id/pay/k7x2m9qd4zp-1760524800",
    "expires_at": "2026-10-15T12:15:00+07:00",
    "paid_at": null
  }
}

fee_qris = round(amount × 0.7%) (50.000 → 350). pay_amount = amount + fee_qris + kode_unik. Kode unik = bilangan terkecil mulai dari 1 yang belum dipakai order pending lain; otomatis bebas dipakai lagi setelah order lama paid/expired/cancelled. Customer membayar persis total ini.

Payment link (Halaman Bayar Siap Pakai)

1. Pakai Link Checkout Langsung (Tanpa Koding)

Jika Anda tidak ingin membuat antarmuka sendiri, cukup berikan link checkout_url (contoh: https://gateway.astrapay.biz.id/pay/k7x2m9qd4zp-1760524800) kepada pembeli. Halaman ini sudah otomatis memeriksa status pembayaran tiap 2 detik dan menampilkan countdown waktu.

2. Tampilkan QR Sendiri di Website Kamu

Ambil field qris dari response JSON lalu render menjadi gambar QR di website Anda menggunakan library QRCode generator apa saja. Customer scan pakai GoPay / ShopeePay / m-banking apa saja.

3. Redirect & Cek Publik Tanpa API Key

Kirim redirect_url saat buat order (atau tempel ?redirect=https://tokomu.com/thanks di checkout_url). Setelah paid, buyer otomatis kembali ke web merchant dalam 10 detik. Frontend Anda juga bisa mengecek status tanpa API Key:

GET https://gateway.astrapay.biz.id/pay/k7x2m9qd4zp-1760524800/status
{"status":"pending","pay_amount":50351,"expires_at":"..."}

Status Transaksi

Detail order bisa dicek kapan saja dari backend Anda menggunakan ID order sistem ATAU nomor invoice/reference Anda:

GET https://gateway.astrapay.biz.id/api/orders/{slug}/k7x2m9qd4zp-1760524800
GET https://gateway.astrapay.biz.id/api/orders/{slug}/INV-001

Wajib menyertakan header x-api-key: pk_live_xxx.

Webhook (Notifikasi Otomatis ke Server Kamu)

Saat pembayaran berhasil diterima, server AstraPay Gateway akan mengirimkan request HTTP POST ke webhook_url Anda:

POST ke webhook_url kamu saat transaksi status paid:
{
  "event": "order.paid",
  "data": {
    "id": "k7x2m9qd4zp-1760524800",
    "reference": "INV-001",
    "base_amount": 50000,
    "fee_qris": 350,
    "pay_amount": 50351,
    "status": "paid",
    "paid_at": "2026-10-15T12:05:00+07:00"
  }
}

Notifikasi ditandatangani memakai Webhook Secret project kamu (dapat dilihat di dashboard → detail proyek → Integrasi):

x-pg2-signature: v1=HMAC-SHA256(secret, timestamp + "." + rawBody)
x-pg2-timestamp: 1760524800

Verifikasi signature di server kamu lalu balas dengan HTTP response 200 OK. Untuk keamanan ekstra, Anda tetap dapat memverifikasi ulang via GET https://gateway.astrapay.biz.id/api/orders/{slug}/{order} (header x-api-key) sebelum melepas barang/jasa.

Error & Rate Limit

KodeArtiAksi / Solusi
401Key kosong / salah / bukan milik slug iniGunakan API key dari project yang slug-nya dipanggil
403pk_test ditolak di mode liveGanti dengan API key live (pk_live_*)
404Slug project tidak ditemukan / nonaktifCek penulisan slug di dashboard Proyek
404Order tidak ditemukan (atau beda project)Cek id order / invoice reference + slug project yang sesuai
422amount <100 / URL tidak valid / expires_in di luar 300–600Perbaiki format dan nilai data payload request
429Lebih dari 100 request per menit per API keyBeri jeda pada panggilan API (retry dengan backoff)
502Mesin lokal gagal (provider-service belum aktif / nomor GoPay pusat terputus)Pastikan koneksi GoPay pusat terhubung di panel admin

Metode Pembayaran

KodeNamaMinimalMaksimal
payment_linkPayment LinkRp 100Rp 100.000.000
qrisQRIS (Semua Bank & e-Wallet)Rp 100Rp 100.000.000

Contoh Kode Integrasi

PHP (cURL)

<?php
$ch = curl_init("https://gateway.astrapay.biz.id/api/orders/tokosaya");
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST => true,
    CURLOPT_HTTPHEADER => [
        'Content-Type: application/json',
        'x-api-key: pk_live_xxxxxxxxxxxxxxxxxxxxxxxx',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'amount' => 50000,
        'reference' => 'INV-001',
        'webhook_url' => 'https://tokomu.com/webhook',
        'redirect_url' => 'https://tokomu.com/thanks',
        'expires_in' => 600,
    ]),
]);
$res = json_decode(curl_exec($ch), true);
curl_close($ch);

if ($res['ok'] ?? false) {
    header('Location: ' . $res['data']['checkout_url']);
    exit;
}

Node.js / JavaScript (Fetch)

const response = await fetch('https://gateway.astrapay.biz.id/api/orders/tokosaya', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'x-api-key': 'pk_live_xxxxxxxxxxxxxxxxxxxxxxxx',
  },
  body: JSON.stringify({
    amount: 50000,
    reference: 'INV-001',
    webhook_url: 'https://tokomu.com/webhook',
    redirect_url: 'https://tokomu.com/thanks',
    expires_in: 600,
  }),
});
const result = await response.json();
console.log(result.data.checkout_url);

Python (Requests)

import requests

res = requests.post(
    "https://gateway.astrapay.biz.id/api/orders/tokosaya",
    headers={"x-api-key": "pk_live_xxxxxxxxxxxxxxxxxxxxxxxx"},
    json={
        "amount": 50000,
        "reference": "INV-001",
        "webhook_url": "https://tokomu.com/webhook",
        "redirect_url": "https://tokomu.com/thanks",
        "expires_in": 600,
    }
)
print(res.json()["data"]["checkout_url"])