Mulai Cepat

Jika Anda hanya ingin menyelesaikan integrasi pertama, halaman ini sudah cukup: buat header yang ditandatangani, buat perintah pembayaran, lalu verifikasi callback dan kembalikan respons 2xx.

Contohnya menggunakan pembuatan pesanan pembayaran secara default. Perintah pembayaran menggunakan tanda tangan, header permintaan, dan header panggilan balik yang sama; hanya titik akhir dan muatan bisnis yang berubah.

API produksihttps://api.uugate.com
Aset yang didukungTRC20-USDT · BEP20-USDT · BEP20-USDC · SPL-USDC
Persiapan callbackAPI Key + notifyUrl
✓Siapkan Merchant UID Anda.
✓Siapkan API Key yang dimulai dengan mch_ dari pengaturan merchant API.
✓Siapkan notifyUrl milik pedagang yang dapat dijangkau publik; itu diperlukan saat membuat pesanan.
Step 1

Hasilkan Header yang Ditandatangani

Permintaan OpenAPI menggunakan lima header: x-api-key, x-merchant-uid, x-timestamp, x-nonce, dan x-signature.

  • Gunakan mch_ API Key yang sama dengan kunci x-api dan rahasia penandatanganan.
  • Jalur tanda tangan harus berupa jalur API saja, misalnya /openapi/payin/orders, tanpa domain.
  • Payload tanda tangan adalah Merchant UID, timestamp, nonce, metode, jalur, kanonik query, dan kanonik body.
Contoh Tanda Tangan Minimal Node.js
import crypto from 'node:crypto';

const merchantUid = '880001';
const apiKey = 'mch_xxxxxxxxxxxxxxxxxxxx';
const timestamp = String(Date.now());
const nonce = crypto.randomBytes(16).toString('hex');
const method = 'POST';
const path = '/openapi/payin/orders';
const canonicalQuery = '';
const canonicalBody = '{"amount":"100.00","chainCode":"TRON","merchantOrderNo":"M202604170001","notifyUrl":"https://merchant.example.com/api/uugate/payin-notify","tokenSymbol":"USDT"}';

const payload = [
  merchantUid,
  timestamp,
  nonce,
  method,
  path,
  canonicalQuery,
  canonicalBody,
].join('\n');

const signature = crypto.createHmac('sha256', apiKey).update(payload).digest('hex');
Step 2

Buat pesanan penerimaan

Setelah menyiapkan header yang ditandatangani, panggil perintah pembuatan pembayaran API. Jika berhasil, gunakan orderNo, cashierUrl, dan paymentUri.

  • Titik akhir: POST /openapi/payin/orders.
  • Gunakan cashierUrl yang dikembalikan ketika frontend pedagang perlu dialihkan ke pembayaran.
  • notifyUrl diperlukan dan diteruskan dengan permintaan pesanan. Tidak diperlukan konfigurasi callback backend terpisah.
  • Untuk pembayaran, ubah jalur ke /openapi/payout/orders dan kirimkan parameter pembayaran.
Contoh Pembuatan Pesanan Node.js
import { UUGateClient } from 'uugate-openapi-sdk';

const client = new UUGateClient({
  baseUrl: 'https://api.uugate.com',
  merchantUid: '880001',
  apiKey: 'mch_xxxxxxxxxxxxxxxxxxxx',
});

const order = await client.createPayinOrder({
  chainCode: 'TRON',
  tokenSymbol: 'USDT',
  merchantOrderNo: 'M202604170001',
  amount: '100.00',
  notifyUrl: 'https://merchant.example.com/api/uugate/payin-notify',
});

console.log(order.orderNo, order.cashierUrl);
Step 3

Menerima dan Memproses Panggilan Balik

Saat platform memanggil notifyUrl Anda, verifikasi dengan apiKey terlebih dahulu, perbarui pesanan bisnis setelah verifikasi, lalu kembalikan respons 200 atau 2xx lainnya.

  • Verifikasi panggilan balik menggunakan apiKey, bukan tanda tangan x OpenAPI.
  • Untuk pembayaran, perlakukan status=completed sebagai status keberhasilan akhir.
  • Untuk pembayaran, fokuslah pada status=confirmed dan status=failed.
Contoh Penangan Panggilan Balik Minimal
import express from 'express';
import { verifyCallbackSignature } from 'uugate-openapi-sdk';

const app = express();
app.use(express.json({
  verify: (req, _res, buffer) => {
    req.rawBody = buffer.toString('utf8');
  },
}));

app.post('/merchant/callback', (req, res) => {
  const valid = verifyCallbackSignature({
    apiKey: process.env.UUGATE_API_KEY,
    timestamp: req.header('x-callback-timestamp'),
    nonce: req.header('x-callback-nonce'),
    signature: req.header('x-callback-signature'),
    rawBody: req.rawBody || '',
  });

  if (!valid) {
    return res.status(401).json({ ok: false });
  }

  if (req.body.status === 'completed') {
    // Tandai pesanan pedagang sebagai berhasil
  }

  return res.status(200).json({ ok: true });
});

Pembayaran masuk dan pembayaran menggunakan algoritme penandatanganan dan header panggilan balik yang sama, sehingga Anda tidak memerlukan dua alur autentikasi.

Setelah halaman ini masuk akal, lanjutkan ke bawah untuk mengetahui parameter detail, struktur respons, dan unduhan SDK.