Passer à la navigation

Transferts et rapprochements de contrats

Transferts et rapprochements de contrats: Intégration Agent Java SDK v0.3.0, exemples, paramètres et sémantique de réponse.

Afficher en Markdown

Ce guide cible Agent Java SDK v0.3.0, Java 8+ et le contrat public étiqueté. Exemples exécutés dans un backend partenaire après l’initialisation de client dans Démarrage rapide.

Exemples de prérequis

Les extraits de code Java partagent ces importations. Initialisez client à l’aide de Quick Start et obtenez platformUserId à partir de la liaison enregistrée. Les exemples d’ID utilisateur/commande doivent être remplacés par vos propres valeurs persistantes.

import com.sixmm.agent.*;
import com.sixmm.agent.model.*;
import java.util.*;

Transfert à montant fixe

Utilisez transfer pour les transferts d’un montant fixe. Direction.IN signifie transférer de la plateforme partenaire vers 6MM. Direction.OUT signifie un transfert depuis 6MM retour à la plateforme partenaire.

Utilisez des chaînes ou BigDecimal pour les montants. N’utilisez pas double ou float.

Transfert par agentUserId

import com.sixmm.agent.model.Direction;
import com.sixmm.agent.model.TransferRequest;
import com.sixmm.agent.model.TransferResponse;
TransferResponse resp = client.transfer(TransferRequest.fixed(
"AGT-ORDER-1001",
"agent-user-001",
Direction.IN,
"USDT",
"10.00"));
System.out.println(resp.orderNo);
System.out.println(resp.orderStatus);
System.out.println(resp.agentUserId);
System.out.println(resp.platformUserId);

Transfert par platformUserId

TransferResponse resp = client.transfer(TransferRequest.fixedByPlatformUserId(
"AGT-ORDER-1002",
"1188041528",
Direction.OUT,
"USDT",
"5.00"));

Fournir les deux identifiants

Si les deux identifiants sont fournis, le service valide qu’ils pointent vers le même utilisateur lié.

TransferRequest req = TransferRequest
.fixed("AGT-ORDER-1003", "agent-user-001", Direction.IN, "USDT", "20.00")
.withPlatformUserId("1188041528");
TransferResponse resp = client.transfer(req);

Champs de requête :

ChampTaperRequisDescription
agentOrderNostringOuiNuméro de commande partenaire unique au monde
agentUserIdstringSous conditionObligatoire lorsque platformUserId est absent
platformUserIdstringSous conditionObligatoire lorsque agentUserId est absent
directionénumérationOuiIN ou OUT
currencystringNonRempli à partir de defaultCurrency en cas d’absence
amountstringOuiChaîne de montant décimal

Champs de réponse :

ChampTaperDescription
orderNostringNuméro de commande de la plateforme
orderStatusstringSUCCESS, FAILED, PROCESSING, etc.
agentUserIdstringID utilisateur côté partenaire
platformUserIdstring6MM ID utilisateur externe

Confirmation de commande et idempotence

Après l’appel de transfer, le service Agent appelle de manière synchrone le trading noyau sur le chemin principal. Dans la plupart des cas, la réponse API contient déjà le résultat de trading synchrone.

RésultatSignificationAction du partenaire
SUCCESSTransfert réussiMarquer la commande locale comme réussie
FAILEDLe transfert a été rejeté ou a échouéEnregistrez la raison de l’échec et affichez-la le cas échéant
PROCESSINGDélai d’expiration du cœur de trading ou incertitude du réseauNe réessayez pas avec un nouveau numéro de commande. Attendez webhook ou appelez queryOrder

Exigences d’idempotence :

  • Utilisez un agentOrderNo pour une transaction commerciale.
  • Si HTTP expire ou si le réseau tombe en panne, interrogez d’abord le même agentOrderNo.
  • Webhooks peut être réessayé. Dédupliquez-les par clé d’idempotence.

Transférer tout

transferAllOut déplace le solde côté 6MM retirable de l’utilisateur vers le plateforme partenaire.

import com.sixmm.agent.model.TransferAllOutRequest;
import com.sixmm.agent.model.TransferAllOutResponse;
TransferAllOutResponse resp = client.transferAllOut(
TransferAllOutRequest.of("AGT-ORDER-2001", "agent-user-001", "USDT"));
System.out.println(resp.orderStatus);
System.out.println(resp.amount);

Par platformUserId :

TransferAllOutResponse resp = client.transferAllOut(
TransferAllOutRequest.byPlatformUserId("AGT-ORDER-2002", "1188041528", "USDT"));

amount dans la réponse correspond au montant réel transféré.

Ordre inversé

Reverse est utilisé pour compenser un ordre de transfert réussi lorsque le backend prend en charge le flux inverse. Les cas typiques incluent les exceptions de commande locale du partenaire ou une restauration manuelle du rapprochement.

import com.sixmm.agent.model.ReverseOrderRequest;
import com.sixmm.agent.model.ReverseOrderResponse;
ReverseOrderResponse resp = client.reverse(ReverseOrderRequest.of(
"AGT-ORDER-1001",
"REV-ORDER-1001",
"partner order rollback"));
System.out.println(resp.orderStatus);

Champs :

ChampTaperRequisDescription
origOrderNostringOuiNuméro d’ordre de transfert d’origine
reverseOrderNostringOuiNuméro de commande inversée unique au monde
reverseReasonstringOuiRaison inverse

Remarques :

  • L’inversion n’est pas une opération d’annulation normale.
  • Les commandes inversées doivent également être idempotentes par numéro de commande.
  • Une fois qu’une commande initiale est annulée, webhook peut repousser la commande initiale. REVERSED état final.

Ordre de requête

import com.sixmm.agent.model.OrderQueryType;
import com.sixmm.agent.model.QueryOrderRequest;
import com.sixmm.agent.model.QueryOrderResponse;
QueryOrderResponse resp = client.queryOrder(
QueryOrderRequest.of("AGT-ORDER-1001", OrderQueryType.TRANSFER_IN));
System.out.println(resp.status);
System.out.println(resp.failReason);

Valeurs orderType prises en charge :

  • TRANSFER_IN
  • TRANSFER_OUT

Champs de réponse courants :

ChampTaperDescription
orderTypestringType de commande
orderNostringNuméro de commande du partenaire
statusstringStatut de la commande
directionstringIN ou OUT
transferModestringFIXED_AMOUNT ou ALL_OUT
currencystringDevise
amountstringMontant
agentUserIdstringID utilisateur côté partenaire
platformUserIdstring6MM ID utilisateur externe
failReasonstringRaison de l’échec
createdAtstringTemps de création
completedAtstringTemps de réalisation

Liste des commandes

import com.sixmm.agent.model.ListOrdersRequest;
import com.sixmm.agent.model.ListOrdersResponse;
ListOrdersRequest req = ListOrdersRequest.page(1, 20);
req.orderType = "TRANSFER_IN";
req.status = "SUCCESS";
req.startTime = "2026-06-01T00:00:00Z";
req.endTime = "2026-06-16T00:00:00Z";
ListOrdersResponse resp = client.listOrders(req);
System.out.println(resp.total);
resp.orders.forEach(order -> System.out.println(order.orderNo));

Recommandations de pagination :

  • page commence à 1.
  • Gardez pageSize à 100 ou moins.
  • Pour les tâches de réconciliation, page par fenêtre horaire et déduplication avant orderNo.

Source et guides associés

Rappels d’événements de fonds

transfer.completed peut contenir SUCCESS, FAILED ou une mise à jour de commande originale de REVERSED ; reverse.completed est un événement terminal d’ordre d’inversion. transfer.dead signifie que l’état final n’est pas confirmé après de nouvelles tentatives et nécessite une réconciliation manuelle, et non un échec confirmé. Le nom de l’événement à lui seul ne prouve pas que les fonds ont été crédités.

Un accusé de réception réussi est distinct d’un mouvement de fonds réussi : après avoir enregistré une notification targetStatus=FAILED valide, renvoyez également HTTP 2xx. Conserver la déduplication des événements de fonds par orderType:orderId:targetStatus au sein du commerçant et dans la portée de environment.

Champs d’événement et exemples de JSON · Vérification de signature, réponses et tentatives