隐藏

实现支付宝全额退款和部分退款功能

发布:2020/4/26 11:44:45作者:管理员 来源:本站 浏览次数:966

由于公司开发需要,特地花时间看了看,在此记录一下,废话不多说,直接上代码,代码里面都有注释

到官网查看文档:https://docs.open.alipay.com/api_1/alipay.trade.refund

之前必须要引入相应jar包

maven依赖如下:

<execution>
              <id>install-alipay-sdk</id>
                        <phase>clean</phase>
                        <configuration>
                            <file>${project.basedir}/libs/alipay-sdk-java20171026141113.jar</file>
                            <groupId>com.alipay</groupId>
                            <artifactId>alipay-sdk</artifactId>
                            <version>20171026141113</version>
                            <packaging>jar</packaging>
                            <generatePom>true</generatePom>
                        </configuration>
                        <goals>
                            <goal>install-file</goal>
                        </goals>
    </execution>

<dependency>
            <groupId>com.alipay</groupId>
            <artifactId>alipay-sdk</artifactId>
            <version>20171026141113</version>
</dependency>

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradeRefundModel;
import com.alipay.api.request.AlipayTradeRefundRequest;
import com.alipay.api.response.AlipayTradeRefundResponse;
 //全额退款
public class AlipayUtil {
    
    private static final Logger LOGGER = LoggerFactory.getLogger(AlipayUtil.class);   
    
    //商户的appid
    public static String APP_ID="";
    //支付宝退款请求的网关
    private static String requestUrl = "https://openapi.alipay.com/gateway.do";
    //用户自己生成的私钥
    public static String PRIVATE_KEY = "";
    //支付宝公钥
    public static String ALIPAY_PUBLIC_KEY  = "";
    
    //编码级别
    private static String CHARSET = "UTF-8";
 
    public static String refundOrder(AliRefundTO aliRefundTO){
      System.out.println("开始调用支付宝加密。。。");
          //实例化客户端
        AlipayClient alipayClient = new DefaultAlipayClient(requestUrl, APP_ID, PRIVATE_KEY, "json", CHARSET, ALIPAY_PUBLIC_KEY, "RSA2");
        //SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
   
        
        AlipayTradeRefundModel refundModel = new AlipayTradeRefundModel();
        refundModel.setTradeNo(aliRefundTO.getTrade_no());
        refundModel.setRefundAmount(aliRefundTO.getRefund_amount());
        refundModel.setRefundReason("商品退款");
        //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
        AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
        request.setBizModel(refundModel);
        try{
            AlipayTradeRefundResponse response = alipayClient.execute(request);
            System.out.println(response.getMsg()+"\n");
            System.out.println(response.getBody());
        }catch(Exception e){
            e.printStackTrace();
            LOGGER.error("支付宝退款错误!",e.getMessage());            
        }    
        return "";        
      }
 
      public static void main(String[] arg){
          AliRefundTO aliRefundTO=new AliRefundTO();
          aliRefundTO.setRefund_amount("0.01");//金额
          aliRefundTO.setTrade_no("xxxxxxxxxxxxxxxxxxxx");//设置支付宝流水号
          String res=refundOrder(aliRefundTO);
      }
}

//一个订单部分退款

import org.apache.commons.lang.RandomStringUtils;

import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradeRefundRequest;
import com.alipay.api.response.AlipayTradeRefundResponse;

public class AlipayRefundUtil {
     /**  支付宝退款接口
     * @param out_trade_no 订单支付时传入的商户订单号,不能和支付宝交易号(trade_no)同时为空。
     * @param trade_no 支付宝交易号
     * @param refund_amount 需要退款的金额,该金额不能大于订单金额,单位为元,支持两位小数
     * @return 将提示信息返回
     */
    public  synchronized static  String alipayRefundRequest(String out_trade_no,String trade_no,double refund_amount) {
        String returnStr = null;
        String out_request_no=RandomStringUtils.randomAlphanumeric(13);//随机数  不是全额退款,部分退款必须使用该参数,同一个订单,不同的out_request_no代表部分退款
        try {
            AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do","商户的appid","用户自己生成的私钥","JSON", "utf-8", "支付宝公钥", "RSA2");
            AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
            request.setBizContent("{" +
                    "\"out_trade_no\":\"" + out_trade_no + "\"," +
                    "\"trade_no\":\"" + trade_no + "\"," +
                    "\"refund_amount\":\"" + refund_amount + "\"," +

                    "\"out_request_no\":\"" + out_request_no+ "\"," +
                    "\"refund_reason\":\"正常退款\"" +
                    " }");
            AlipayTradeRefundResponse response;
            response = alipayClient.execute(request);
            if (response.isSuccess()) {
                System.out.println("支付宝退款成功");
            } else {
                returnStr = response.getSubMsg();//失败会返回错误信息
            }


        } catch (Exception e) {
            e.printStackTrace();
        }
        return returnStr;
    }


    public static void main(String str[]){
        
      String strq=  alipayRefundRequest("","XXXXXX",0.01D);//第一个参数和第二个参数必须填一个
      System.out.println(strq);
    }


}

到此,就可以实现醍醐宝退款功能了,还是很简单的。