Przejdź do nawigacji

Transfery i uzgadnianie kontraktów

Transfery i uzgadnianie kontraktów: Agent Java SDK Integracja v0.3.0, przykłady, parametry i semantyka odpowiedzi.

Zobacz jako Markdown

Ten przewodnik jest przeznaczony dla Agent Java SDK v0.3.0, Java 8+ i oznaczonych zamówień publicznych. Przykłady działają w zapleczu partnera po inicjalizacji client w Szybki start.

Przykładowe wymagania wstępne

Fragmenty Java dzielą ten import. Zainicjuj client za pomocą Szybki start i uzyskaj platformUserId z zapisanego powiązania. Przykładowe identyfikatory użytkowników/zamówień należy zastąpić własnymi, utrwalonymi wartościami.

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

Transfer kwot stałych

Użyj transfer w przypadku przelewów na stałą kwotę. Direction.IN oznacza przesyłanie z platformy partnerskiej do 6MM. Direction.OUT oznacza przeniesienie z 6MM z powrotem na platformę partnerską.

W przypadku kwot użyj ciągów znaków lub BigDecimal. Nie używaj double ani float.

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

Przelew przez platformUserId

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

Podaj oba identyfikatory

Jeśli zostaną podane oba identyfikatory, usługa sprawdza, czy wskazują na ten sam związany użytkownik.

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

Pola żądania:

PoleTypWymaganyOpis
agentOrderNostringTakGlobalnie unikalny numer zamówienia partnera
agentUserIdstringWarunkowoWymagane, gdy platformUserId jest nieobecny
platformUserIdstringWarunkowoWymagane, gdy agentUserId jest nieobecny
directionwyliczenieTakIN lub OUT
currencystringNIEWypełniane od defaultCurrency w przypadku nieobecności
amountstringTakCiąg dziesiętny kwoty

Pola odpowiedzi:

PoleTypOpis
orderNostringNumer zamówienia platformy
orderStatusstringSUCCESS, FAILED, PROCESSING itd.
agentUserIdstringIdentyfikator użytkownika po stronie partnera
platformUserIdstring6MM identyfikator użytkownika zewnętrznego

Potwierdzenie zamówienia i idempotencja

Po wywołaniu transfer usługa Agenta synchronicznie wywołuje transakcję rdzeń na głównej ścieżce. W większości przypadków odpowiedź API zawiera już wynik handlu synchronicznego.

WynikOznaczającyAkcja partnerska
SUCCESSPrzeniesienie powiodło sięOznacz zamówienie lokalne jako udane
FAILEDTransfer został odrzucony lub nie powiódł sięZapisz przyczynę niepowodzenia i pokaż ją w razie potrzeby
PROCESSINGPrzekroczenie limitu czasu rdzenia handlowego lub niepewność sieciNie próbuj ponownie, podając nowy numer zamówienia. Poczekaj na webhook lub zadzwoń do queryOrder

Wymagania dotyczące idempotencji:

  • Użyj jednego agentOrderNo na jedną transakcję biznesową.
  • Jeśli upłynie limit czasu HTTP lub nastąpi awaria sieci, najpierw zapytaj o to samo agentOrderNo.
  • Webhooks może zostać ponowiona. Deduplikuj je za pomocą klucza idempotencji.

Przenieś wszystko

transferAllOut przenosi saldo wypłaty użytkownika 6MM z powrotem do platforma partnerska.

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

Przez platformUserId:

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

amount w odpowiedzi to rzeczywista przekazana kwota.

Odwrotna kolejność

Rewers służy do kompensowania udanego zlecenia transferu w przypadku backendu obsługuje przepływ wsteczny. Typowe przypadki obejmują wyjątki od zamówień lokalnych partnerów lub ręczne wycofanie uzgadniania.

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

Pola:

PoleTypWymaganyOpis
origOrderNostringTakOryginalny numer polecenia przelewu
reverseOrderNostringTakGlobalnie unikalny numer zamówienia zwrotnego
reverseReasonstringTakOdwrotny powód

Uwagi:

  • Odwrócenie nie jest normalną operacją anulowania.
  • Zlecenia odwrotne muszą być również idempotentne według numeru zamówienia.
  • Po odwróceniu pierwotnego zamówienia webhook może przesunąć pierwotne zamówienie REVERSED stan końcowy.

Zamówienie zapytania

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

Obsługiwane wartości orderType:

  • TRANSFER_IN
  • TRANSFER_OUT

Typowe pola odpowiedzi:

PoleTypOpis
orderTypestringTyp zamówienia
orderNostringNumer zamówienia partnera
statusstringStan zamówienia
directionstringIN lub OUT
transferModestringFIXED_AMOUNT lub ALL_OUT
currencystringWaluta
amountstringKwota
agentUserIdstringIdentyfikator użytkownika po stronie partnera
platformUserIdstring6MM identyfikator użytkownika zewnętrznego
failReasonstringPrzyczyna niepowodzenia
createdAtstringCzas stworzenia
completedAtstringCzas realizacji

Lista zamówień

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

Zalecenia dotyczące paginacji:

  • page zaczyna się od 1.
  • Utrzymuj pageSize na poziomie 100 lub niższym.
  • W przypadku zadań uzgadniania, strona po oknie czasowym i deduplikacja do orderNo.

Źródło i powiązane przewodniki

Fundusze na wywołania zwrotne zdarzeń

transfer.completed może zawierać SUCCESS, FAILED lub aktualizację pierwotnego zamówienia na REVERSED; reverse.completed to zdarzenie końcowe zlecenia odwrócenia. transfer.dead oznacza, że ​​stan końcowy pozostaje niepotwierdzony po ponownych próbach i wymaga ręcznego uzgodnienia, a nie potwierdzonego błędu. Sama nazwa wydarzenia nie świadczy o zaksięgowaniu środków.

Pomyślne potwierdzenie różni się od pomyślnego przeniesienia środków: po zarejestrowaniu ważnego targetStatus=FAILED powiadomienia, zwróć również HTTP 2xx. Utrzymuj deduplikację zdarzeń związanych z funduszami przez orderType:orderId:targetStatus w zakresie sprzedawcy i environment.

Pola zdarzeń i JSON przykłady · Weryfikacja podpisu, odpowiedzi i ponowne próby