支付宝当面付支付笔记3-交易撤销

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		当前交易被冻结,不允许进行撤销						联系支付宝小二,确认该笔交易的具体情况
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值