Lewati ke konten utama
← Kembali ke dokumentasi

Referensi API

Endpoint REST untuk plugin DHRU dan integrasi langsung.

Referensi API

Base URL: https://triapay.net. Permintaan server-to-server diotentikasi dengan Authorization: Bearer <api_key>. Sesi browser menggunakan cookie yang diset oleh /auth/login plus token CSRF dari /auth/csrf.

Otentikasi

Dua tingkat key per akun:

Prefiks Penggunaan
pk_live_* Produksi. Tidak dapat dilihat ulang setelah dibuat. Putar untuk mengganti.
pk_test_* Sandbox. Dapat dilihat dari dashboard. Hanya untuk endpoint sandbox.

Putar kunci dan webhook secret dari halaman Integration. Rotasi memerlukan email OTP.

Buat order

POST /api/v1/orders
Authorization: Bearer pk_live_...
Content-Type: application/json

{
  "invoiceId": 12345,
  "userId": 678,
  "baseAmount": "10.00",
  "currency": "USD",
  "chain": "bep20",
  "asset": "USDT",
  "idempotencyKey": "01HT8X1V...-uuid",
  "returnUrl": "https://shop.example.com/orders/12345"
}
Field Tipe Catatan
invoiceId int ID invoice DHRU Anda.
userId int ID user DHRU untuk atribusi kredit.
baseAmount string String desimal. Akhiran amount kecil ditambahkan untuk crypto chain.
currency string Mata uang sumber.
chain enum trc20 | bep20 | binance_pay. BEP20 dan TRC20 juga menerima transfer internal Binance (off-chain) ke alamat deposit yang sama.
asset enum USDT | USDC. TRC20 hanya USDT.
idempotencyKey string UUID. Permintaan berulang dengan payload sama mengembalikan order yang sama.
returnUrl string Target redirect setelah order berakhir.

Respons

{
  "orderId": 4711,
  "checkoutToken": "ck_a8f3...",
  "checkoutUrl": "https://triapay.net/checkout/ck_a8f3...",
  "expectedAmount": "10.0001",
  "matchCode": 1,
  "expiresAt": "2026-05-08T05:30:00Z",
  "status": "pending"
}

Redirect pelanggan ke checkoutUrl. Gunakan expectedAmount sebagai jumlah persis yang harus dikirim pelanggan.

Status order

GET /api/v1/orders/{idempotencyKey}/status
Authorization: Bearer pk_live_...
{
  "orderId": 4711,
  "status": "credited",
  "txHash": "0xabc...",
  "matchedAmount": "10.0001",
  "creditedAt": "2026-05-08T05:18:42Z"
}

Status order membentuk state machine black-box:

  • pending — menunggu pembayaran.
  • matched — dana diterima, kredit sedang berlangsung.
  • credited — sukses terminal. Webhook telah diakui.
  • expired — terminal. Pelanggan tidak membayar tepat waktu.
  • failed — terminal. Pengiriman webhook menghabiskan retry.
  • overpaid — terminal. Pelanggan mengirim lebih dari yang diharapkan. Order tetap dikredit, ditandai untuk review manual.

Kedatangan terlambat (settlement chain setelah expiresAt) tidak dikredit otomatis. Pulihkan dari Admin → Orphan transactions.

Helper sandbox

Tersedia hanya dengan pk_test_*. Paksa status terminal tanpa menunggu settlement chain:

POST /api/v1/sandbox/orders/{idempotencyKey}/force-match
POST /api/v1/sandbox/orders/{idempotencyKey}/force-credit
POST /api/v1/sandbox/orders/{idempotencyKey}/force-expire
POST /api/v1/sandbox/webhook/replay

Body kosong. Mengembalikan order yang diperbarui. Webhook sandbox menyertakan X-Payment-Mode: sandbox; plugin DHRU bawaan memutusnya tanpa mengkredit invoice mana pun.

Checkout untuk pelanggan

Otentikasi token-only. Digunakan oleh halaman checkout terhost:

GET  /api/v1/checkout/{token}/status
GET  /api/v1/checkout/{token}/methods
POST /api/v1/checkout/{token}/select-method

Body select-method: {"chain": "bep20", "asset": "USDT"}. Mengembalikan order dengan alamat deposit, expected amount, QR data URI, dan match code.

Error

Envelope JSON, status HTTP mencerminkan kelas:

{ "error": "invalid_credentials", "code": "unauthorized" }
HTTP code Kapan
400 validation_error Bentuk payload buruk, field wajib hilang.
401 unauthorized Bearer atau sesi hilang atau tidak valid.
403 forbidden IP tidak ada di allowlist, hanya sandbox di key live.
404 not_found Token kedaluwarsa, idempotency key tidak dikenal.
409 conflict Idempotency-key dipakai ulang dengan payload berbeda.
429 rate_limited Hormati header Retry-After (detik).
500 internal Error server. Coba lagi dengan backoff.

Rate limit diberlakukan per akun. Hormati Retry-After pada setiap 429.

Idempotensi

Setiap permintaan yang mengubah state memerlukan idempotencyKey. Mengulang key yang sama dengan payload yang sama mengembalikan order asli. Mengulang key yang sama dengan payload berbeda mengembalikan:

{ "error": "idempotency_payload_mismatch", "code": "conflict" }

Buat key sebagai UUIDv4 per invoice dan simpan di sisi Anda agar retry setelah kegagalan jaringan tidak menyebabkan charge ganda.


Butuh lebih?

Apa pun di luar halaman ini tersedia di bawah perjanjian mitra. Hubungi kami via WhatsApp di halaman beranda.