【java】支付寶實現退款功能
阿新 • • 發佈:2019-01-24
最近完成的差不多的專案突然需要加退款的流程需求了,所以來小小的實現以下。
其實對比其他的支付和退款來說,支付寶算是特別專業,也是特別簡單的一個了,所以,先拿他來開刀了。
一、引入支付寶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 是封裝的一個實體,裡面都是退款所需要的資料,包括流水單號,還有需要退款的金額等等。