【支付宝退款】java实现支付宝退款流程

前言

微信登录网页授权与APP授权
微信JSAPI支付
微信APP支付
微信APP和JSAPI退款
支付宝手机网站支付
支付宝APP支付
支付宝退款
以上我都放到个人公众号,搜一搜:JAVA大贼船,文末有公众号二维码!觉得个人以后开发会用到的可以关注一下哦!少走点弯路…

官方文档

传送门

支付宝退款相对比较简单,废话就不哆嗦了,直接看代码实现

代码实现
参数配置

application.yml

# 支付宝相关
ALIPAY:
# 应用ID
 APP_ID: 
 # 应用私钥
 APP_PRIVATE_KEY: 
 #应用公钥
 APP_PUBLIC_KEY: 
 # 支付宝公钥
 ALIPAY_PUBLIC_KEY: 
 # 统一签名算法
 SIGN_TYPE: RSA2
 # 统一字符
 CHARSET: utf-8
 # 返回数据格式
 FORMAT: json
 # 支付基础API
 SERVER_URL: https://openapi.alipay.com/gateway.do
 #支付宝支付回调地址
 ALIPAY_NOTIFY_URL: 
 # 支付宝收银台会自动跳转回商户return_url指定的页面。
 RETURN_URL:
 # 支付宝Api版本
 API_VERSION: 1.0
  # 产品码 
 PROD_CODE: 
 # 终端信息
 TERMINAL_INFO: 
 # 终端信息类型
 TERMINAL_TYPE: 

YmlParament

   //支付宝相关
   @Value("${ALIPAY.APP_ID}")
   private String appId;

   @Value("${ALIPAY.APP_PRIVATE_KEY}")
   private String appPrivatekey;

   @Value("${ALIPAY.APP_PUBLIC_KEY}")
   private String appPublickey;

   @Value("${ALIPAY.ALIPAY_PUBLIC_KEY}")
   private String alipayPublickey;

   @Value("${ALIPAY.SIGN_TYPE}")
   private String signType;

   @Value("${ALIPAY.CHARSET}")
   private String charset;

   @Value("${ALIPAY.FORMAT}")
   private String format;

   @Value("${ALIPAY.SERVER_URL}")
   private String serverUrl;

   @Value("${ALIPAY.ALIPAY_NOTIFY_URL}")
   private String alipayNotifyUrl;

   @Value("${ALIPAY.RETURN_URL}")
   private String returnUrl;

   @Value("${ALIPAY.API_VERSION}")
   private String apiVersion;

   @Value("${ALIPAY.PROD_CODE}")
   private String prodCode;

   @Value("${ALIPAY.TERMINAL_INFO}")
   private String terminalInfo;

   @Value("${ALIPAY.TERMINAL_TYPE}")
   private String terminalType;

初始化支付宝配置

AlipayConfig

	@Autowired
   private YmlParament ymlParament;
   
   /**
    * 设置支付宝客户端
    * @return
    */
   @Bean
   public AlipayClient setAlipayClient() {
      return new DefaultAlipayClient(
            ymlParament.getServerUrl(), 
            ymlParament.getAppId(),
            ymlParament.getAppPrivatekey(), 
            ymlParament.getFormat(), 
            ymlParament.getCharset(), 
          //这里不要搞错,这里是应用公钥而不是支付宝公钥
            ymlParament.getAppPublickey(), 
            ymlParament.getSignType()
            ); 
   }

   /**
    * 退款请求公共参数
    * 具体执行操作参考:ZfbPay.tradeRefund
    * 参考官方链接:https://opendocs.alipay.com/apis/api_1/alipay.trade.refund
    */
   @Bean
   public AlipayTradeRefundRequest setAlipayTradeRefundRequest() {
      AlipayTradeRefundRequest atrr=new AlipayTradeRefundRequest();
      atrr.setApiVersion(ymlParament.getApiVersion());
      atrr.setProdCode(ymlParament.getProdCode());
      atrr.setTerminalInfo(ymlParament.getTerminalInfo());
      atrr.setTerminalType(ymlParament.getTerminalType());
      return atrr;
   }
支付宝退款接口

ZfbPay

	/**
	 * 
	 * @param ac
	 * @param request
	 * @param outTradeNo 订单号
	 * @param refundAmount 需要退款的金额,该金额不能大于订单金额,单位为元,支持两位小数
	 * @param outRequestNo 标识一次退款请求,同一笔交易多次退款需要保证唯一,如需部分退款,则此参数必传。
	 * @param refundReason 退款的原因说明
	 * @return 
	 * @throws AlipayApiException
	 */
	public static AlipayTradeRefundResponse tradeRefund(AlipayClient ac, AlipayTradeRefundRequest request,String outTradeNo,String refundAmount, String outRequestNo,String refundReason) throws Exception {
		AlipayTradeRefundModel mode = new AlipayTradeRefundModel();
		mode.setOutTradeNo(outTradeNo);
		mode.setRefundAmount(refundAmount);
		mode.setOutRequestNo(outRequestNo);
		mode.setRefundReason(refundReason);
		request.setBizModel(mode);
		return ac.execute(request);
	}

服务层(业务逻辑略)

	@Autowired
    private AlipayClient alipayClient;
    @Autowired
    private AlipayTradeRefundRequest alipayTradeRefundRequest;
	
    @Transactional
    @Override
    public void alipayRefund(AlipayClient ac, AlipayTradeRefundRequest request, String outTradeNo, String refundAmount, String refundNo) throws Exception {
        AlipayTradeRefundResponse alipayTradeRefundResponse = ZfbPay.tradeRefund(alipayClient, alipayTradeRefundRequest, outTradeNo, refundAmount, refundNo, "我要退款");
        if (!alipayTradeRefundResponse.isSuccess()){
            throw new RuntimeException(alipayTradeRefundResponse.getMsg());
        }
        //业务逻辑
    }
支付宝退款回调通知

支付宝的退款回调通知是默认回调到支付时候的回调地址,若你在支付回调的时候做了一些业务,退款回调的时候又执行了这些业务逻辑,这样大问题就来啦!那如何区分哪个是退款的异步通知呢,别慌,请往下看!

1、支付成功和部分退款成功的交易状态都是TRADE_SUCCESS,但是部分退款的异步通知参数中一定会返回out_biz_no(商户业务号)、refund_fee(总退款金额)、gmt_refund(交易退款时间)参数,支付成功不会返回。
2、未付款交易超时关闭和支付完成后全额退款的交易状态都是TRADE_CLOSED,但是全额退款导致交易关闭的的异步通知参数中一定会返回gmt_payment(交易付款时间)、gmt_refund(交易退款时间)参数,未付款交易超时关闭导致的交易关闭不会返回。

所以,你明白怎么做了吗?略略略…
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值