法币代付异步通知
# 代付异步通知
本接口由商户提供,当代付成功平台请求该接口 接收到HTTP请求时,请响应httpcode=200(HTTP 响应状态码) ,否则会在5小时内重复发送16次通知.
# 最佳实践
- 对于成功的判定,orderStatus是1
- 对于退款的判定:orderStatus是2。这种情况一般是出现在用户投诉以及银行风控退回,请商户做好相关记录并根据自身业务逻辑进行处理(收到此回调状态之前会先收到回调成功)
- 若是商户业务逻辑上处理失败,请将响应的HTTP状态码改为400或者500(非200)
- Cheezeepay可能会多次发送相同状态的回调,请商户做好相关兼容处理,如商户自身业务已经处理完成,请务必返回响应HTTP状态码200
- 请务必校验回调IP➕验证签名
参数 | 类型 | 必填 | 描述 | 示例 |
---|---|---|---|---|
merchantId | String | Y | 商户ID | CH10001165 |
mchOrderNo | String | Y | 商户订单号 | A202401190011213735 |
platOrderNo | String | Y | 平台订单号 | 1749769124316319744 |
orderStatus | int | Y | 订单状态 | 1-成功 2-退款 |
payAmount | String | Y | 订单实付金额 | 900 |
amountCurrency | String | Y | 订单金额币种 | THB |
fee | String | Y | 手续费 | 90 |
feeCurrency | String | Y | 手续费币种 | THB |
gmtEnd | long | Y | 完结时间 (时间戳:毫秒) | 1706012459000 |
sign | String | Y | 签名 | meWKb9FsuZl8trJIZSrxCu5d5EV+3rT1o9Noaq ZVuPHS1o/Lb9T7Cnq7X1gmocLw3N/Mwvh3Z K++z7x8H2n6SJAQO10cvt2vGkiJ8kmOLhi7PI8 FQemTPNBS1kjBhxluKhwNJjgksS1v6lOv+6tfpI seBMJBQ0mCWUEe+quRgjnWoEKKSWACzg2u FxQE3AX7hFBhFyWo3Z+dJMXn6d0TCNwzTnd BRGMEgdoKK8HpN/B+NC7V2gkt+vW65EPnwg 3EuFrGzO4eRTbTkWyT7Av28/p3b4uJCPjQYDe iYCYFj7oPQOxY4OuDR+kyrTzVygRXqfK7vfh0cJ zSArtQhc+Xsw== |
# 异步通知报文示例
{
"merchantId":"CH10001165",
"mchOrderNo":"A202401190011213735",
"platOrderNo":"1749769124316319744",
"orderStatus":1,
"payAmount":"900",
"amountCurrency":"THB",
"fee":"90",
"feeCurrency":"THB",
"gmtEnd":1706012459000,
"sign":"meWKb9FsuZl8trJIZSrxCu5d5EV+3rT1o9NoaqZVuPHS1o/Lb9T7Cnq7X1gmocLw3N/Mwvh3ZK++z7x8H2n6SJAQO10cvt2vGkiJ8kmOLhi7PI8FQemTPNBS1kjBhxluKhwNJjgksS1v6lOv+6tfpIseBMJBQ0mCWUEe+quRgjnWoEKKSWACzg2uFxQE3AX7hFBhFyWo3Z+dJMXn6d0TCNwzTndBRGMEgdoKK8HpN/B+NC7V2gkt+vW65EPnwg3EuFrGzO4eRTbTkWyT7Av28/p3b4uJCPjQYDeiYCYFj7oPQOxY4OuDR+kyrTzVygRXqfK7vfh0cJzSArtQhc+Xsw=="
}
# 异步通知代码实现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 {
/**
* 平台公钥
*/
public static String PLATFORM_PUB_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1dad35S74jfLPbHJh8P0jDHiTvkxwrtITK97ovVu19B24UdiHyHoEZgtNlS6alFQj1ULQ71d6EPh2rWCNkS2b5HGQXwDYBtwvesVQ8h4Sf3eVPTTLGw3BS7Os4vtDEN6BezMdv3sUG2N5i6JF+5H4CQTq3MD2Cx6u/Cv7oFOdFqeDT0AH+TR7uyZxn69OtkJaHHr834EUcdShJKKMQtbC11WCcut7ilDUgdvZnThiVTq7cfl8mcC9FDKcQ9bMWamScWIB5cJQdUW23Kr0c1NvZlpgPS8U5VODM4Uc4muHJPD2cJmquuJ+4AGP36rEk27lUB3h7B6JI1QGiuh1yyPDwIDAQAB";
/**
* 回调
* @param paramMap
* @param response
*/
@PostMapping("payOut")
public void payOutCallback(@RequestBody Map<String, Object> paramMap, HttpServletResponse response) throws Exception{
boolean verifyResult = CheeseTradeRSAUtil.verifySign(paramMap, PLATFORM_PUB_KEY);
if (verifyResult) {
//签名验证成功
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 {
//签名验证失败
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
}
}
}