注冊沙箱賬號
到螞蟻金服注冊開發者賬號,注冊地址:https://open.alipay.com,用你的 支付寶 賬號掃碼登錄,完善個人信息,選擇服務類型。
根據情況選擇接入方式,我們這里選擇自研開發者,如果已經注冊過的省略。
選擇 開發者中心 --> 研發服務 --> 沙箱,進入沙箱管理界面。
進入沙箱,第一次需要填寫信息,記下appId,公鑰設置處需要把下面步驟生成的公鑰設置到這里。
生成公私秘鑰
登錄官方地址: https://docs.open.alipay.com/291/105971,進入秘鑰生成頁面。
打開下載的工具,運行程序,選擇 JAVA 2048 方式,點擊生成秘鑰。
把此處生成的公鑰復制設置到沙箱環境,就是上面的設置公鑰配置,然后把公私秘鑰保存起來,以備后用。
創建SpringBoot項目
1.在pom.xml中導入支付相關依賴。
2.配置config文件
package com.etc.config; import java.io.FileWriter; import java.io.IOException; /* * *類名:AlipayConfig *功能:基礎配置類 *詳細:設置帳戶有關信息及返回路徑 *修改日期:2017-04-05 *說明: *以下代碼只是為了方便商戶測試而提供的樣例代碼,商戶可以根據自己網站的需要,按照技術文檔編寫,並非一定要使用該代碼。 *該代碼僅供學習和研究支付寶接口使用,只是提供一個參考。 */ public class AlipayConfig { //↓↓↓↓↓↓↓↓↓↓請在這里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ // 應用ID,您的APPID,收款賬號既是您的APPID對應支付寶賬號 public static String app_id = ""; // 商戶私鑰,您的PKCS8格式RSA2私鑰 public static String merchant_private_key = ""; // 支付寶公鑰,查看地址:https://openhome.alipay.com/platform/keyManage.htm 對應APPID下的支付寶公鑰。 public static String alipay_public_key = ""; // 服務器異步通知頁面路徑 需http://格式的完整路徑,不能加?id=123這類自定義參數,必須外網可以正常訪問 public static String notify_url = "http://127.0.0.1:7777/Home"; // 頁面跳轉同步通知頁面路徑 需http://格式的完整路徑,不能加?id=123這類自定義參數,必須外網可以正常訪問 public static String return_url = "http://127.0.0.1:7777/Home"; // 簽名方式 public static String sign_type = "RSA2"; // 字符編碼格式 public static String charset = "utf-8"; // 支付寶網關 public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do"; // 支付寶網關 public static String log_path = "C:\\"; }
3.編寫Controller
package com.etc.controller; import com.alipay.api.AlipayApiException; import com.alipay.api.AlipayClient; import com.alipay.api.DefaultAlipayClient; import com.alipay.api.request.AlipayTradePagePayRequest; import com.etc.config.AlipayConfig; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @CrossOrigin @Api(tags = "支付寶第三方接口支付") @RestController @RequestMapping("/PayController") public class PayController { @RequestMapping("/pay") @ApiOperation("阿里支付") public void payController(HttpServletRequest request, HttpServletResponse response) throws IOException { //設置請求編碼 response.setContentType("text/html;charset=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); //商戶訂單號,商戶網站訂單系統中唯一訂單號,必填 String out_trade_no = new String(request.getParameter("WIDout_trade_no").getBytes("UTF-8"),"UTF-8"); //付款金額,必填 String total_amount = new String(request.getParameter("WIDtotal_amount").getBytes("UTF-8"),"UTF-8"); //訂單名稱,必填 String subject = new String(request.getParameter("WIDsubject").getBytes("UTF-8"),"UTF-8"); //商品描述,可空 String body = new String(request.getParameter("WIDbody").getBytes("UTF-8"),"UTF-8"); System.out.println(out_trade_no); 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 form=""; try { form = alipayClient.pageExecute(alipayRequest).getBody(); //調用SDK生成表單 } catch (AlipayApiException e) { e.printStackTrace(); } response.setContentType("text/html;charset=" + AlipayConfig.charset); response.getWriter().write(form);//直接將完整的表單html輸出到頁面 response.getWriter().flush(); response.getWriter().close(); } }
4.在resources路徑下創建static資源,測試支付。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="PayController/pay" method="post"> 訂單號:<input type="text" name="WIDout_trade_no" required><br/> 訂單名稱:<input type="text" name="WIDsubject"><br/> 付款金額:<input type="text" name="WIDtotal_amount" required><br/> 商品描述:<input type="text" name="WIDbody"><br/> <input type="submit" value="下單"> <input type="reset" value="重置"> </form> </body> </html>
5. 在瀏覽器端訪問 index.html頁面,填寫表單信息之后,點擊提交,此時會跳轉到掃碼支付頁碼。
可以選擇支付的方式:
(1)下載沙箱版本的支付寶掃碼支付
(2)輸入賬號和密碼支付
輸入的是買家的賬號和密碼