首先說明一下退款的步驟: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:這個是支付寶開發文檔,一併放上,方便查看