交易结果异步通知¶
接口描述¶
该接口提供三方平台接收交易结果异步通知。
使用说明¶
调用SPIN接口时上送的异步通知地址为http/https路径(需带virgo://前缀):服务器为POST回调,默认超时时间为5秒,超时后会重试3次;不支持HTTP重定向;服务器对应答不是200~300之间的错误,会默认重试3次;异步通知服务器对HTTPS不认证验签和ALLOW_ALL_HOSTNAME_VERIFIER;如商户自定义通知端口,请使用8000-9005内端口,否则无法通知;URL 上请勿附带参数;异步回调请求编码集为:UTF-8。
签名验证,签名原数据为data中的数据。为了安全,请验证签名,签名认证参考提供的Demo程序。
收到通知后请返回状态码“200”,响应异步通知。为了表示商户交易系统已经收到交易应答,客户必须在应答接收页面输出一段特殊的字符串,组成规则为:固定字符串RECV_ORD_ID_加上交易应答中某一指定字段,比如上送的商户订单号或者请求流水号。
- 返回报文示例
Headers:
charset: UTF-8
Content-Type: application/x-www-form-urlencoded
Connection: Keep-Alive
POST data:
{
"resp_code":"00000000",
"resp_desc":"交易成功[000]",
"sign": "kP0YeT3BxIRpc0SsrCLRh6ZCKDk/nvJhCCIHb4MSuJacEvkeK8H7QPG+uGegrC92HWtHxFYeoh2csH4sy7IQG9EC1Dh0aKC+r5j/GXb014ZqQBksVMtsSXJpe5JcbMIHfLgdgfWn3SvMsI8Co2BxseC6mC4VQHZDcAc0upoJwqhpsibzm1d+dFVKkLUL5veO1uNhXhPdYx6VSQJbj9MFCh5Vrkf1yc/lvLqGLm5E1ZJjHovMJLNrIBodGkKXO8vB7JtWoTqDN+0eVZFjp9nVO1b7F3CtMABarcpw+v13FjOMAmpkF1ZiYOaHFvHGIaWCVbOvLn2dVXQZsWTCwQvWmA==",
"resp_data": "{\"acct_split_bunch\":{\"acct_infos\":[{\"div_amt\":\"753.00\",\"huifu_id\":\"6666000102973106\"}],\"fee_amt\":\"2.86\",\"fee_huifu_id\":\"6666000102973106\"},\"acct_stat\":\"I\",\"alipay_response\":{\"app_id\":\"\",\"buyer_id\":\"2088602257627674\",\"buyer_logon_id\":\"189****0308\"},\"bagent_id\":\"6666000023251077\",\"bank_code\":\"TRADE_SUCCESS\",\"bank_message\":\"TRADE_SUCCESS\",\"bank_order_no\":\"2021031722001427671459048436\",\"channel_type\":\"N\",\"debit_flag\":\"1\",\"end_time\":\"20210317095020\",\"fee_amount\":\"2.86\",\"fee_amt\":\"2.86\",\"fee_flag\":2,\"fee_rec_type\":\"1\",\"fq_mer_discount_flag\":0,\"gate_id\":\"Dw\",\"hf_seq_id\":\"00290TOP1GR210317094952P693ac13262200000\",\"huifu_id\":\"6666000102973106\",\"is_delay_acct\":\"1\",\"is_div\":\"0\",\"mer_name\":\"重庆数链通科技有限公司\",\"mer_ord_id\":\"22577563652260773965\",\"mypaytsf_discount\":\"0.00\",\"notify_type\":1,\"org_auth_no\":\"\",\"org_huifu_seq_id\":\"\",\"org_trans_date\":\"\",\"out_ord_id\":\"2021031722001427671459048436\",\"out_trans_id\":\"2021031722001427671459048436\",\"party_order_id\":\"03242103173539288303515\",\"pay_scene\":\"02\",\"posp_seq_id\":\"03242103173539288303515\",\"product_id\":\"YMFZS\",\"req_date\":\"20210317\",\"req_seq_id\":\"07387152320091631003250860684265\",\"resp_code\":\"00000000\",\"resp_desc\":\"交易成功\",\"risk_check_info\":{\"client_ip\":\"\",\"latitude\":\"\",\"lc\":\"\"},\"settlement_amt\":\"753.00\",\"sub_resp_code\":\"00000000\",\"sub_resp_desc\":\"交易成功\",\"subsidy_stat\":\"I\",\"sys_id\":\"6666000023251077\",\"trade_type\":\"A_NATIVE\",\"trans_amt\":\"753.00\",\"trans_date\":\"20210317\",\"trans_stat\":\"S\",\"trans_time\":\"094952\",\"trans_type\":\"A_NATIVE\"}"
}
实现您自己的异步消息接受和处理接口,启动异步消息的接收,通过此方法,商户可对 HTTP 回调参数进行签名验证和消息处理。
代码示例
// 汇付公钥
private static final String PUBLIC_KEY = "XXXX";
@PostMapping("/callback")
@ResponseBody
public String callback(HttpServletRequest request) {
try {
// 验签请参data
String data = request.getParameter("resp_data");
// 验签请参sign
String sign = request.getParameter("sign");
// 使用汇付公钥验签
if (!RsaUtils.verify(data, PUBLIC_KEY, sign)) {
// 验签失败处理
return "";
}
JSONObject dataObj = JSON.parseObject(responseData);
String subRespCode = dataObj.getString("sub_resp_code");
String reqSeqId = dataObj.getString("req_seq_id");
if ("00000000".equals(subRespCode)) {
// 业务处理成功
log.info("处理成功");
} else {
// 业务处理失败
log.info("处理失败");
}
return "RECV_ORD_ID_" + reqSeqId;
}catch (Exception e){
log.info("异步回调开始,参数,request={}");
}
return "";
}
异步通知参数¶
参数 | 中文名 | 类型 | 必填 | 最大长度 | 说明 |
---|---|---|---|---|---|
sub_resp_code | 业务返回码 | String | Y | 8 | 见附录 业务返回码 |
sub_resp_desc | 业务返回描述 | String | Y | 512 | 业务返回描述 |
req_seq_id | 请求流水号 | String | Y | 交易时传入,原样返回 | |
req_date | 请求时间 | String | Y | 交易时传入,原样返回 | |
huifu_id | 汇付子商户号 | String | Y | 16 | 汇付分配的商户号 |
mer_ord_id | 商户订单号 | String | Y | 128 | 商户生成 |
hf_seq_id | 汇付流水号 | String | N | 128 | |
trans_type | 交易类型 | String | Y | 见附录 交易类型 | |
trans_amt | 交易金额 | String | Y | 12 | 交易金额 |
settlement_amt | 结算金额 | String | Y | 16 | 结算金额 |
wx_response | 微信返回的响应报文 | JSON | N | 微信异步报文内容 | |
alipay_response | 支付宝返回的响应报文 | JSON | N | 支付宝异步报文内容 | |
unionpay_response | 银联返回的响应报文 | JSON | N | 银联异步报文内容 | |
acct_split_bunch | 分账串 | JSON | N | 4000 | 见附录 返回分账串 |
is_delay_acct | 是否延时交易 | String | N | 1 | 1:延时交易 ; 0:非延时交易; |
is_div | 是否分账交易 | String | N | 1 | 1:分账交易 ; 0:非分账交易; |
acct_date | 账务日期 | String | Y | 8 | ACCT账务日期,yyyyMMdd |
fee_amount | 手续费金额 | String | Y | 16 | 手续费金额 |
fee_flag | 手续费扣款标志 | int | Y | 1-外扣 2-内扣 | |
notify_type | 通知类型 | int | Y | 1:通道通知,2:账务通知 | |
trans_stat | 交易状态 | String | N | 1 | I:初始、P:处理中、S:成功、F:失败 |
acct_stat | 账务状态 | String | N | 1 | I:初始、P:处理中、S:成功、F:失败 |
bank_code | 通道返回码 | String | N | 32 | |
bank_message | 通道返回描述 | String | N | 200 | |
out_trans_id | 微信支付宝订单号 | String | N | 64 | |
party_order_id | 支付凭证号 | String | N | 64 | |
end_time | 支付完成时间 | String | N | 14 | 支付完成时间,格式为yyyyMMddHHmmss,如2009年12月25日 9点10分10秒表示为20091225091010 |
debit_flag | 借贷标识 | String | N | 1 | 见附录 借贷标识 |
trans_time | 交易时间 | String | N | 14 | 支付完成时间,格式为yyyyMMddHHmmss |
out_ord_id | 外部订单号 | String | N | 50 | |
devs_id | 汇付终端号 | String | N | 32 | |
posp_seq_id | 凭证号 | String | N | 6 | |
remark | 备注 | String | N | 45 | |
mer_priv | 商户私有域 | String | N | 1024 | 原样返回 |
auth_no | 授权码 | String | N | 64 | |
fq_mer_discount_flag | 分期贴息类型 | int | N | 分期贴息类型,1:商户贴息 |
注意事项¶
在实现异步消息接收的同时,都建议您在重要的业务环节,通过反查接口确认 非终态 支付订单的状态,以保证在发生异步消息延迟或无法送达情况下的支付结果一致性。