在写退款的时候因为公司有人已经写过支付了,所以一些封装都是直接拿来用来,没有太多的问题.
首先说明一下退款的步骤:
1:发送退款请求到支付宝
2:支付宝会同步告诉你结果,成功或是失败(注意只是你请求的成功与失败.并不是退款的成功与失败)
3:支付宝会再次发送异步请求告诉你结果,这个时候的结果就是退款的成功与失败
因为公司的业务需求,所以我的退款并没有用到第三步.而是在第二步的时候就确定是退款成功与失败.支付宝这一点比微信和银联要好一点,不用一定要等第三步的时候才能知道到底退款是不是成功.在第二部的时候,支付宝返回结果的时候会有一个资金状态来直接表明是否资金发生了变化.通过getFundChange()可以获取到他的资金变化状态,如果返回的是Y,那么就是退款成功了.
下面说一下一些必要的参数:
请求地址:url=https://openapi.alipay.com/gateway.do
appId:支付宝分配的id
privateKey:私钥
publicKey:公钥
sign_type:签名算法(RSA2)
通过以上参数再加上编码格式,可获得AlipayClient对象
AlipayClient client = new DefaultAlipayClient(url, appid, privateKey, "json", "UTF-8", publicKey,RSA2);
AlipayTradeRefundRequest request = new AlipayTradeRefundRequest(); //请求对象
AlipayTradeRefundModel refundModel = new AlipayTradeRefundModel(); //请求实体
//下面是请求的参数
out_trade_no:这个是支付是所产生的订单号,是在支付时商户自己生成的订单号
trade_no:这个是支付时支付宝给你的订单号,是支付宝那边生成的
out_trade_no和trade_no只要有一个就可以,我用的是out_trade_no,支付时商户(也就是支付时自己生成的订单号)订单号
out_request_no:这个是用来标识你是一次退款还是部分退款,如果是一次退款就不用管,如果是部分退款,随机生成就可以;
refund_amount:这个就是退款金额了,注意的是退款金额别大于你的付款金额就行,不然肯定是退款失败
//将所需的请求参数添加到请求实体中
refundModel.setOutTradeNo(out_trade_no); //添加商户退款单号
refundModel.setRefundAmount(totalAmount);//添加退款金额
String uuid=UUID.randomUUID().toString().replaceAll("-", "");//生成用来标识是一次性退款还是部分退款的标识
refundModel.setOutRequestNo(uuid); //添加标识,如果是一次全部退完,这一步就不用了
request.setBizModel(refundModel);//将请求实体添加到请求对象中
AlipayTradeRefundResponse res = client.execute(request); //发送退款请求,获得退款结果
//判断请求是否发送成功
if(res.isSuccess()){
System.out.println("退款请求发送成功");
}
//判断退款是否成功
if(res.getFundChange().equals("Y")){
System.out.println("退款请求发送成功");
}
说明:支付宝退款回调地址和支付宝支付回调地址是同一个,如果退款需要用到回调的,那个地址在你请求支付的时候应该就已经发送给支付宝了,notify_url(回调地址参数)
注意:
1:那个回调地址一定是能够请求的地址,是外网地址.我第一次写的时候写的是内网地址,后来才知道
2:因为支付宝支付与退款用的都是同一个回调地址,所以在用到退款回调的时候要区分到底是支付的回调还是退款的回掉,一般来说,如果是退款回调会有refund_fee这个参数,支付不会有.
这里不敢说是觉得对,如果怕不安全,可以通过多个参数来判断.具体的请查看https://openclub.alipay.com/read.php?tid=9325&fid=61,这里比我要说的详细
3:支付宝支付时的请求方法是sdkExecute(),退款时的请求方法是execute().注意不要写反了
https://docs.open.alipay.com/api_1/alipay.trade.refund:这个是支付宝开发文档,一并放上,方便查看
原文:https://www.cnblogs.com/lxsxsy/p/10782618.html