본문으로 건너뛰기

3- 3. 콜백

주문이 처리되면 시스템은 판매자가 구성한 콜백 주소로 알림 메시지를 보냅니다.

콜백 주소 구성

주문 시 notifyUrl 매개변수를 통해 해당 주문에 대한 전용 콜백 주소를 지정할 수 있습니다. 이 주소는 판매자의 백엔드에 구성된 기본 콜백 주소보다 우선 적용됩니다.


param.put("notifyUrl", "http://{domain}/callback/notifyUrl");

주문 시 notifyUrl를 입력하지 않으면 시스템은 판매자의 백엔드에 구성된 기본 콜백 주소를 콜백합니다. 기본 콜백 주소는 가맹점 생성 시 제공되며, 운영관리 백그라운드에서 유지될 수 있습니다.

콜백 요청 방법

HTTP 방법

POST

콘텐츠 유형

application/json

콜백 데이터 예시

{
"amount": "100",
"bizType": "WITHDRAW_ANY_DIGITAL_WALLET",
"blockchain": {
"network": "TRON",
"receiverAddress": "THcJ2FeNBkuzd4PZBpRans6tx9QGg9KHRt",
"senderAddress": "TE35TrUfHjbGEBsVS6zVXdHS8HxXCWwC2y",
"txIndex": "2",
"txId": "d848e4b62ec6925b8b3ff49dbc4d839f3f88508497c3af525f0c8293cb303ab3"
},
"currency": "CNY",
"localOrderId": "TestOTM0625ROB016",
"merchantActualAmount": "138.12",
"merchantCurrency": "CNY",
"merchantId": 302992856974,
"merchantPaidAmount": "100",
"notifyTime": 1772173006425,
"orderCreateTime": 1772172958082,
"orderId": "472515854147845",
"status": "SUCCESS",
"type": "WITHDRAW",
"userAmount": "14.971722",
"userCurrency": "USDT",
"userMinerFee": "0",
"isReissue": false,
"userReceivableAmount": "14.971722",
"rate": "6.71080951",
"rateExpression": "1USDT≈6.7108CNY",
"sign": "2c27c7e8184cc709a64ad502ee42eab7",
"key": "9yUreYgTRtit39Dy"
}

**비즈니스 개발 요구 사항을 충족하기 위해 콜백 매개변수는 향후 새로운 필드를 추가할 수 있습니다. 새로 추가된 필드는 기본적으로 서명 계산에 참여합니다(서명 규칙에 특별히 명시된 필드 제외). 따라서 가맹점 시스템은 필드 확장으로 인한 서명 검증 실패를 방지하기 위해 향후 호환성을 갖추어야 합니다. **

콜백 매개변수 설명

매개변수 이름유형참여 서명매개변수 의미매개변수 설명
amountdecimal주문금액
bizTypeenum주문 유형주문 유형 설명은 다음과 같습니다
blockchainobject체인거래 정보온체인 거래 정보, isBlockchain=true
└네트워크String메인넷
└수신자주소String수신자 주소
└발신자주소decimal보내는 주소
└txIDString거래 ID블록체인 거래 해시
└tx인덱스String거래지수거래지수(일괄이체 시나리오)
currencyString통화주문 통화
keyString판매자 키
localOrderIdString판매자 주문 번호
merchantActualAmountdecimal가맹점 실제 결제 금액
merchantCurrencyString가맹점 결제통화
merchantIdString판매자 ID
merchantPaidAmountdecimal가맹점이 받거나 지불할 금액
merchantUserIdString판매자 사용자 ID
notifyTimelong콜백 시간콜백 알림 시간
orderCreateTimelong주문 생성 시간
orderIdString주문번호플랫폼 주문 번호(고유)
statusString결제현황성공, 실패(아래 설명)
typeString주문 유형지불, 인출(아래 설명)
userAmountdecimal이용자가 실제로 받거나 지불한 금액
userCurrencyString사용자 통화
userMinerFeeString채굴 수수료
userReceivableAmountString이용자가 지급 또는 받을 금액
isReissueBoolean재발행 여부콜백 재발행 여부
ratestring환율
rateExpressionstring환율 표현
signString아니요서명값md5 서명(자세한 내용은 서명 알고리즘 참조)

상태 상태 설명

상태 값설명
SUCCESS완료
FAIL실패

유형 유형 설명

유형 값설명
PAYMENT결제
WITHDRAW출금

bizType 비즈니스 유형 설명

비즈니스 유형설명
PAYMENT_WALLET_SCAN결제할 VPAY 지갑 스캔 코드
PAYMENT_TRANSFER디지털 화폐 바인딩 주소 직접 입금
PAYMENT_ANY_DIGITAL_SCANQR 코드를 스캔하여 원하는 금액의 디지털 화폐를 결제하세요
PAYMENT_FIXED_DIGITAL_SCAN디지털화폐 정액 스캔코드 결제
WITHDRAW_WALLETVPAY 지갑으로 출금
WITHDRAW_ANY_DIGITAL_WALLET디지털 지갑으로 인출
BATCH_PAY일괄결제

콜백 응답 요구사항

판매자가 콜백을 성공적으로 처리한 후에는 다음 콘텐츠가 반환되어야 합니다.

success

시스템이 success 문자열을 수신하면 콜백 처리가 성공한 것으로 간주되어 다시 전송되지 않습니다.

콜백 재시도 메커니즘

만약:

  • 응답을 받지 못했습니다.
  • 반환된 콘텐츠는 success가 아닙니다.
  • HTTP 요청 예외
  • 서비스 시간 초과

시스템은 콜백 알림 전송을 자동으로 다시 시도합니다.

최대 재시도 횟수

14次

재시도 간격

15s
15s
30s
180s
600s
1200s
1800s
1800s
1800s
3600s
10800s
10800s
21600s
21600s

반복적인 콜백으로 인한 비즈니스 데이터의 반복 처리를 피하기 위해 판매자 시스템에서는 orderId에 따라 멱등성 처리를 구현하는 것이 좋습니다.

서명 확인

콜백 알림을 받은 가맹점은 먼저 서명 검증을 수행한 후 검증을 통과한 후 비즈니스 로직을 실행해야 합니다. 서명 알고리즘은 주문 요청 서명 규칙과 완전히 일치합니다. "2. 서명방법"을 참고하시기 바랍니다.

서명 확인 절차

  1. 콜백 매개변수에서 sign를 가져옵니다.
  2. 매개변수에서 sign를 제거합니다.
  3. 매개변수에 판매자 key를 입력하세요.
  4. 판매자 secret를 사용하여 서명 규칙에 따라 서명을 다시 계산합니다.
  5. 계산 결과가 콜백의 sign와 일치하는지 비교

서명 확인이 성공한 후에야 주문 업무가 진행됩니다.

Java 서명 확인 예시

public void notify(JSONObject data) {

    log.info("收到回调通知:{}", data.toJSONString());

    String key = "your_key";
    String secret = "your_secret";
   
    String sign = data.getString("sign");

    data.put("key", key);
    data.remove("sign");
   
    String calculatedSign = SignUtils.getSign(data, secret);

    if (!calculatedSign.equals(sign)) {
        throw new DxBizException("签名验证失败");
    }
    // 业务处理逻辑
}