1. 程式人生 > >【java】支付寶實現退款功能

【java】支付寶實現退款功能

        最近完成的差不多的專案突然需要加退款的流程需求了,所以來小小的實現以下。

其實對比其他的支付和退款來說,支付寶算是特別專業,也是特別簡單的一個了,所以,先拿他來開刀了。

一、引入支付寶SDK

        在這裡說一下,其實每種支付都會有一個官方帶的SDK,我們可以把這個sdk引入到我們的專案中去,然後我們就可以呼叫裡面的方法和物件,給裡面傳值,進行我們相應的請求的訪問和介入。

        

首先引入如上圖所示的jar包,然後我們就算是成功了一半了。下載地址:

         然後我們需要把這個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 是封裝的一個實體,裡面都是退款所需要的資料,包括流水單號,還有需要退款的金額等等。