最近完成的差不多的項目突然需要加退款的流程需求了,所以來小小的實現以下。
其實對比其他的支付和退款來說,支付寶算是特別專業,也是特別簡單的一個了,所以,先拿他來開刀了。
一、引入支付寶SDK
在這裏說一下,其實每種支付都會有一個官方帶的SDK,我們可以把這個sdk引入到我們的項目中去,然後我們就可以調用裏面的方法和對象,給裏面傳值,進行我們相應的請求的訪問和介入。
首先引入如上圖所示的jar包,然後我們就算是成功了一半了。下載地址:
https://docs.open.alipay.com/54/103419/
然後我們需要把這個jar包引入到所需要的地方,這裏不做過多的描述。
二、找到需要的資源
做支付,最最基本的還是各種appid,還有公鑰,私鑰,以及請求的網關等等內容,支付寶需要的包括:
APP_ID:開放平臺賬號申請的appid
requestUrl:實現功能所需要請求的網關地址
APP_PRIVATE_KEY:用戶自己生成的私鑰
ALIPAY_PUBLIC_KEY:支付寶生成的公鑰
CHARSET:我們需要的字符編碼,一般爲utf-8的
三、編寫請求代碼
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);
private static String APP_ID = "234789720984098";
//支付寶退款請求的網關
private static String requestUrl = "https://openapi.alipay.com/gateway.do";
//用戶自己生成的私鑰
private static String APP_PRIVATE_KEY = "隨機字符,見文檔";
//支付寶公鑰
private 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, APP_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("2018050421001004310518105890");
String res=refundOrder(aliRefundTO);
}
}
這裏的AliRefundTO 是封裝的一個實體,裏面都是退款所需要的數據,包括流水單號,還有需要退款的金額等等。