本文講解如何在pc網頁上完成支付寶的支付功能, 詳細講解了支付寶的配置信息,項目如何使用配置信息等, 本項目中代碼能夠直接運行, 也能夠將代碼遷移至你本身的項目中直接使用。 注意: 下面講解的功能只能用在pc網頁上進行支付, 不能用於其它場景支付。html
實例下載java
1.本項目中使用的工具能夠在百度雲下載: 算法
Eclipse: https://pan.baidu.com/s/1ci4Nimexpress
Tomcat: https://pan.baidu.com/s/1eS6JlrOjson
Maven: https://pan.baidu.com/s/1i4Ud35Fapi
JDK1.7: http://pan.baidu.com/s/1pLBMCHH服務器
2.項目配置準備:app
配置參數:APPID, 應用私鑰,支付寶公鑰,將生成的參數在代碼中進行替換, 配置參數生成步驟見下面dom
2.1 訪問支付寶開放平臺官網: https://open.alipay.com/platform/home.htm, 使用支付寶app掃碼登陸jsp
2.2 訪問開放平臺的【開發者中心】->【研發服務】功能,進入沙箱環境
2.3 沙箱環境中, 查看【研發服務】->【沙箱應用】,頁面以下
沙箱環境下默認爲用戶分配了APPID, 支付寶網關(注意這個地址中帶dev字樣,正式環境下沒有dev), 用戶須要手動配置
RSA2密鑰,也能夠配置RSA密鑰(推薦RSA2)
點擊上圖的【設置應用公鑰】後,彈出以下圖A所示, 點擊下圖A中的【設置應用公鑰】,彈出編輯框(圖B),在編輯框中 填寫應用公鑰,此公鑰可使用工具生成, 工具的下載可參見圖B中【查看密鑰生成】, 圖C爲密鑰工具截圖
2.4 密鑰工具生成了 應用的公鑰和私鑰,請上傳公鑰,本身保留 私鑰(後面會用到), 公鑰上傳成功後,支付寶生成相 應的公鑰(見圖D) 注意: 這裏分【應用公鑰】和【支付寶公鑰】, 代碼使用中請注意使用的是哪一種密鑰
3 項目運行效果圖
項目本地運行後,訪問地址: http://localhost:8080/Alipay/index.jsp
3.1 支付頁面
付款時,商戶訂單號(out_trade_no)必須惟一,訂單號由應用程序根據算法生成, 點擊【下圖】(圖E)付款後,彈出圖F 對應的付款頁面,掃碼付款成功後,返回商戶提早設定的頁面(圖G), 圖G地址欄url中 return_url.jsp爲提早設置的付款成 功調用頁面,此頁面開發者可根據業務自行定製,本例中顯示支付成功後返回的支付信息,支付寶對應的訂單號 trade_no
3.2 交易查詢
交易查詢功能爲用戶提供了歷史訂單查詢功能,查詢條件爲: 商戶訂單號(out_trade_no),支付寶交易號(trade_no),
二個條件至少要選填一個, 調用此接口後,返回交易結果信息(見圖I), code=10000, msg="Success" 代表交易成功
3.3 退款
退款操做將A付給B的錢退給B, 退給B的錢能夠進行一次或者屢次,但數次累加總和不能超過以前A給B的錢,具體見代碼
4 代碼詳解:
4.1 支付頁面jsp代碼, 代碼中包含了 支付寶開發網關 gatewayUrl, appid, 應用私鑰:merchant_private_key
支付寶公鑰: alipay_public_key
注意: 支付寶付款成功後,支付寶服務器調用應用程序的接口告之付款是否真正成功,也就是說付款成功以後的邏輯應 該放在此接口中進行處理,一筆交易成功後,會回調屢次(注意邏輯控制),
回調接口設置代碼: alipayRequest.setNotifyUrl(AlipayConfig.notify_url);
支付成功後跳轉頁面設置: AlipayConfig.return_url
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>付款</title> </head> <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <%@ page import="com.alipay.config.*"%> <%@ page import="com.alipay.api.*"%> <%@ page import="com.alipay.api.request.*"%> <%-- <%@ page import="com.alipay.sdk.app.EnvUtils"%> --%> <% //得到初始化的AlipayClient //com.alipay.sdk.app.EnvUtils /* EnvUtils.setEnv(EnvUtils.EnvEnum.SANDBOX); */ AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type); //設置請求參數 AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest(); alipayRequest.setReturnUrl(AlipayConfig.return_url); alipayRequest.setNotifyUrl(AlipayConfig.notify_url); //商戶訂單號,商戶網站訂單系統中惟一訂單號,必填 String out_trade_no = new String(request.getParameter("WIDout_trade_no").getBytes("ISO-8859-1"),"UTF-8"); //付款金額,必填 String total_amount = new String(request.getParameter("WIDtotal_amount").getBytes("ISO-8859-1"),"UTF-8"); //訂單名稱,必填 String subject = new String(request.getParameter("WIDsubject").getBytes("ISO-8859-1"),"UTF-8"); //商品描述,可空 String body = new String(request.getParameter("WIDbody").getBytes("ISO-8859-1"),"UTF-8"); alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\"," + "\"total_amount\":\""+ total_amount +"\"," + "\"subject\":\""+ subject +"\"," + "\"body\":\""+ body +"\"," + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}"); //若想給BizContent增長其餘可選請求參數,以增長自定義超時時間參數timeout_express來舉例說明 //alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\"," // + "\"total_amount\":\""+ total_amount +"\"," // + "\"subject\":\""+ subject +"\"," // + "\"body\":\""+ body +"\"," // + "\"timeout_express\":\"10m\"," // + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}"); //請求參數可查閱【電腦網站支付的API文檔-alipay.trade.page.pay-請求參數】章節 //請求 String result = alipayClient.pageExecute(alipayRequest).getBody(); System.out.println("result:" + result); //輸出 out.println(result); %> <body> </body> </html>
4.2 交易查詢
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>交易查詢</title> </head> <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <%@ page import="com.alipay.config.*"%> <%@ page import="com.alipay.api.*"%> <%@ page import="com.alipay.api.request.*"%> <% //得到初始化的AlipayClient AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type); //設置請求參數 AlipayTradeQueryRequest alipayRequest = new AlipayTradeQueryRequest(); //商戶訂單號,商戶網站訂單系統中惟一訂單號 String out_trade_no = new String(request.getParameter("WIDTQout_trade_no").getBytes("ISO-8859-1"),"UTF-8"); //支付寶交易號 String trade_no = new String(request.getParameter("WIDTQtrade_no").getBytes("ISO-8859-1"),"UTF-8"); //請二選一設置 alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","+"\"trade_no\":\""+ trade_no +"\"}"); //請求 String result = alipayClient.execute(alipayRequest).getBody(); //輸出 out.println(result); %> <body> </body> </html>
4.3 交易退款
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>退款</title> </head> <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <%@ page import="com.alipay.config.*"%> <%@ page import="com.alipay.api.*"%> <%@ page import="com.alipay.api.request.*"%> <% //得到初始化的AlipayClient AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type); //設置請求參數 AlipayTradeRefundRequest alipayRequest = new AlipayTradeRefundRequest(); //商戶訂單號,商戶網站訂單系統中惟一訂單號 String out_trade_no = new String(request.getParameter("WIDTRout_trade_no").getBytes("ISO-8859-1"),"UTF-8"); //支付寶交易號 String trade_no = new String(request.getParameter("WIDTRtrade_no").getBytes("ISO-8859-1"),"UTF-8"); //請二選一設置 //須要退款的金額,該金額不能大於訂單金額,必填 String refund_amount = new String(request.getParameter("WIDTRrefund_amount").getBytes("ISO-8859-1"),"UTF-8"); //退款的緣由說明 String refund_reason = new String(request.getParameter("WIDTRrefund_reason").getBytes("ISO-8859-1"),"UTF-8"); //標識一次退款請求,同一筆交易屢次退款須要保證惟一,如需部分退款,則此參數必傳 String out_request_no = new String(request.getParameter("WIDTRout_request_no").getBytes("ISO-8859-1"),"UTF-8"); alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\"," + "\"trade_no\":\""+ trade_no +"\"," + "\"refund_amount\":\""+ refund_amount +"\"," + "\"refund_reason\":\""+ refund_reason +"\"," + "\"out_request_no\":\""+ out_request_no +"\"}"); //請求 String result = alipayClient.execute(alipayRequest).getBody(); //輸出 out.println(result); %> <body> </body> </html>