1. 獲取應用id,應用私鑰和支付寶公鑰
進入支付寶控制臺:https://open.alipay.com/develop/manage
找到沙箱
這里可以看到應用id
可以看到應用私鑰
和支付寶公鑰
,獲取這三后就可以開始敲代碼了
2. 開始開發(fā)
依賴:
<!--支付寶-->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.34.0.ALL</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
在resources/templates目錄下創(chuàng)建一個pay.html文件,用于展示支付寶支付頁面。
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>支付寶支付</title>
</head>
<body onload="document.forms[0].submit();">
<div th:utext="${form}"></div>
</body>
</html>
創(chuàng)建同步通知頁面
在resources/templates目錄下創(chuàng)建一個return.html文件,用于展示同步通知結果。
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>支付結果</title>
</head>
<body>
<h1 th:text="${message}"></h1>
</body>
</html>
# 支付寶支付參數(shù)配置
alipay:
# 應用ID,您的APPID,收款賬號既是您的APPID對應支付寶賬號
appId: 111111111111111111
# 應用私鑰,您的PKCS8格式RSA2私鑰
privateKey: 11111111111111111
# 支付寶公鑰
publicKey: 111111111111111111111111
# 支付寶網關
gatewayUrl: https://openapi.alipaydev.com/gateway.do
# 服務器異步通知頁面路徑 需http://格式的完整路徑,不能加?id=123這類自定義參數(shù),必須外網可以正常訪問
notifyUrl: http://花生殼地址:花生殼端口/api/alipay/notify
# 頁面跳轉同步通知頁面路徑 需http://格式的完整路徑,不能加?id=123這類自定義參數(shù),必須外網可以正常訪問
returnUrl: http://花生殼地址:花生殼端口/returnView.html
/**
* @version 1.0.0
* @date 2023/6/8
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class PayRequest {
/**
* 訂單編號
*/
private String out_trade_no;
/**
* 商品名稱
*/
private String subject;
/**
* 支付金額
*/
private BigDecimal total_amount;
/**
* 商品描述
*/
private String body;
/**
* 電腦網站支付場景固定傳值FAST_INSTANT_TRADE_PAY
*/
private String product_code="FAST_INSTANT_TRADE_PAY";
/**
* PC掃碼支付的方式
*/
private String qr_pay_mode;
/**
* 支付渠道
*/
private String enable_pay_channels/*="balance,pcredit,moneyFund,bankPay,creditCard,pcreditpayInstallment"*/;
/**
* 商戶自定義二維碼寬度。
* 注:qr_pay_mode=4時該參數(shù)有效
*/
private String qrcode_width;
}
/**
* 支付配置類
*/
@Configuration
@ConfigurationProperties(prefix = "alipay")
@Data
public class PayAliConfig {
/**
* 應用ID,您的APPID,收款賬號既是您的APPID對應支付寶賬號
*/
public String appId;
/**
* 應用私鑰,您的PKCS8格式RSA2私鑰
*/
public String privateKey;
/**
* 支付寶公鑰
*/
public String publicKey;
/**
* 服務器異步通知頁面路徑 需http://格式的完整路徑,不能加?id=123這類自定義參數(shù),必須外網可以正常訪問
*/
public String notifyUrl;
/**
* 頁面跳轉同步通知頁面路徑 需http://格式的完整路徑,不能加?id=123這類自定義參數(shù),必須外網可以正常訪問
*/
public String returnUrl;
/**
* 支付寶網關
*/
public String gatewayUrl;
}
/**
* 初始化AlipayClient
* @version 1.0.0
* @date 2023/6/7
*/
@Component
public class AliPayClient {
@Autowired
private PayAliConfig payAliConfig;
@Bean
public AlipayClient AlipayClient() throws AlipayApiException {
AlipayConfig alipayConfig = new AlipayConfig();
//設置網關地址
alipayConfig.setServerUrl(payAliConfig.gatewayUrl);
//設置應用ID
alipayConfig.setAppId(payAliConfig.appId);
//設置應用私鑰
alipayConfig.setPrivateKey(payAliConfig.privateKey);
//設置請求格式,固定值json
alipayConfig.setFormat(AlipayConstants.FORMAT_JSON);
//設置字符集
alipayConfig.setCharset(AlipayConstants.CHARSET_UTF8);
//設置支付寶公鑰
alipayConfig.setAlipayPublicKey(payAliConfig.publicKey);
//設置簽名類型
alipayConfig.setSignType(AlipayConstants.SIGN_TYPE_RSA2);
//構造client
AlipayClient alipayClient = new DefaultAlipayClient(alipayConfig);
return alipayClient;
}
}
/**
* @version 1.0.0
* @date 2023/6/6
*/
@RestController
@RequestMapping("/api/alipay")
@Api(tags = "網站支付寶支付")
@Slf4j
public class AlipayController {
@Autowired
private AliPayService alipayService;
/**
* 創(chuàng)建支付訂單,返回支付頁面
*/
@GetMapping("/pay")
@Timing(remark = "創(chuàng)建支付訂單")
public ModelAndView pay(){
String outTradeNo= IdUtil.simpleUUID();
String subject="測試商品";
BigDecimal totalAmount = BigDecimal.valueOf(250);
PayRequest payRequest = new PayRequest();
payRequest.setOut_trade_no(outTradeNo);
payRequest.setSubject(subject);
payRequest.setTotal_amount(totalAmount);
payRequest.setBody("這是一個測試商品描述哦");
payRequest.setQr_pay_mode("2");
AlipayTradePagePayResponse response = alipayService.pay(payRequest);
if (response == null) {
return null;
}
log.info("響應:{}",response.getBody());
// 返回支付頁面
ModelAndView modelAndView = new ModelAndView("pay");
modelAndView.addObject("form", response.getBody());
return modelAndView;
}
/**
* 處理支付寶異步通知
*/
@PostMapping("/notify")
@Timing(remark = "處理支付寶異步通知")
public void notify(HttpServletRequest request, HttpServletResponse response) throws Exception {
boolean signVerified = alipayService.rsaCheckV1(request);
// 將請求參數(shù)轉換為Map
if (signVerified) {
// 處理支付成功邏輯,更新訂單狀態(tài)等操作
response.getWriter().write("success"); // 告訴支付寶已經收到通知并處理成功
} else {
response.getWriter().write("failure"); // 告訴支付寶驗簽失敗
}
}
}
/**
* @version 1.0.0
* @date 2023/6/7
*/
public interface AliPayService {
AlipayTradePagePayResponse pay(PayRequest payRequest);
boolean rsaCheckV1(HttpServletRequest request);
}
/**
* @version 1.0.0
* @date 2023/6/7
*/
@Service
@Slf4j
public class AliPayServiceImpl implements AliPayService {
@Autowired
private AlipayClient alipayClient;
@Autowired
private PayAliConfig payAliConfig;
@Override
public AlipayTradePagePayResponse pay(PayRequest payRequest) {
// 構造請求參數(shù)
AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
request.setReturnUrl(payAliConfig.getReturnUrl());
request.setNotifyUrl(payAliConfig.getNotifyUrl());
log.info("生成的字符串:{}", JSONUtil.toJsonStr(payRequest));
request.setBizContent(JSONUtil.toJsonStr(payRequest));
// request.setBizContent("{\"out_trade_no\":\"" + UUID.randomUUID().toString().replaceAll("-", "") + "\","
// + "\"total_amount\":\"0.01\","
// + "\"subject\":\"測試商品\","
// + "\"body\":\"測試商品詳情\","
// + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
// 調用SDK生成表單
try {
return alipayClient.pageExecute(request);
} catch (AlipayApiException e) {
log.error("支付寶請求失敗");
}
return null;
}
@Override
public boolean rsaCheckV1(HttpServletRequest request) {
boolean flag = false;
Map<String, String> params = new HashMap<>();
Enumeration<String> parameterNames = request.getParameterNames();
while (parameterNames.hasMoreElements()) {
String paramName = parameterNames.nextElement();
String paramValue = request.getParameter(paramName);
params.put(paramName, paramValue);
}
// 調用SDK驗證簽名
try {
flag =AlipaySignature.rsaCheckV1(params, payAliConfig.publicKey, AlipayConstants.CHARSET_UTF8, AlipayConstants.SIGN_TYPE_RSA2);
} catch (AlipayApiException e) {
log.error("驗簽失敗");
}
return flag;
}
}
3. 內網穿透
花生殼:https://hsk.oray.com/
下載安裝配置一下就好了
4. 測試支付功能
啟動Spring Boot應用,訪問http://localhost:8889/api/alipay/pay,即可看到支付寶支付頁面。輸入支付密碼后,會自動跳轉到同步通知頁面,并顯示支付結果。
賬號密碼在沙箱賬號
中看到文章來源:http://www.zghlxwxcb.cn/news/detail-479612.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-479612.html
到了這里,關于springboot實現(xiàn)支付寶支付(沙箱環(huán)境)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!