Ir para a navegação

Transferências e reconciliação de contratos

Transferências e reconciliação de contratos: Integração Agent Java SDK v0.3.0, exemplos, parâmetros e semântica de resposta.

Ver como Markdown

Este guia é direcionado a Agent Java SDK v0.3.0, Java 8+ e ao contrato público marcado. Os exemplos são executados em um back-end de parceiro após a inicialização de client em Início rápido.

Pré-requisitos de exemplo

Os trechos Java compartilham essas importações. Inicialize client usando o Quick Start e obtenha platformUserId da ligação salva. Os exemplos de IDs de usuário/pedido devem ser substituídos por seus próprios valores persistentes.

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

Transferência de valor fixo

Use transfer para transferências de valor fixo. Direction.IN significa transferir da plataforma do parceiro para 6MM. Direction.OUT significa transferir de 6MM de volta à plataforma do parceiro.

Use strings ou BigDecimal para valores. Não use double ou float.

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

Transferir por platformUserId

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

Forneça os dois IDs

Se ambos os IDs forem fornecidos, o serviço validará que eles apontam para o mesmo usuário vinculado.

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

Campos de solicitação:

CampoTipoObrigatórioDescrição
agentOrderNostringSimNúmero de pedido de parceiro globalmente exclusivo
agentUserIdstringCondicionalmenteObrigatório quando platformUserId está ausente
platformUserIdstringCondicionalmenteObrigatório quando agentUserId está ausente
directionenumeraçãoSimIN ou OUT
currencystringNãoPreenchido de defaultCurrency quando ausente
amountstringSimSequência de valor decimal

Campos de resposta:

CampoTipoDescrição
orderNostringNúmero de pedido da plataforma
orderStatusstringSUCCESS, FAILED, PROCESSING, etc.
agentUserIdstringID de usuário do parceiro
platformUserIdstring6MM ID de usuário externo

Confirmação de pedido e idempotência

Depois que transfer for chamado, o serviço do Agente chama de forma síncrona a negociação núcleo no caminho principal. Na maioria dos casos, a resposta API já contém o resultado do núcleo de negociação síncrono.

ResultadoSignificadoAção do parceiro
SUCCESSTransferência bem-sucedidaMarcar pedido local como bem-sucedido
FAILEDA transferência foi rejeitada ou falhouSalve o motivo da falha e mostre-o quando apropriado
PROCESSINGTempo limite do núcleo de negociação ou incerteza da redeNão tente novamente com um novo número de pedido. Aguarde webhook ou ligue para queryOrder

Requisitos de idempotência:

  • Use um agentOrderNo para uma transação comercial.
  • Se HTTP expirar ou a rede falhar, consulte o mesmo agentOrderNo primeiro.
  • Webhooks pode ser tentado novamente. Desduplica-os por chave de idempotência.

Transferir tudo

transferAllOut move o saldo sacável do lado 6MM do usuário de volta para o plataforma parceira.

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

Por platformUserId:

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

amount na resposta é o valor real transferido.

Ordem inversa

O reverso é usado para compensar uma ordem de transferência bem-sucedida quando o back-end suporta o fluxo reverso. Os casos típicos incluem exceções de pedidos locais de parceiros ou reversão de reconciliação manual.

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

Campos:

CampoTipoObrigatórioDescrição
origOrderNostringSimNúmero da ordem de transferência original
reverseOrderNostringSimNúmero de ordem reversa globalmente exclusivo
reverseReasonstringSimRazão reversa

Notas:

  • A reversão não é uma operação normal de cancelamento.
  • As ordens reversas também devem ser idempotentes por número de ordem.
  • Depois que um pedido original for revertido, webhook poderá empurrar o pedido original REVERSED estado final.

Ordem de consulta

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

Valores orderType suportados:

  • TRANSFER_IN
  • TRANSFER_OUT

Campos de resposta comuns:

CampoTipoDescrição
orderTypestringTipo de pedido
orderNostringNúmero do pedido do parceiro
statusstringStatus do pedido
directionstringIN ou OUT
transferModestringFIXED_AMOUNT ou ALL_OUT
currencystringMoeda
amountstringQuantia
agentUserIdstringID de usuário do parceiro
platformUserIdstring6MM ID de usuário externo
failReasonstringMotivo da falha
createdAtstringHora de criação
completedAtstringTempo de conclusão

Listar pedidos

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

Recomendações de paginação:

  • page começa em 1.
  • Mantenha pageSize igual ou inferior a 100.
  • Para trabalhos de reconciliação, paginar por intervalo de tempo e desduplicar até orderNo.

Fonte e guias relacionados

Retornos de chamada de eventos de fundos

transfer.completed pode conter SUCCESS, FAILED ou uma atualização de pedido original de REVERSED; reverse.completed é um evento terminal de ordem de reversão. transfer.dead significa que o estado final permanece não confirmado após novas tentativas e precisa de reconciliação manual, não de uma falha confirmada. O nome do evento por si só não prova que os fundos foram creditados.

O reconhecimento bem-sucedido é diferente da movimentação bem-sucedida de fundos: após registrar uma notificação targetStatus=FAILED válida, retorne HTTP 2xx também. Persistir a desduplicação de eventos de fundos por orderType:orderId:targetStatus no escopo do comerciante e environment.

Campos de evento e exemplos JSON · Verificação de assinatura, respostas e novas tentativas