支付回调通知

用户付款后,支付系统会通知到开发者请求提供的notify_url。
回调方式:HTTP POST
支付回调通知数据示例

微信回调示例

{
    "action": "pay_notify",
    "code": "0",
    "data": "{\"tppay_trade_no\":\"4200001190202109173736050906\",\"out_trade_no\":\"1631863299243\",\"quickpay_trade_no\":\"20210917152139372600\",\"pay_time\":\"2021-09-17 15:22:01\",\"attach\":\"biz=sms\",\"total_fee\":200,\"pay_channel\":\"wechat\",\"pay_user\":\"oxL-nt_wXbwtIh04tCNZ27T1X57M\"}",
    "message": "success",
    "sign": "4f9cf7534c3d7e2056b4e2329004c0ee",
    "timestamp": "1631863318"
}

支付宝回调示例

{
    "action":"pay_notify",
    "code":"0",
    "data":"{\"tppay_trade_no\":\"2021122322001464271448008993\",\"out_trade_no\":\"1640188979791\",\"quickpay_trade_no\":\"202112237570747459\",\"pay_time\":\"2021-12-23 00:13:24\",\"attach\":\"biz=sms\",\"total_fee\":100,\"pay_channel\":\"alipay\",\"pay_user\":\"sup***@163.com\"}",
    "message":"success",
    "sign":"88cc98f36018186653aec5ef66df1ffc",
    "timestamp":"1640189606"
}

返回参数说明

参数名 类型 说明 示例
code int 0时为成功,非0为失败
message String 消息 code非0时,会包含错误的出错信息
action String 通知类型,pay_trade_notify表示支付通知
sign String 服务端返回的签名,为安全起见,开发者需要进行验签
tppay_trade_no String 支付宝或是微信侧的交易流水号
out_trade_no String 开发者请求时传入的订单号
quickpay_trade_no String 蜂巢侧订单号
total_fee String 消费者付款金额,单位是分,切记!
pay_channel String 支付渠道,支付宝:alipay,微信:weixin alipay
attach String 附加参数,原样返回开发者传入时的值
pay_user String 付款用户,脱敏,支付宝 :支付宝的登录账号,微信: 微信OpenId

处理支付通知的示例代码(Java)

   @RequestMapping("/paynotice")
    @ResponseBody
    public String  paynotice(@RequestBody String jsonData , HttpServletResponse response) {

        Map<String, Object> map = new HashMap<String, Object>();
        try {

                logger.info("原始数据:" + jsonData);
                OceanusNotice oceanusNotice  = JSON.parseObject(jsonData, OceanusNotice.class);
                Map<String, String> dataMap = new HashMap<String, String>();
                dataMap.put("code", String.valueOf(oceanusNotice.getCode()));
                dataMap.put("message", oceanusNotice.getMessage() );
                dataMap.put("action",   oceanusNotice.getAction()  );
                dataMap.put("data",  oceanusNotice.getData()  );
                dataMap.put("timestamp",oceanusNotice.getTimestamp()  );

                //参数签名
                String serverSign = oceanusNotice.getSign();
                if( !Utils.Sign(dataMap, Config.AppSecret ).equals(serverSign) ){
                    System.out.println("签名不相等, server " +  serverSign + "  local:" +  Utils.Sign(dataMap, Config.AppSecret )   );
                    return  "ERROR,签名不相等";
                }

                JSONObject   jsonObject  =  JSON.parseObject(oceanusNotice.getData());
                // 支付宝微信的交易订单号
                String alipayTradeNO = jsonObject.getString("tppay_trade_no");
                // QuickPay侧的订单号
                String quickpayTradeNo = jsonObject.getString("quickpay_trade_no");
                // 开发者之前请求传入的商户订单号, 原样返回。
                String OutTradeNo  = jsonObject.getString("out_trade_no");
                // 付款时间
                String payTime  = jsonObject.getString("pay_time");
                // 支付金额,单位分!!!!
                String totalFee  = jsonObject.getString("total_fee");
                // 扩展参数,  开发者之前请求传入的参数,原样返回。
                String Attach  = jsonObject.getString("attach");
                // 支付渠道
                String payChannel  = jsonObject.getString("pay_channel");

                //处理业务
                String msg= "收到订单:::->第三方订单号:"+  alipayTradeNO   +  ",quickpayTradeNo:" +  quickpayTradeNo +  ",OutTradeNo:" +
                        OutTradeNo   + ",Amount:" + totalFee  +  ",attach:" +  Attach +",payChannel:" +payChannel;
                System.out.println( msg );
                logger.info( msg );

        } catch (Exception ex) {
            ex.printStackTrace();
            logger.error(ex.getMessage());
            //日志处理
        }

        return  "SUCCESS";  // 一定返回 SUCCESS,否则会重推
    }

说明:
1.开发者要做事支付通知的幂等处理,对于相同的交易订单在特殊情况下,可能会多次推送。开发者务必做好相应的处理,避免造成损失。

2.开发者确认服务器可公网正常访问,收到消息后,及时返回大写SUCCESS, 如果推送失败,
系统将间隔1、 4、16、64、256分钟后进行推送。

文档更新时间: 2023-09-07 18:09   作者:admin