
Wallets et encaissements
Recommandé pour les dépôts des membres : aucun montant préalable ni compte à rebours, avec crédit du montant reçu. Comprend le tableau de bord, la liaison API, les requêtes et les callbacks.
Regardez en plein écran ou choisissez un chapitre. Pour envoyer ou recevoir des fonds, utilisez les informations de votre propre tableau de bord.
Suivez les étapes dans votre tableau de bord. Cliquez sur une image pour l’agrandir.
Pour les dépôts des membres, nous recommandons un wallet exclusif. Associez une adresse à chaque membre afin qu'il puisse l'utiliser plusieurs fois. Aucun montant n'est à saisir à l'avance et il n'y a pas de compte à rebours. Cela évite les problèmes de rapprochement liés au montant ou à l'expiration. Le réseau, la devise et les confirmations restent à vérifier.
Ouvrez la liste des wallets, lancez la création, choisissez la devise et le réseau, puis sélectionnez Wallet exclusif. Pour un membre qui envoie des USDT sur TRON, choisissez TRC20-USDT. Le réseau doit toujours correspondre à celui de l'envoi. TRC20-USDT · BEP20-USDT · BEP20-USDC · SPL-USDC.
Renseignez un identifiant de membre stable et unique dans les informations de liaison. Il correspond au bindKey de l'API, et non au UID du marchand. Pour créditer automatiquement le membre, indiquez l'URL de callback de votre serveur. Si elle reste vide, la configuration par défaut s'applique. Vérifiez le quota avant de créer le wallet. Par exemple, MEMBER_10001 identifie le membre. notifyUrl doit être une URL HTTPS publique. Ne donnez pas au membre l'adresse de recharge des frais.
Filtrez la liste par Wallet exclusif et vérifiez la devise et l'adresse du membre. Les wallets créés par API figurent aussi dans cette liste. Pour un même membre, réseau et devise, réutilisez la liaison existante. Un nouveau wallet n'est pas nécessaire à chaque dépôt.
Ouvrez la page de paiement depuis la ligne du wallet. Elle ne contient ni champ de montant ni compte à rebours. Transmettez l'adresse complète ou le lien au membre concerné. Il choisit le montant du dépôt, et votre système crédite le montant effectivement reçu. Gardez le wallet activé pour les dépôts. Avant de le désactiver, demandez au membre de ne plus envoyer de fonds à cette adresse.
Pour une intégration API, ouvrez l'outil officiel et sélectionnez Créer un wallet exclusif. Renseignez la devise, l'identifiant du membre et l'URL de callback. Aucun montant, délai ou numéro de commande marchand n'est requis. La commande d'encaissement est générée lorsque le dépôt est détecté. POST /openapi/payin/exclusive-bindings · chainCode · tokenSymbol · bindKey · label? · notifyUrl?
Authentifiez les requêtes sur le serveur avec Merchant UID + API Key et les en-têtes x-api-key, x-merchant-uid, x-timestamp, x-nonce et x-signature. Le message HMAC-SHA256 comporte sept lignes : UID, timestamp en millisecondes, nonce, méthode HTTP en majuscules, chemin sans query, query canonique et body canonique. Utilisez le SDK officiel ou le code de l'outil, avec un nouveau timestamp et nonce à chaque requête. Vérifiez les données avant de créer une liaison réelle.
Conservez bindingId, addressId, address, bindKey, chainCode, tokenSymbol et status ; le statut doit être active. La même combinaison marchand + réseau + devise + bindKey renvoie la liaison existante. Une création répétée ne remplace ni label ni notifyUrl. La réponse ne contient pas cashierUrl : affichez address sur votre page de dépôt ou copiez le lien du checkout dans le tableau de bord.
Utilisez GET /openapi/payin/exclusive-bindings/{bindKey}?chainCode=TRON&tokenSymbol=USDT&recentLimit=10. Encodez bindKey pour l'URL. GET n'a pas de body, mais sa query participe à la signature. La réponse contient stats, recentOrders et recentTransactions. recentLimit accepte de 1 à 20 et ne remplace pas un historique comptable complet. Pour une commande précise, utilisez GET /openapi/payin/orders/{orderNo}.
Après traitement du dépôt, la plateforme envoie le callback à notifyUrl du wallet, ou à la configuration par défaut si cette valeur est vide. Vérifiez rawBody avec l'API Key associée à la commande, puis contrôlez marchand, réseau, devise, bindKey et status=completed. Créditez paidAmount, le montant effectivement reçu. Utilisez (merchantUid, orderNo) comme clé unique et enregistrez la déduplication et le crédit du solde dans la même transaction de base de données. Répondez HTTP 2xx après réussite. Acquittez les doublons sans recréditer. Ne dédupliquez pas uniquement par bindKey : le dépôt suivant du membre serait ignoré.
Dans les commandes d'encaissement, filtrez par adresse, libellé ou identifiant de liaison. Vérifiez le montant, le statut et le hash. L'API permet aussi de consulter les opérations récentes d'une liaison, puis une commande précise. Le guide écrit présente les chemins et les exemples. Rapprochez le résultat des écritures du wallet et du solde du membre dans votre système. Le bouton Callback renvoie une notification ; il n'ouvre pas une consultation. Assurez la déduplication avant de l'utiliser.
Si le solde du membre n'est pas à jour, vérifiez le réseau, la devise et les confirmations. Contrôlez ensuite la commande, l'URL de callback et les journaux de votre serveur. Si la signature échoue, vérifiez la canonicalisation, l'horloge et nonce. Si la liaison est introuvable, contrôlez marchand, réseau, devise et bindKey. Vérifiez aussi le statut du compte, le quota d'adresses et le solde des frais.
Attribuez un identifiant distinct à chaque membre et réutilisez sa liaison pour le même réseau et la même devise. Créditez le montant reçu après vérification du callback et dédupliquez par commande.
Le membre se connecte et choisit réseau et devise
→ Le serveur récupère le bindKey stable du membre
→ Crée ou consulte l’association exclusive et réutilise son adresse
→ Le membre choisit le montant à envoyer à cette adresse
→ La plateforme détecte et confirme le dépôt, puis génère une commande exclusive
→ Vérifie le callback completed et crédite paidAmount une seule fois par commande
→ Rapproche commandes et journaux du tableau de bord avec les crédits du membreimport { UUGateClient } from 'uugate-openapi-sdk';
const client = new UUGateClient({
baseUrl: 'https://api.uugate.com',
merchantUid: process.env.UUGATE_MERCHANT_UID,
apiKey: process.env.UUGATE_API_KEY,
});
const binding = await client.createExclusiveBinding({
chainCode: 'TRON',
tokenSymbol: 'USDT',
bindKey: 'MEMBER_10001',
label: 'MEMBER_10001',
notifyUrl: 'https://merchant.example.com/uugate/notify',
});const bindKey = 'MEMBER_10001';
const detail = await client.request('GET',
'/openapi/payin/exclusive-bindings/' + encodeURIComponent(bindKey), {
query: { chainCode: 'TRON', tokenSymbol: 'USDT', recentLimit: 10 },
});Conserver le corps HTTP original dans rawBody
Vérifier x-callback-signature avec l’API Key associée à la commande :
HMAC-SHA256(apiKey, timestamp + "." + nonce + "." + rawBody)
Valider timestamp, protection anti-rejeu et champs métier
Exiger le bon merchantUid et status == "completed"
Retrouver le membre par bindKey + chainCode + tokenSymbol
Dans une même transaction de base de données :
Enregistrer le dépôt avec la clé unique (merchantUid, orderNo)
Déjà enregistré → ne pas créditer à nouveau
Premier enregistrement → ajouter paidAmount au solde avec une arithmétique décimale
Retourner 2xx après succès ; sinon retourner un code hors 2xx et journaliser l’erreur
// bindKey identifie le membre ; orderNo identifie un dépôt. Ne pas les intervertir.