交易结果异步通知

接口描述

该接口提供三方平台接收交易结果异步通知。

使用说明

调用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:商户贴息

注意事项

在实现异步消息接收的同时,都建议您在重要的业务环节,通过反查接口确认 非终态 支付订单的状态,以保证在发生异步消息延迟或无法送达情况下的支付结果一致性。