异步消息

简介

针对交易结果,SPIN 系统会通过异步消息的方式通知客户系统。 具体哪些接口有异步消息通知,以及通知的报文格式,请参见各个接口详细说明部分。

HTTP(S)异步通知使用说明

调用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":"10000",
        "resp_desc":"成功调用",
        "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\"}"
}

请注意,商户配置类接口与支付交易类接口的异步通知返回的响应报文略有不同,区别仅仅是post回来的业务数据体参数名:

  • 支付交易类接口异步通知返回的参数名为 resp_data
  • 商户进件配置类接口的异步通知返回参数名为 data

实现您自己的异步消息接受和处理接口,启动异步消息的接收,通过此方法,商户可对 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 "";
}

注意事项

同样的异步消息可能会通知多次,因此接收异步消息的处理需做好幂等,保障多次接收到同样的消息处理后结果不变。

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