支付回调通知
用户付款后,支付系统会通知到开发者请求提供的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