Spring Boot 3.4 實現支付寶支付集成,輕松搞定支付功能
支付寶支付集成是電商應用中常見的功能之一,今天我們將通過 Spring Boot 3.4 來實現這一功能,包括支付寶沙箱環境配置、內網穿透配置、支付請求參數的設置等步驟,確保你能快速上手并完成支付功能的集成。
支付寶沙箱環境配置
為了進行支付功能的測試,我們需要使用支付寶提供的沙箱環境。這是一個虛擬的支付環境,專門用于測試和調試。訪問沙箱環境:支付寶沙箱 https://openhome.alipay.com/platform/appDaily.htm。使用沙箱時,可以采用默認的密鑰進行測試,我們只需要獲取以下幾個關鍵數據:
- 支付寶的公鑰和私鑰
- 支付的網關地址
- 支付的APP ID
內網穿透配置
在本地開發時,我們通常會遇到接口請求的問題:如果外部系統需要調用我們的接口(比如支付寶返回支付結果),那么我們需要一個公網地址來接收這些回調請求。此時,內網穿透技術便派上了用場,它可以幫助我們將本地服務器暴露到公網。
通過使用如 Ngrok https://ngrok.com/ 或 Natapp https://natapp.cn 等工具,你可以為本地服務配置一個公網地址。免費版通常會提供一個隨機生成的地址,這樣你就能在外網測試接口了。
配置支付寶支付 SDK
在集成支付寶支付前,我們需要引入支付寶的 SDK。以下是添加依賴的 Maven 配置:
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.9.28.ALL</version>
</dependency>
接下來,我們在 application.yml
文件中配置支付寶相關信息:
server:
port: 9090
alipay:
appId: 9021000135634074
appPrivateKey: <your-app-private-key>
alipayPublicKey: <your-alipay-public-key>
notifyUrl: http://v6tqyw.natappfree.cc/alipay/notify
支付請求參數對象
為了創建支付請求,我們需要準備支付訂單的基本信息,如訂單號、金額、商品描述等。這些信息會通過支付寶的 API 發起請求。
定義一個支付請求對象 PayVO
:
package com.icoderoad.dto;
import java.math.BigDecimal;
@Data
public class PayVO {
private String outTradeNo; // 商戶訂單號
private String subject; // 訂單名稱
private BigDecimal totalAmount; // 付款金額
private String body; // 商品描述
}
支付接口實現
接下來,我們需要通過支付寶 SDK 創建支付客戶端并發送支付請求。以下是實現的關鍵步驟:
package com.icoderoad.controller;
import com.icoderoad.config.AliPayConfig;
import com.icoderoad.dto.PayVO;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.AlipayClient;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.alipay.api.AlipayApiException;
import com.alipay.api.response.AlipayTradePagePayResponse;
import org.springframework.web.bind.annotation.*;
import org.springframework.beans.factory.annotation.Autowired;
import javax.servlet.http.HttpServletResponse;
import java.util.UUID;
@RestController
@RequestMapping("/alipay")
public class AliPayController {
@Autowired
private AliPayConfig aliPayConfig;
private static final String GATEWAY_URL = "https://openapi-sandbox.dl.alipaydev.com/gateway.do";
private static final String CHARSET = "utf-8";
private static final String SIGN_TYPE = "RSA2";
@GetMapping("/pay")
public void pay(PayVO payVO, HttpServletResponse response) throws Exception {
// 創建支付客戶端
AlipayClient alipayClient = new DefaultAlipayClient(
GATEWAY_URL,
aliPayConfig.getAppId(),
aliPayConfig.getAppPrivateKey(),
"JSON",
CHARSET,
aliPayConfig.getAlipayPublicKey(),
SIGN_TYPE
);
// 創建支付請求對象
AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
request.setNotifyUrl(aliPayConfig.getNotifyUrl());
// 設置請求參數
payVO.setOutTradeNo(UUID.randomUUID().toString());
request.setBizContent("{\"out_trade_no\":\"" + payVO.getOutTradeNo() + "\","
+ "\"total_amount\":\"" + payVO.getTotalAmount() + "\","
+ "\"subject\":\"" + payVO.getSubject() + "\","
+ "\"body\":\"" + payVO.getBody() + "\","
+ "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
// 設置回調接口
request.setReturnUrl("http://localhost:9090/hello/pay");
// 執行支付請求
try {
String form = alipayClient.pageExecute(request).getBody();
response.setContentType("text/html;charset=" + CHARSET);
response.getWriter().write(form);
response.getWriter().flush();
response.getWriter().close();
} catch (AlipayApiException e) {
e.printStackTrace();
}
}
}
支付回調接口
支付寶支付成功后,會調用我們在 notifyUrl
中配置的回調接口。這時,我們需要在回調接口中處理支付結果,確認支付狀態。
package com.icoderoad.controller;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/alipay")
public class AliPayCallbackController {
@PostMapping("/notify")
public void handleNotify(@RequestBody String notifyData) {
// 處理支付結果通知
// 例如:驗證簽名、更新訂單狀態等
}
}
測試支付
在集成完成后,你可以通過訪問以下 URL 來測試支付流程:
http://localhost:9090/alipay/pay?subject=測試商品&total_amount=1000
在支付寶沙箱環境中,輸入測試賬號和支付密碼完成支付。支付成功后,支付寶將會回調我們的 notifyUrl
,我們可以通過此接口接收支付結果并更新訂單狀態。
總結
通過上述步驟,我們成功地將支付寶支付集成到 Spring Boot 3.4 項目中,完成了支付功能的實現。這些操作不僅可以應用于本地開發環境,還可以通過內網穿透技術進行公網測試,確保支付寶支付功能在實際環境中的順利運行。