首先说明一下退款的步骤:php
1:发送退款请求到支付宝算法
2:支付宝会同步告诉你结果,成功或是失败(注意只是你请求的成功与失败.并非退款的成功与失败)json
3:支付宝会再次发送异步请求告诉你结果,这个时候的结果就是退款的成功与失败api
由于公司的业务需求,因此个人退款并无用到第三步.而是在第二步的时候就肯定是退款成功与失败.支付宝这一点比微信和银联要好一点,不用必定要等第三步的时候才能知道到底退款是否是成功.在第二部的时候,支付宝返回结果的时候会有一个资金状态来直接代表是否资金发生了变化.经过getFundChange()能够获取到他的资金变化状态,若是返回的是Y,那么就是退款成功了.安全
下面说一下一些必要的参数:微信
请求地址:url=https://openapi.alipay.com/gateway.doapp
appId:支付宝分配的iddom
privateKey:私钥异步
publicKey:公钥ui
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:这个是支付宝开发文档,一并放上,方便查看