Interroger le statut de la commande de paiement

Interroge les détails de la commande de paiement par numéro de commande de plateforme, en renvoyant le status actuel et les clés timestamp.

GET/openapi/payin/orders/{orderNo}

En-têtes

ChampTypeObligatoireDescription
x-api-keystringOuiMarchand API Key. Utilisez la valeur commençant par mch_ de la page des paramètres API du marchand.
x-merchant-uidstringOuiMerchant UID.
x-timestampstringOuiMilliseconde à 13 chiffres timestamp. La dérive d'horloge autorisée par défaut est de 5 minutes.
x-noncestringOuiChaîne aléatoire unique pour chaque requête, jusqu'à 128 caractères. La réutilisation est rejetée.
x-signaturestringOuiSignature hexadécimale générée avec HMAC-SHA256. La charge utile contient Merchant UID, timestamp, nonce, la méthode, le chemin, le query canonique et le body canonique.

Paramètres

ChampTypeObligatoireDescription
orderNostringOuiParamètre de chemin. Le numéro de commande de la plateforme renvoyé lors de la création de l'ordre de paiement.

Exemple de requête

GET /openapi/payin/orders/PI1776193200123ABCD1234

Champs de réponse

ChampTypeObligatoireDescription
orderNostringOuiNuméro de commande de la plateforme.
merchantOrderNostring | nullOuiNuméro de commande du commerçant.
bindKeystring | nullOuiClé de liaison pour la recharge des membres. Généralement vide pour les ordres de paiement partagés.
chainCodestring | nullOuiRéseau de la commande.
tokenSymbolstring | nullOuiDevise de la commande.
txHashstring | nullOuiHash de la transaction associée ; null avant détection.
amountstring | nullOuiMontant de la commande.
paidAmountstring | nullOuiMontant payé.
addressstring | nullOuiAdresse de réception.
cashierUrlstring | nullOuiURL du paiement avec un jeton aléatoire. Une requête signée permet de récupérer un lien sécurisé pour les commandes antérieures.
paymentUristring | nullOuiPaiement par portefeuille URI.
expireAtstring | nullOuiDélai d'expiration de la commande.
createdAtstring | nullOuiTemps créé.
detectedAtstring | nullOuiHeure de détection du paiement.
confirmedAtstring | nullOuiHeure de confirmation.
completedAtstring | nullOuiTemps de réalisation.
statusstringOuiCommandez status.

Exemple de réponse

{
  "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"
}

Exemples de code

Exécution : enregistrez Java sous UUGateExample.java (UUGateCallback.java pour les callbacks), puis utilisez java nom du fichier ; PHP : php example.php ; Go : go run example.go ; Node.js : node example.mjs. Les vérificateurs de callback lisent le corps brut sur l’entrée standard.

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);

Notes

  • Pour le succès commercial final, utilisez status=completed.
  • Les quatre langages utilisent les mêmes chemins, paramètres et réponses. Les identifiants proviennent de UUGATE_MERCHANT_UID et UUGATE_API_KEY ; UUGATE_BASE_URL vaut https://api.uugate.com par défaut.
  • canonicalBody est un JSON compact aux clés triées. Après modification, triez les objets récursivement, conservez l’ordre des tableaux et utilisez UTF-8 sans échappement supplémentaire des barres obliques ou Unicode. Les montants sont des chaînes, les booléens true / false.
  • Une réponse réussie renvoie directement l’objet métier, sans enveloppe code / data. Vérifiez d’abord le statut HTTP. Les erreurs métier renvoient code, message, data et requestId ; les refus de sécurité peuvent se limiter à HTTP 401 / 403 avec un corps vide.
  • Après un timeout ou HTTP 5xx, consultez la commande avant de répéter sa création ou son envoi. Générez un nouveau timestamp, nonce et une nouvelle signature pour chaque requête.