Fiat Currency Asynchronous Notification
# Asynchronous Notification of Collection
This interface is provided by the merchant. The platform requests this interface when the collection is successful When an HTTP request is received, please respond with httpcode=200 (HTTP Response Status Code). Otherwise, 16 notifications will be repeatedly sent within 5 hours.
⚠️⚠️Note: Users might only pay part of the amount, so it is necessary to check the 'actual payment amount'.⚠️⚠️
# Best Practice
- To determine successful payment, the orderStatus is 1.
- For partial payment determination: orderStatus is 3. Merchants should handle this according to their own business logic.
- On refund determination: orderStatus is 2. This situation generally occurs in case of customer complaints and bank risk control returns. Merchants should record related information and handle it according to their own business processes (a callback success will be received before getting this callback status).
- If the merchant's business logic fails to process, please change the HTTP response status code to 400 or 500 (non-200).
- Cheezeepay may send multiple callbacks with the same status. The merchant should handle this compatibility accordingly. If the merchant's own business has been processed successfully, they must return the HTTP response status code to 200.
- Please ensure to verify the callback IP➕signature verification.
Parameter | Type | Required | Description | Example |
---|---|---|---|---|
merchantId | string | Y | Merchant ID | CH10001165 |
mchOrderNo | string | Y | Merchant Order Number | C202401090023 |
platOrderNo | string | Y | Platform Order Number | 1746060142200229888 |
orderStatus | int | Y | Order Status | 1-Success 2-Refund 3-Partial Payment |
payAmount | string | Y | Order Actual Payment Amount | 800 |
amountCurrency | string | Y | Order Amount Currency | BRL |
fee | string | Y | Handling Fee | 88 |
feeCurrency | string | Y | Handling Fee Currency | BRL |
gmtEnd | long | Y | Completion Time (Timestamp: Milliseconds) | 1705128180000 |
sign | string | Y | Signature | EcCs7GlN1UzEAflgpyJ4lKIHe9+lS/gdkcEvWI +nSlcvvz1c+Dg4Zi8sFmpYaoOMGxS3/BY66F Gq2TXzVGhAciq2kFmwZFtYbFvr7xPTaNf/n0R u7ZtV/jo3uBnfc9/JI6XlEWlIbPtGsVpH7CLhzgh dqIT+YbPEdhX2ZKETFTTfIj6PzctY9eOsZ51Yb HYnXv0jTWn1hdPoDofAF9RmoNaXK4FGYibQ BSvVA6w4rM6hCXlbTeHdMc4askrZlrHeG3uhyD 34VlXs74cdzAZ+oROMXBcgXR4ObsJVDFz9tsJ H92iaxlKTF0lEFZa/To5ezLpHvTOAK0uY/K6IxvO AAg== |
# Asynchronous Notification Message Example
{
"merchantId":"CH10001165",
"mchOrderNo":"C202401090023",
"platOrderNo":"1746060142200229888",
"orderStatus":1,
"payAmount":"800",
"amountCurrency":"BRL",
"fee":"88",
"feeCurrency":"BRL",
"gmtEnd":1705128180000,
"sign":"EcCs7GlN1UzEAflgpyJ4lKIHe9+lS/gdkcEvWI+nSlcvvz1c+Dg4Zi8sFmpYaoOMGxS3/BY66FGq2TXzVGhAciq2kFmwZFtYbFvr7xPTaNf/n0Ru7ZtV/jo3uBnfc9/JI6XlEWlIbPtGsVpH7CLhzghdqIT+YbPEdhX2ZKETFTTfIj6PzctY9eOsZ51YbHYnXv0jTWn1hdPoDofAF9RmoNaXK4FGYibQBSvVA6w4rM6hCXlbTeHdMc4askrZlrHeG3uhyD34VlXs74cdzAZ+oROMXBcgXR4ObsJVDFz9tsJH92iaxlKTF0lEFZa/To5ezLpHvTOAK0uY/K6IxvOAAg=="
}
# Asynchronous Notification Code Implementation Demo
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
@RestController
@RequestMapping("callback")
public class TestCallbackController {
/**
* Platform public key
*/
public static String PLATFORM_PUB_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1dad35S74jfLPbHJh8P0jDHiTvkxwrtITK97ovVu19B24UdiHyHoEZgtNlS6alFQj1ULQ71d6EPh2rWCNkS2b5HGQXwDYBtwvesVQ8h4Sf3eVPTTLGw3BS7Os4vtDEN6BezMdv3sUG2N5i6JF+5H4CQTq3MD2Cx6u/Cv7oFOdFqeDT0AH+TR7uyZxn69OtkJaHHr834EUcdShJKKMQtbC11WCcut7ilDUgdvZnThiVTq7cfl8mcC9FDKcQ9bMWamScWIB5cJQdUW23Kr0c1NvZlpgPS8U5VODM4Uc4muHJPD2cJmquuJ+4AGP36rEk27lUB3h7B6JI1QGiuh1yyPDwIDAQAB";
/**
* payInCallback
* @param paramMap
* @param response
*/
@PostMapping("payIn")
public void payInCallback(@RequestBody Map<String, Object> paramMap, HttpServletResponse response) throws Exception{
boolean verifyResult = CheeseTradeRSAUtil.verifySign(paramMap, PLATFORM_PUB_KEY);
if (verifyResult) {
//Signature verification successful
//Order notification business processing logic
String merchantId = (String)paramMap.get("merchantId");
String mchOrderNo = (String)paramMap.get("mchOrderNo");
String platOrderNo = (String)paramMap.get("platOrderNo");
Integer orderStatus = (Integer)paramMap.get("orderStatus");
String payAmount = (String)paramMap.get("payAmount");
String amountCurrency = (String)paramMap.get("amountCurrency");
String fee = (String)paramMap.get("fee");
String feeCurrency = (String)paramMap.get("feeCurrency");
Long gmtEnd = (Long)paramMap.get("gmtEnd");
} else {
//Signature verification failed
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
}
}
}