進入螞蟻金服開放平台->開發者中心
按照文檔新建應用,下載RSA密鑰秘鑰生成器,然后設置為應用公鑰,設置完成后會自動生成支付寶公鑰。

下載demo代碼,下圖為web支付,包括一系列功能及回調通知、異步通知。

更改AlipayConfig.java代碼

將demo改成servlet請求,方便邏輯處理返回其他數據

AlipayConfig.java
package com.alipay.config; import java.io.FileWriter; import java.io.IOException; /* * *類名:AlipayConfig *功能:基礎配置類 *詳細:設置帳戶有關信息及返回路徑 *修改日期:2017-04-05 *說明: *以下代碼只是為了方便商戶測試而提供的樣例代碼,商戶可以根據自己網站的需要,按照技術文檔編寫,並非一定要使用該代碼。 *該代碼僅供學習和研究支付寶接口使用,只是提供一個參考。 */ public class AlipayConfig { //↓↓↓↓↓↓↓↓↓↓請在這里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ // 應用ID,您的APPID,收款賬號既是您的APPID對應支付寶賬號 public static String app_id = "APPID"; // 商戶私鑰,您的PKCS8格式RSA2私鑰 public static String merchant_private_key = "RSA私鑰"; // 支付寶公鑰,查看地址:https://openhome.alipay.com/platform/keyManage.htm 對應APPID下的支付寶公鑰。 public static String alipay_public_key = "根據RSA公鑰生成的支付寶公鑰"; // 服務器異步通知頁面路徑 需http://格式的完整路徑,不能加?id=123這類自定義參數,必須外網可以正常訪問 public static String notify_url = "http://異步通知接口地址/notify_url"; // 頁面跳轉同步通知頁面路徑 需http://格式的完整路徑,不能加?id=123這類自定義參數,必須外網可以正常訪問 public static String return_url = "http://同步通知地址/Alipay/return_url.jsp"; // 簽名方式 public static String sign_type = "RSA2"; // 字符編碼格式 public static String charset = "utf-8"; // 支付寶網關 public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do"; //↑↑↑↑↑↑↑↑↑↑請在這里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ }
Pay.java
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //獲取要向支付寶支付的參數,由頁面傳過來 //商戶訂單號,商戶網站訂單系統中唯一訂單號,必填 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"); //獲得初始化的AlipayClient 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); //設置異步回調通知 //設置支付參數 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 = null; try { result = alipayClient.pageExecute(alipayRequest).getBody(); } catch (AlipayApiException e) { // TODO Auto-generated catch block e.printStackTrace(); } //輸出 /*打印的是支付寶付款碼頁面<form name="punchout_form" method="post" action="https://openapi.alipaydev.com/gateway.do?sign=NM7Zk33PH6W%2BFxkXVMfcg4ZeTVas3YS5aJoktIiZZOLv1hO4o23yHQvSW%2BTRt5RJCMJFcX0V%2BJQPoHwznZDA31ZywODBfqTjhsHaBenpbmxVOXjKSJE0ODI8Wf39d2AMDRThIJT6m4FtGYvbHMAgHeDLhX0X5HYgg5mGzZJLYAXbcgBKJioULyEX5Yfn%2Bd7twx8F01pJWsfeCFWkQNd46GetzQ83HivXDEmHXEbV3N47gjgJYBSlptLhK%2Bj9d8QTzvYJ6el3D×tamp=2018-07-06+10%3A17%3A37&sign_type=RSA2¬ify_url=http%3A%2F%2Flocalhost%3A80%2FAlipay%2Fnotify_url.jsp&charset=utf-8&app_id=20160804&method=alipay.trade.page.pay&return_url=http%3A%2F%2Flocalhost%3A80%2FAlipay%2Freturn_url.jsp&version=1.0&alipay_sdk=alipay-sdk-java-dynamicVersionNo&format=json"> <input type="hidden" name="biz_content" value="{"out_trade_no":"201876101732228","total_amount":"1000","subject":"測試","body":"","product_code":"FAST_INSTANT_TRADE_PAY"}"> <input type="submit" value="立即支付" style="display:none" > </form> <script>document.forms[0].submit();</script>*/ response.resetBuffer(); response.setContentType("text/html;charset=UTF-8"); response.getOutputStream().write(result.toString().getBytes("utf-8")); response.getOutputStream().flush(); //response.getWriter().println(result); //response.getWriter().flush(); }
支付接口源碼
問題:
回調通知驗簽成功,異步通知驗簽失敗。要把異步通知中demo代碼的這段注釋

