alipay.trade.cancel(统一收单交易撤销接口) 支付交易返回失败或支付系统超时,调用该接口撤销交易。如果此订单用户支付失败,支付宝系统会将此订单关闭;如果用户支付成功,支付宝系统会将此订单资金退还给用户。 注意:只有发生支付系统超时或者支付结果未知时可调用撤销,其他正常支付的单如需实现相同功能请调用申请退款API。提交支付交易后调用【查询订单API】,没有明确的支付结果再调用【撤销订单API】。
支付宝扫码枪撤销交易接口
(注意:传入的是交易号 和订单号,但是调用撤销接口的参数最好是交易号.因为如果你传入的订单号不存在,撤销接口依然返回正确的信息. 但是如果你传入的参数为交易号的话.那如果交易号不存在则会返回4004)
AlipayScanningGunController类
@ResponseBody
@PostMapping(value = "/tradeCancel")
@ApiOperation(value = "支付宝扫码枪撤销交易接口")
public Map<String, Object> tradeCancel(
@RequestParam("outTradeNo") String outTradeNo,//商户订单号
@RequestParam("authCode") String authCode,//交易号
@RequestParam("bptPayType") String bptPayType//支付方式(01银联02支付宝03微信04现金
){
return alipayScanningGunService.tradeCancel(outTradeNo,bptPayType,authCode);
AlipayScanningGunServiceImpl实现类代码
/**
* 支付宝扫码枪撤销交易接口
* @param outTradeNo
* @param bptPayType
* @param authCode
* @return
*/
@Override
public Map<String ,Object> tradeCancel(String outTradeNo, String bptPayType,String authCode) {
JSONObject jsonObject = ServiceCommon.getResponseObj();
System.out.println("支付宝扫码枪撤销交易接口-----------------------------------------------------------------------------------");
logger.warn("outTradeNo-----------------:" + outTradeNo);
logger.warn("bptPayType-----------------:" + bptPayType);
logger.warn("authCode-----------------:" + authCode);
if (StringUtils.isEmpty(authCode)) {
logger.error("未获取到交易号");
return null;
}
if (StringUtils.isEmpty(bptPayType)) {
logger.error("未获取到支付方式(01银联02支付宝03微信04现金");
return null;
}
Map<String, Object> backData = new HashMap<String, Object>();
try {
AlipayClient alipayClient = new DefaultAlipayClient(ParameterConfiguration.URL, ParameterConfiguration.APP_ID, ParameterConfiguration.APP_PRIVATE_KEY, "json", ParameterConfiguration.CHARSET, ParameterConfiguration.ALIPAY_PUBLIC_KEY, "RSA2"); //获得初始化的AlipayClient
//创建参数对象
AlipayTradeCancelModel model = new AlipayTradeCancelModel();
model.setTradeNo(authCode);//传入交易号
AlipayTradeCancelRequest request = new AlipayTradeCancelRequest();
request .setBizModel(model);
AlipayTradeCancelResponse response = alipayClient.execute(request);
if(response.isSuccess()){//执行成功但是还是包含几种参数
System.out.println("调用成功-撤销成功--返回值toString----------------------------"+response.toString());
System.out.println("调用成功-撤销成功 返回值getSubCode---------------------------"+response.getSubCode());
System.out.println("调用成功-撤销成功 返回值getSubMsg---------------------------"+response.getSubMsg());
System.out.println("调用成功-撤销成功 返回值getCode---------------------------"+response.getCode());
System.out.println("调用成功-撤销成功 返回值getMsg---------------------------"+response.getMsg());
System.out.println("调用成功-撤销成功 返回值getRetryFlag---------------------------"+response.getRetryFlag());
System.out.println("调用成功-撤销成功 返回值getAction---------------------------"+response.getAction());
System.out.println("调用成功-撤销成功 返回值getOutTradeNo---------------------------"+response.getOutTradeNo());
System.out.println("调用成功-撤销成功 返回值getTradeNo---------------------------"+response.getTradeNo());
System.out.println("调用成功-撤销成功 返回值getParams---------------------------"+response.getParams());
System.out.println("调用成功-撤销成功 返回值getClass---------------------------"+response.getClass());
System.out.println("调用成功-撤销成功 返回值getErrorCode---------------------------"+response.getErrorCode());
if (response != null && !StringUtils.isEmpty(response.getCode()) && response.getCode().equals("10000")){//接口调用成功,调用结果请参考具体的API文档所对应的业务返回参数
//执行成功
System.out.println("调用成功-撤销成功10000-------------------------------------"+response.toString());
backData.put("flag", "1");//0 交易关闭异常 1.交易关闭成功
backData.put("payOrderId", response.getTradeNo());//回调单号
backData.put("orderId", response.getOutTradeNo());//订单id
backData.put("mag", response.getSubMsg());//在微信或支付返回的支付的信息
logger.warn("撤销订单服务调用成功----"+ response.getOutTradeNo());
System.out.println("撤销订单服务调用成功---------------------------------");
jsonObject.put("data",backData);
}/*else if (response != null && !StringUtils.isEmpty(response.getCode()) && response.getCode().equals("20000")){//服务不可用
backData.put("flag", "1");//0 交易关闭异常 1.交易关闭成功
backData.put("payOrderId", response.getTradeNo());//回调单号
backData.put("orderId", response.getOutTradeNo());//订单id
backData.put("mag", response.getSubMsg());//在微信或支付返回的支付的信息
logger.warn("撤销订单服务异常---20000----"+outTradeNo);
System.out.println("撤销订单服务不可用---------------");
jsonObject.put("data",backData);
}else if (response != null && !StringUtils.isEmpty(response.getCode()) && response.getCode().equals("20001")){//授权权限不足
backData.put("flag", "1");//0 交易关闭异常 1.交易关闭成功
backData.put("payOrderId", response.getTradeNo());//回调单号
backData.put("orderId", response.getOutTradeNo());//订单id
backData.put("mag", response.getSubMsg());//在微信或支付返回的支付的信息
logger.warn("撤销订单服务异常---20001----"+outTradeNo);
System.out.println("撤销订单服务授权权限不足------------------------");
jsonObject.put("data",backData);
}else if (response != null && !StringUtils.isEmpty(response.getCode()) && response.getCode().equals("40001")){//缺少必选参数
backData.put("flag", "1");//0 交易关闭异常 1.交易关闭成功
backData.put("payOrderId", response.getTradeNo());//回调单号
backData.put("orderId", response.getOutTradeNo());//订单id
backData.put("mag", response.getSubMsg());//在微信或支付返回的支付的信息
logger.warn("撤销订单服务异常---20001----"+outTradeNo);
System.out.println("撤销订单服务授权权限不足------------------------");
jsonObject.put("data",backData);
}else if (response != null && !StringUtils.isEmpty(response.getCode()) && response.getCode().equals("40002")){//非法的参数
backData.put("flag", "1");//0 交易关闭异常 1.交易关闭成功
backData.put("payOrderId", response.getTradeNo());//回调单号
backData.put("orderId", response.getOutTradeNo());//订单id
backData.put("mag", response.getSubMsg());//在微信或支付返回的支付的信息
logger.warn("撤销订单服务异常---40002----"+outTradeNo);
System.out.println("撤销订单服务非法的参数------------------------");
jsonObject.put("data",backData);
}*/else if (response != null && !StringUtils.isEmpty(response.getCode()) && response.getCode().equals("40004")){//业务处理失败
backData.put("flag", "0");//0 交易关闭异常 1.交易关闭成功
backData.put("payOrderId", response.getTradeNo());//回调单号
backData.put("orderId", response.getOutTradeNo());//订单id
backData.put("mag", response.getSubMsg()+"可能是您传入的参数交易号不存在");//在微信或支付返回的支付的信息
logger.warn("撤销订单服务异常---40004----"+ response.getOutTradeNo());
System.out.println("撤销订单服务业务处理失败------------------------");
jsonObject.put("data",backData);
}/*else if(response != null && !StringUtils.isEmpty(response.getCode()) && response.getCode().equals("40006")){//权限不足
backData.put("flag", "1");//0 交易关闭异常 1.交易关闭成功
backData.put("payOrderId", response.getTradeNo());//回调单号
backData.put("orderId", response.getOutTradeNo());//订单id
backData.put("mag", response.getSubMsg());//在微信或支付返回的支付的信息
logger.warn("撤销订单服务异常---40006----"+outTradeNo);
System.out.println("撤销订单权限不足------------------------");
jsonObject.put("data",backData);
}*/
} else {
backData.put("flag", "0");//0 交易关闭异常 1.交易关闭成功
backData.put("payOrderId", response.getTradeNo());//回调单号
backData.put("orderId", outTradeNo);//订单id
backData.put("mag", response.getSubMsg()+"-------------********************");//在微信或支付返回的支付的信息
logger.warn("撤销订单服务调用失败----"+ response.getOutTradeNo());
System.out.println("撤销订单服务调用失败");
}
}catch (Exception e){
e.printStackTrace();
backData.put("flag", "0");//0 交易关闭异常 1.交易关闭成功
backData.put("orderId", outTradeNo);//订单id
backData.put("mag", "进入异常");//在微信或支付返回的支付的信息
logger.warn("撤销订单服务调用异常----"+ authCode);
return backData;
}
return backData;
}
ParameterConfiguration配置类代码
/** 支付宝支付业务:入参app_id */
public static final String APP_ID = "APPID";//
/** 支付宝网关*/
public static final String URL = "https://openapi.alipay.com/gateway.do";
/** 私钥*/
public static final String APP_PRIVATE_KEY="私钥";
/** 支付宝公钥 */
public static final String ALIPAY_PUBLIC_KEY="支付宝公钥";
/** 编码方式 */
public static final String CHARSET = "utf-8";
/** 回调地址 */
public static final String CHAT_PAY_URL = "http://ip:项目端口/类路径/方法路径";
官方请求示例:
AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do","app_id","your private_key","json","GBK","alipay_public_key","RSA2");
AlipayTradeCancelRequest request = new AlipayTradeCancelRequest();
request.setBizContent("{" +
"\"out_trade_no\":\"20150320010101001\"," +
"\"trade_no\":\"2014112611001004680073956707\"" +
" }");
AlipayTradeCancelResponse response = alipayClient.execute(request);
if(response.isSuccess()){
System.out.println("调用成功");
} else {
System.out.println("调用失败");
}
响应示例1 JSon版本:
{
"alipay_trade_cancel_response": {
"code": "10000",
"msg": "Success",
"trade_no": "2013112011001004330000121536",
"out_trade_no": "6823789339978248",
"retry_flag": "N",
"action": "close",
"gmt_refund_pay": "2016-11-27 15:45:57",
"refund_settlement_id": "2018101610032004620239146945"
},
"sign": "ERITJKEIJKJHKKKKKKKHJEREEEEEEEEEEE"
}
响应示例 2 XML版本:
<alipay_trade_cancel_response>
<code>10000</code>
<msg>Success</msg> <trade_no>2013112011001004330000121536</trade_no>
<out_trade_no>6823789339978248</out_trade_no>
<retry_flag>N</retry_flag>
<action>close</action>
<gmt_refund_pay>2016-11-27 15:45:57</gmt_refund_pay>
<refund_settlement_id>2018101610032004620239146945</refund_settlement_id>
</alipay_trade_cancel_response>
异常示例:
{
"alipay_trade_cancel_response": {
"code": "20000",
"msg": "Service Currently Unavailable",
"sub_code": "isp.unknow-error",
"sub_msg": "系统繁忙"
},
"sign": "ERITJKEIJKJHKKKKKKKHJEREEEEEEEEEEE"
}
业务错误码
错误码 错误描述 解决方案
AQC.SYSTEM_ERROR 系统错误 请使用相同的参数再次调用
ACQ.INVALID_PARAMETER 参数无效 请求参数有错,重新检查请求后,再调用撤销
ACQ.SELLER_BALANCE_NOT_ENOUGH 商户的支付宝账户中无足够的资金进行撤销 商户支付宝账户充值后重新发起撤销即可
ACQ.REASON_TRADE_BEEN_FREEZEN 当前交易被冻结,不允许进行撤销 联系支付宝小二,确认该笔交易的具体情况