1.下载支付官网提供demo
毕竟用公家的东西,所有熟读支付宝官网上的API与demo是顺利完成调用的条件!!!
https://doc.open.alipay.com/docs/doc.htm?treeId=193&articleId=103419&docType=1
2.支付宝支付成功/退款–异步回调
特别注意:
支付宝退款回调
根据退款的行为可分为全额退款和部分退款。
全额退款,交易状态变为TRADE_CLOSED(交易关闭)。 // 部分退款,交易状态仍为TRADE_SUCCESS(交易成功)。
(1)全额退款:只有App支付和手机网站支付交易状态变为TRADE_CLOSED(交易关闭)会触发异步通知。
(2)部分退款:当面付、电脑网站支付、App支付和手机网站支付交易状态为TRADE_SUCCESS(交易成功)都会触发异步通知。
详情: https://opendocs.alipay.com/support/01raw4?ant_source=opendoc_recommend
/**
* 支付宝支付/退款-订单回调接口
* @param request
* @return
*/
@ApiOperation(value = "支付宝支付-订单回调接口")
@RequestMapping(value="/zfbPay/async", produces="text/html;charset=utf-8")
@ResponseBody
public String zfbPayAsyncNotify(HttpServletRequest request) {
return stuPlatNotifyService.zfbPayAsyncNotify(request);
}
//支付宝支付回调 验签 核实订单是否已支付
@Override
public String zfbPayAsyncNotify(HttpServletRequest request) {
try {
Map<String, String> params = getMapParams(request);
//log.info(">>>----------------zfbPayAsyncNotify---------------params:{}", params);
// 对验签结果进行处理
boolean flag = AlipaySignature.rsaCheckV1(params, AlipayConfig.alipay_public_key, AlipayConfig.charset, "RSA2");
if (flag) {
String outTradeNo = params.get("out_trade_no"); //商户订单号
//先判断是否存out_biz_no 不存在则为-支付缴费 存在则为-退款
if(!params.containsKey("out_biz_no")) {
//查询支付宝 支付订单是否正常
JSONObject payJson = AlipayUtils.tradeQueryDetail(outTradeNo);
if(null!=payJson && null!=payJson.getString("trade_status")){
String tradeStatus = payJson.getString("trade_status");
boolean zfbBool = tradeStatus.equals(AlipayConstants.SUCCESS);
if (zfbBool) {
//String tradeNo = null != payJson.getString("trade_no") ? payJson.getString("trade_no") : null;
//String sendPayDate = null != payJson.getString("send_pay_date") ? payJson.getString("send_pay_date") : null;
//在这里处理支付成功的订单: 修改交易表状态,支付成功
//update status pay success
return "success";
}else{
//update status pay fail
log.error("-zfbPayAsyncNotify-tradeQuery-fail!--"+payJson.get("msg"));
}
}else{
log.error("-zfbPayAsyncNotify-tradeQuery-error!--"+payJson.toString());
}
}else{
//查询支付宝 退款订单是否正常
String outRequestNo = params.get("out_biz_no");
AlipayTradeFastpayRefundQueryResponse alipayRefund = AlipayUtils.refundQueryDetail(outTradeNo, outRequestNo);
if(alipayRefund.isSuccess()) {
String tradeNo = alipayRefund.getTradeNo();
String refundTime = DateFormatUtils.getDateZfb(params.get("gmt_refund")); //gmt_refund refund_time
//在这里处理退款成功的订单: 修改交易表状态,退款成功
//update status refund success
return "success";
}else{
//update status refund fail
log.error("-zfbPayAsyncNotify-refundQuery-error!--"+alipayRefund.getMsg());
}
}
}else{
log.error("---zfbPayAsyncNotify--支付宝支付回调-验签失败:{}",params);
}
} catch (AlipayApiException e) {
log.error("-------zfbPayAsyncNotify-----------error----"+e.getMessage());
}
return "fail";
}
3 为何部分退款会触发TRADE_SUCCESS异步通知
https://opendocs.alipay.com/support/01rawh