Status Pesanan Pembayaran Kueri

Kueri detail pesanan pembayaran berdasarkan nomor pesanan platform, mengembalikan status dan kunci timestamps saat ini.

GET/openapi/payin/orders/{orderNo}

Header

KolomTipeWajibDeskripsi
x-api-keystringYaPedagang API Key. Gunakan nilai yang diawali dengan mch_ dari halaman pengaturan API pedagang.
x-merchant-uidstringYaMerchant UID.
x-timestampstringYa13 digit milidetik timestamp. Penyimpangan jam yang diperbolehkan secara default adalah 5 menit.
x-noncestringYaString acak unik untuk setiap permintaan, hingga 128 karakter. Penggunaan kembali ditolak.
x-signaturestringYaTanda tangan hex dihasilkan dengan HMAC-SHA256. Payload berisi Merchant UID, timestamp, nonce, metode, jalur, query kanonik, dan body kanonik.

Parameter

KolomTipeWajibDeskripsi
orderNostringYaParameter jalur. Nomor pesanan platform dikembalikan saat membuat pesanan pembayaran.

Contoh permintaan

GET /openapi/payin/orders/PI1776193200123ABCD1234

Kolom respons

KolomTipeWajibDeskripsi
orderNostringYaNomor pesanan platform.
merchantOrderNostring | nullYaNomor pesanan pedagang.
bindKeystring | nullYaKunci pengikatan untuk isi ulang anggota. Biasanya kosong untuk pesanan pembayaran bersama.
chainCodestring | nullYaJaringan pesanan.
tokenSymbolstring | nullYaToken pesanan.
txHashstring | nullYaHash transaksi yang cocok; null sebelum terdeteksi.
amountstring | nullYaJumlah pesanan.
paidAmountstring | nullYaJumlah yang dibayarkan.
addressstring | nullYaAlamat penerimaan.
cashierUrlstring | nullYaURL checkout dengan token akses acak. Permintaan bertanda tangan dapat mengambil kembali tautan aman pesanan lama.
paymentUristring | nullYaPembayaran dompet URI.
expireAtstring | nullYaWaktu kedaluwarsa pesanan.
createdAtstring | nullYaWaktu yang diciptakan.
detectedAtstring | nullYaWaktu pembayaran terdeteksi.
confirmedAtstring | nullYaWaktu konfirmasi.
completedAtstring | nullYaWaktu penyelesaian.
statusstringYaPesan status.

Contoh respons

{
  "orderNo": "PI1776193200123ABCD1234",
  "merchantOrderNo": "M202604150001",
  "bindKey": null,
  "amount": "100.000000",
  "paidAmount": "100.000000",
  "address": "TXYZ3x9nJ5J4xP2gh6mQW7rT31jB8Y2pA9",
  "cashierUrl": "https://open.uugate.com/SK/PI1776193200123ABCD1234#ct=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "paymentUri": "TRON:TXYZ3x9nJ5J4xP2gh6mQW7rT31jB8Y2pA9?token=USDT&amount=100.000000",
  "expireAt": "2026-04-18T06:30:00.000Z",
  "createdAt": "2026-04-18T06:00:00.000Z",
  "detectedAt": "2026-04-18T06:08:15.000Z",
  "confirmedAt": "2026-04-18T06:09:02.000Z",
  "completedAt": "2026-04-18T06:09:02.000Z",
  "status": "completed",
  "chainCode": "TRON",
  "tokenSymbol": "USDT",
  "txHash": "f7f17891f52c35d0c93170f0d12bb347ac16ab34853b4bc8dcf7fd0a8c9aa321"
}

Contoh kode

Menjalankan: simpan Java sebagai UUGateExample.java (UUGateCallback.java untuk callback), lalu gunakan java nama file; PHP: php example.php; Go: go run example.go; Node.js: node example.mjs. Verifikasi callback membaca isi asli dari input standar.

import { createHmac, randomBytes } from 'node:crypto';

function required(name) {
  const value = process.env[name]?.trim();
  if (!value) throw new Error(name + ' is required');
  return value;
}
const uid = required("UUGATE_MERCHANT_UID"), key = required("UUGATE_API_KEY");
const timestamp = String(Date.now()), nonce = randomBytes(16).toString("hex");
const method = 'GET', path = '/openapi/payin/orders/PI1776193200123ABCD1234';
const canonicalQuery = '', canonicalBody = "";
const payload = [uid, timestamp, nonce, method, path, canonicalQuery, canonicalBody].join('\n');
const signature = createHmac('sha256', key).update(payload, 'utf8').digest('hex');
const base = (process.env.UUGATE_BASE_URL || 'https://api.uugate.com').replace(/\/+$/, '');
const response = await fetch(base + path, {
  method, redirect: 'error', signal: AbortSignal.timeout(30000),
  headers: { 'Content-Type': 'application/json', 'x-api-key': key, 'x-merchant-uid': uid,
    'x-timestamp': timestamp, 'x-nonce': nonce, 'x-signature': signature },
  ...(canonicalBody ? { body: canonicalBody } : {}),
});
const raw = await response.text();
if (!response.ok) throw new Error('HTTP ' + response.status + ': ' + (raw || 'empty response body'));
JSON.parse(raw);
console.log(raw);

Catatan

  • Untuk kesuksesan bisnis akhir, gunakan status=completed.
  • Keempat bahasa memakai jalur, parameter, dan kontrak respons yang sama. Kredensial dibaca dari UUGATE_MERCHANT_UID dan UUGATE_API_KEY; UUGATE_BASE_URL secara default adalah https://api.uugate.com.
  • canonicalBody adalah JSON ringkas dengan nama kolom terurut. Setelah mengubah parameter, urutkan key objek secara rekursif, pertahankan urutan array, dan gunakan UTF-8 tanpa escape tambahan untuk slash atau Unicode. Nominal berupa string; boolean true / false.
  • Respons sukses langsung berisi objek bisnis tanpa pembungkus code / data. Periksa status HTTP sebelum isi. Error bisnis berisi code, message, data, requestId; penolakan keamanan dapat hanya mengirim HTTP 401 / 403 dengan isi kosong.
  • Setelah timeout atau HTTP 5xx, periksa pesanan sebelum mengulang pembuatan atau pengiriman. Buat timestamp, nonce, dan tanda tangan baru untuk setiap permintaan.