引出
1.springboot整合支付寶沙箱支付;
2.準(zhǔn)備工作:沙箱api,內(nèi)網(wǎng)穿透;
3.極簡實(shí)現(xiàn)理解支付,異步回調(diào)等;
4.按照spring依賴注入的思想改造基礎(chǔ)demo;
git代碼倉庫
https://gitee.com/pet365/springboot-alipay
準(zhǔn)備工作
支付寶沙箱api
支付寶開放平臺 (alipay.com)
支付參數(shù)
內(nèi)網(wǎng)穿透 natapp.cn
natapp.cn官網(wǎng)
啟動(dòng)和配置
springboot整合—極簡實(shí)現(xiàn)版
1.導(dǎo)包+配置文件
<!-- 支付寶相關(guān)-->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.34.0.ALL</version>
</dependency>
server:
port: 9090
# 日志需要配置一下 @Slf4j
logging:
level:
com.tianju.alipay: debug
2.controller層代碼
訂單ID,需要唯一;價(jià)格;物品名稱(支付主題)
http://localhost:9090/api/ali/pay?orderId=202307302321&price=12.56&subject=iPhone
用戶名:flrnht7304@sandbox.com
密碼:111111
AliPayController.java文件
package com.tianju.alipay.controller;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradePagePayModel;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.AlipayTradePagePayRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* 支付寶的支付接口
* 用戶名:flrnht7304@sandbox.com
* 密碼:111111
*/
// http://localhost:9090/api/ali/pay?orderId=202307302321&price=12.56&subject=iPhone
@RestController
@RequestMapping("/api/ali")
@Slf4j // tips:如果用debug記得在application.yml文件中配置一下日志級別
public class AliPayController {
String alipayPublicKey = "";
@GetMapping("/pay")
public void payOrder(String orderId, String price, String subject, HttpServletResponse httpResponse) throws AlipayApiException, IOException {
// 1.準(zhǔn)備需要的參數(shù),私匙,支付公匙,appid,沙箱支付平臺的url
String privateKey = "";
String alipayPublicKey = "";
String appId = "9021000123613164";
String serverUrl = "https://openapi-sandbox.dl.alipaydev.com/gateway.do";
// 2.把需要配置的參數(shù)set進(jìn)AlipayConfig類中
com.alipay.api.AlipayConfig alipayConfig = new com.alipay.api.AlipayConfig();
alipayConfig.setServerUrl(serverUrl);
alipayConfig.setAppId(appId);
alipayConfig.setPrivateKey(privateKey);
alipayConfig.setFormat("json");
alipayConfig.setAlipayPublicKey(alipayPublicKey);
alipayConfig.setCharset("UTF8");
alipayConfig.setSignType("RSA2");
// 3.創(chuàng)建支付寶的默認(rèn)的客戶端
AlipayClient alipayClient = new DefaultAlipayClient(alipayConfig);
// 4.準(zhǔn)備支付的參數(shù),包括需要支付的訂單的id,價(jià)格,物品名稱,
AlipayTradePagePayModel model = new AlipayTradePagePayModel();
// model.setOutTradeNo("2023073022083620");
model.setOutTradeNo(orderId); // 需要支付的訂單id,自定義的訂單id,不能重復(fù),唯一,已經(jīng)支付的無法繼續(xù)支付
model.setTotalAmount(price); // 需要支付的錢 model.setTotalAmount("88.88");
model.setSubject(subject); // 要支付的物品,比如 model.setSubject("Iphone6 16G");
model.setProductCode("FAST_INSTANT_TRADE_PAY");
// 5.創(chuàng)建支付的請求,把上面的準(zhǔn)備支付的參數(shù)進(jìn)行set
AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
request.setBizModel(model);
/**
* 設(shè)置支付寶異步回調(diào),這個(gè)需要用內(nèi)網(wǎng)穿透
*/
request.setNotifyUrl("http://uw7ayu.natappfree.cc/api/ali/notify");
/**
* 設(shè)置支付寶支付成功返回的頁面
* 這里讓支付成功直接回到static下的一個(gè)靜態(tài)頁面中
*/
request.setReturnUrl("http://localhost:9090/aliPayReturn.html");
// 6.調(diào)用ali客戶端alipayClient,用客戶端執(zhí)行請求,獲取響應(yīng),獲取.getBody(),拿到form表單
// 執(zhí)行請求,拿到響應(yīng)的結(jié)果,返回給瀏覽器
String form = "";
try {
form = alipayClient.pageExecute(request).getBody(); // 調(diào)用SDK生成表單
log.debug(">>>>>>getAliPayFrom");
System.out.println("getAliPayFrom");
System.out.println(form);
} catch (AlipayApiException e) {
e.printStackTrace();
}
// 表單數(shù)據(jù)作為響應(yīng)返回給前端,顯示前端頁面
/**
* <form name="punchout_form" method="post" action="https://openapi-sandbox.dl.alipaydev.com/gateway.do?charset=UTF8&method=alipay.trade.page.pay&sign=ZSYIysQXMlJK6q%2B%2BQVJVhKi3qtHBaXTMmh4%2Fi7Wcj1OuSr5Qs6X%2Fhq0jgDbR%2BFw6da3fO5Hov8iV8%2BPo07CVnIQDSL1X2WDZzSN3Srqid%2BLKP%2BnoME2Jv9AfhaPwYkbElg0x40pLspkCv7%2FeRs93ROkrvLUL0aTA%2B7wXrIe5FKkvptqfqjReMayVR1lKmiGw8SWToNJ0OQoDp4g6191vJIy9ld%2BQfRU6PLq9dUH3XIifNvCwOceMCqpOXNlJIAb8MC2FkXK%2FCwEij5mj%2BpqNEevMf0DRczuUklJe20FeXrx6bSsjEIly8Swt1j4UYZZJY817TRQp%2FG3XEOjnLfAH5g%3D%3D&version=1.0&app_id=9021000123613164&sign_type=RSA2×tamp=2023-07-30+23%3A11%3A17&alipay_sdk=alipay-sdk-java-dynamicVersionNo&format=json">
* <input type="hidden" name="biz_content" value="{"out_trade_no":"202307302206","product_code":"FAST_INSTANT_TRADE_PAY","subject":"iPhone","total_amount":"12.56"}">
* <input type="submit" value="立即支付" style="display:none" >
* </form>
* <script>document.forms[0].submit();</script>
*/
httpResponse.setContentType("text/html;charset=UTF-8"); // 設(shè)置頭部
httpResponse.getWriter().write(form);// 直接將完整的表單html輸出到頁面
httpResponse.getWriter().flush();
httpResponse.getWriter().close();
}
/**
* 支付寶異步回調(diào)
* request.setNotifyUrl("");
* http://localhost:9090/api/ali/notify
* 上面這個(gè)網(wǎng)址用內(nèi)網(wǎng)穿透代理一下
* http://jqdxgm.natappfree.cc/api/ali/notify
* 此時(shí)支付寶就能回調(diào)到這個(gè)頁面
*/
@PostMapping("/notify")
public void aliPayNotify(HttpServletRequest request) throws AlipayApiException {
log.debug(">>>>>>>支付寶異步回調(diào)");
Map<String, String[]> parameterMap = request.getParameterMap();
// [gmt_create, charset, gmt_payment, notify_time, subject, sign, buyer_id, invoice_amount, version, notify_id,
// fund_bill_list, notify_type, out_trade_no, total_amount, trade_status, trade_no, auth_app_id, receipt_amount,
// point_amount, buyer_pay_amount, app_id, sign_type, seller_id]
Set<String> keySet = parameterMap.keySet(); // 獲取http請求里面的所有鍵
/**
* paramsMap如下:
* {gmt_create=2023-07-31 15:54:11, charset=UTF8,
* gmt_payment=2023-07-31 15:54:26,
* notify_time=2023-07-31 15:54:27,
* sign=fsCABNzc5hax4mwwMULluDiEAT70Kqj77uTMcCgSi82AU6tP5LGbXucEvP7CbvjXrYo5g3hrz5xRQAwddE7qU9Qyrg0v3EnearJBcW4It6N+VNBQ7yfY/W79eKRSKspLBKHRa21RILjyRrmQYG4Cw8R7twP7y0lDCOE8j3rV6ZyGfhiQ7EXp49d6HpgcIT1NjgJjQYSyJFdgyqkzFljKRfbhwPFAtubsmd8IcJCU7XI3YosSKnDhQaCA6ec4dmQiWtvcTbOLNR/r2Sou7rCnI7s1lc8pKeEsuacWTZW2FVR7hdHoLZ/expaRQIt+dNzA86lwQxu3SRCQ9wNTPICv1A==,
* buyer_id=2088722005286475, invoice_amount=12.56, version=1.0, notify_id=2023073101222155427086470500776505,
* fund_bill_list=[{"amount":"12.56","fundChannel":"ALIPAYACCOUNT"}],
* notify_type=trade_status_sync,
* subject=iPhone, // 物品名稱
* out_trade_no=202307311553, // 進(jìn)行支付的訂單id,唯一,商家自定義,即支付時(shí)傳入的 String orderId
* total_amount=12.56, // 總價(jià)格
* trade_status=TRADE_SUCCESS, // 支付狀態(tài)
* trade_no=2023073122001486470500697216, auth_app_id=9021000123613164,
* receipt_amount=12.56, point_amount=0.00,
* buyer_pay_amount=12.56, app_id=9021000123613164, sign_type=RSA2, seller_id=2088721005318559}
*/
Map<String,String> paramsMap = new HashMap<>(); // 專門用來放置請求里面的參數(shù)
for(String key : keySet){
paramsMap.put(key, request.getParameter(key));
}
System.out.println("*************");
System.out.println(paramsMap);
// 驗(yàn)證簽名
String sign = paramsMap.get("sign");
String contentV1 = AlipaySignature.getSignCheckContentV1(paramsMap);
boolean rsa256CheckSignature = AlipaySignature.rsa256CheckContent(contentV1, sign, alipayPublicKey, "UTF-8");
if (rsa256CheckSignature && "TRADE_SUCCESS".equals(paramsMap.get("trade_status"))){
// 簽名驗(yàn)證成功 并且 支付寶回調(diào)的狀態(tài)是成功狀態(tài) TRADE_SUCCESS
log.info("在{},買家{}進(jìn)行訂單{}的付款,交易名稱{},付款金額{}",
paramsMap.get("gmt_payment"),paramsMap.get("buyer_id"),paramsMap.get("out_trade_no"),paramsMap.get("subject"),paramsMap.get("total_amount"));
// 支付成功,修改數(shù)據(jù)庫中該訂單的狀態(tài)
// 比如:流程,根據(jù)訂單ID查詢出一條數(shù)據(jù),修改該條訂單的數(shù)據(jù),或者只有支付成功,才給數(shù)據(jù)庫里面新增一條數(shù)據(jù)
}
}
}
3.進(jìn)行支付流程
支付密碼輸入
支付成功
4.支付成功回調(diào)
設(shè)置異步回調(diào)
啟動(dòng)內(nèi)網(wǎng)穿透
設(shè)置地址
異步回調(diào)流程解析
支付寶支付成功跳轉(zhuǎn)
跳轉(zhuǎn)成功
依賴注入的改進(jìn)
1.整體結(jié)構(gòu)
2.pom.xml文件依賴
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.tianju.alipay</groupId>
<artifactId>springboot-alipay</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.4</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--json工具-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.12</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<!-- 支付寶相關(guān)-->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.34.0.ALL</version>
</dependency>
</dependencies>
</project>
3.配置文件
applicaiton.yml
server:
port: 9090
# 日志需要配置一下 @Slf4j
logging:
level:
com.tianju.alipay: debug
alipay.properties文章來源:http://www.zghlxwxcb.cn/news/detail-676254.html
ali.privateKey =
ali.alipayPublicKey =
ali.appId = 9021000123613164
ali.serverUrl = https://openapi-sandbox.dl.alipaydev.com/gateway.do
ali.returnUrl = http://localhost:9090/aliPayReturn.html
ali.notifyUrl = http://uw7ayu.natappfree.cc/api/ali/notify
4.配置類,依賴注入
package com.tianju.alipay.config;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import lombok.Getter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
@Configuration
@PropertySource("classpath:config/alipay.properties")
@Getter
public class AlipayConfig {
@Value("${ali.serverUrl}")
private String serverUrl;
@Value("${ali.appId}")
private String appId;
@Value("${ali.alipayPublicKey}")
private String alipayPublicKey;
@Value("${ali.privateKey}")
private String privateKey;
@Bean
public AlipayClient alipayClient() throws AlipayApiException {
// 2.把需要配置的參數(shù)set進(jìn)AlipayConfig類中
com.alipay.api.AlipayConfig alipayConfig = new com.alipay.api.AlipayConfig();
alipayConfig.setServerUrl(serverUrl);
alipayConfig.setAppId(appId);
alipayConfig.setPrivateKey(privateKey);
alipayConfig.setFormat("json");
alipayConfig.setAlipayPublicKey(alipayPublicKey);
alipayConfig.setCharset("UTF8");
alipayConfig.setSignType("RSA2");
return new DefaultAlipayClient(alipayConfig);
}
}
5.支付商品id,價(jià)格,名稱
package com.tianju.alipay.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Alipay {
private String orderId; // 商家自定義的訂單編號,唯一
private String price; // 商品價(jià)格
private String subject; // 支付主題
}
6.controller層進(jìn)行支付和回調(diào)
package com.tianju.alipay.controller;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.domain.AlipayTradePagePayModel;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.tianju.alipay.entity.Alipay;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* 支付寶的支付接口
* 用戶名:flrnht7304@sandbox.com
* 密碼:111111
*/
// http://localhost:9090/api/ali/pay?orderId=202307302321&price=12.56&subject=iPhone
@RestController
@RequestMapping("/api/ali")
@Slf4j
public class AliPayController {
@Autowired
private AlipayClient alipayClient;
@Value("${ali.alipayPublicKey}")
private String alipayPublicKey;
@Value("${ali.returnUrl}")
private String returnUrl; // 支付成功返回的頁面
@Value("${ali.notifyUrl}")
private String notifyUrl; // 支付寶支付成功異步回調(diào)的頁面,需要內(nèi)網(wǎng)穿透
@GetMapping("/pay")
public void payOrder(Alipay alipay, HttpServletResponse httpResponse) throws IOException {
// 4.準(zhǔn)備支付的參數(shù),包括需要支付的訂單的id,價(jià)格,物品名稱,
AlipayTradePagePayModel model = new AlipayTradePagePayModel();
model.setOutTradeNo(alipay.getOrderId()); // 需要支付的訂單id,自定義的訂單id,不能重復(fù),唯一,已經(jīng)支付的無法繼續(xù)支付
model.setTotalAmount(alipay.getPrice()); // 需要支付的錢 model.setTotalAmount("88.88");
model.setSubject(alipay.getSubject()); // 要支付的物品,比如 model.setSubject("Iphone6 16G");
model.setProductCode("FAST_INSTANT_TRADE_PAY");
// 5.創(chuàng)建支付的請求,把上面的準(zhǔn)備支付的參數(shù)進(jìn)行set
AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
request.setBizModel(model);
/**
* 設(shè)置支付寶異步回調(diào),這個(gè)需要用內(nèi)網(wǎng)穿透
*/
request.setNotifyUrl(notifyUrl);
/**
* 設(shè)置支付寶支付成功返回的頁面
* 這里讓支付成功直接回到static下的一個(gè)靜態(tài)頁面中
*/
request.setReturnUrl(returnUrl);
// 6.調(diào)用ali客戶端alipayClient,用客戶端執(zhí)行請求,獲取響應(yīng),獲取.getBody(),拿到form表單
// 執(zhí)行請求,拿到響應(yīng)的結(jié)果,返回給瀏覽器
String form = "";
try {
form = alipayClient.pageExecute(request).getBody(); // 調(diào)用SDK生成表單
log.debug(">>>>>>getAliPayFrom");
System.out.println("getAliPayFrom");
System.out.println(form);
} catch (AlipayApiException e) {
e.printStackTrace();
}
// 表單數(shù)據(jù)作為響應(yīng)返回給前端,顯示前端頁面
httpResponse.setContentType("text/html;charset=UTF-8"); // 設(shè)置頭部
httpResponse.getWriter().write(form);// 直接將完整的表單html輸出到頁面
httpResponse.getWriter().flush();
httpResponse.getWriter().close();
}
/**
* 支付寶異步回調(diào)
* request.setNotifyUrl("");
* http://localhost:9090/api/ali/notify
* 上面這個(gè)網(wǎng)址用內(nèi)網(wǎng)穿透代理一下
* http://jqdxgm.natappfree.cc/api/ali/notify
* 此時(shí)支付寶就能回調(diào)到這個(gè)頁面
*/
@PostMapping("/notify")
public void aliPayNotify(HttpServletRequest request) throws AlipayApiException {
log.debug(">>>>>>>支付寶異步回調(diào)");
Map<String, String[]> parameterMap = request.getParameterMap();
Set<String> keySet = parameterMap.keySet(); // 獲取http請求里面的所有鍵
/**
* paramsMap如下:
* {gmt_create=2023-07-31 15:54:11, charset=UTF8,
* gmt_payment=2023-07-31 15:54:26,
* notify_time=2023-07-31 15:54:27,
* sign=fsCABNzc5hax4mwwMULluDiEAT70Kqj77uTMcCgSi82AU6tP5LGbXucEvP7CbvjXrYo5g3hrz5xRQAwddE7qU9Qyrg0v3EnearJBcW4It6N+VNBQ7yfY/W79eKRSKspLBKHRa21RILjyRrmQYG4Cw8R7twP7y0lDCOE8j3rV6ZyGfhiQ7EXp49d6HpgcIT1NjgJjQYSyJFdgyqkzFljKRfbhwPFAtubsmd8IcJCU7XI3YosSKnDhQaCA6ec4dmQiWtvcTbOLNR/r2Sou7rCnI7s1lc8pKeEsuacWTZW2FVR7hdHoLZ/expaRQIt+dNzA86lwQxu3SRCQ9wNTPICv1A==,
* buyer_id=2088722005286475, invoice_amount=12.56, version=1.0, notify_id=2023073101222155427086470500776505,
* fund_bill_list=[{"amount":"12.56","fundChannel":"ALIPAYACCOUNT"}],
* notify_type=trade_status_sync,
* subject=iPhone, // 物品名稱
* out_trade_no=202307311553, // 進(jìn)行支付的訂單id,唯一,商家自定義,即支付時(shí)傳入的 String orderId
* total_amount=12.56, // 總價(jià)格
* trade_status=TRADE_SUCCESS, // 支付狀態(tài)
* trade_no=2023073122001486470500697216, auth_app_id=9021000123613164,
* receipt_amount=12.56, point_amount=0.00,
* buyer_pay_amount=12.56, app_id=9021000123613164, sign_type=RSA2, seller_id=2088721005318559}
*/
Map<String,String> paramsMap = new HashMap<>(); // 專門用來放置請求里面的參數(shù)
for(String key : keySet){
paramsMap.put(key, request.getParameter(key));
}
System.out.println("*************");
System.out.println(paramsMap);
// 驗(yàn)證簽名
String sign = paramsMap.get("sign");
String contentV1 = AlipaySignature.getSignCheckContentV1(paramsMap);
boolean rsa256CheckSignature = AlipaySignature.rsa256CheckContent(contentV1, sign, alipayPublicKey, "UTF-8");
if (rsa256CheckSignature && "TRADE_SUCCESS".equals(paramsMap.get("trade_status"))){
// 簽名驗(yàn)證成功 并且 支付寶回調(diào)的狀態(tài)是成功狀態(tài) TRADE_SUCCESS
log.info("在{},買家{}進(jìn)行訂單{}的付款,交易名稱{},付款金額{}",
paramsMap.get("gmt_payment"),paramsMap.get("buyer_id"),paramsMap.get("out_trade_no"),paramsMap.get("subject"),paramsMap.get("total_amount"));
// 支付成功,修改數(shù)據(jù)庫中該訂單的狀態(tài)
// 比如:流程,根據(jù)訂單ID查詢出一條數(shù)據(jù),修改該條訂單的數(shù)據(jù),或者只有支付成功,才給數(shù)據(jù)庫里面新增一條數(shù)據(jù)
}
}
}
7.主啟動(dòng)類
package com.tianju.alipay;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class AliPayApp {
public static void main(String[] args) {
SpringApplication.run(AliPayApp.class, args);
}
}
總結(jié)
1.springboot整合支付寶沙箱支付;
2.準(zhǔn)備工作:沙箱api,內(nèi)網(wǎng)穿透;
3.極簡實(shí)現(xiàn)理解支付,異步回調(diào)等;
4.按照spring依賴注入的思想改造基礎(chǔ)demo;文章來源地址http://www.zghlxwxcb.cn/news/detail-676254.html
到了這里,關(guān)于SpringBoot項(xiàng)目(支付寶整合)——springboot整合支付寶沙箱支付 & 從極簡實(shí)現(xiàn)到IOC改進(jìn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!