SpringBoot基于沙箱環(huán)境實現(xiàn)支付寶支付教程
一、支付寶沙箱環(huán)境介紹
沙箱環(huán)境是支付寶開放平臺為開發(fā)者提供的安全低門檻的測試環(huán)境,開發(fā)者在沙箱環(huán)境中調用接口無需具備所需的商業(yè)資質,無需綁定和開通產品,同時不會對生產環(huán)境中的數(shù)據造成任何影響。
合理使用沙箱環(huán)境,可以讓研發(fā)流程與商業(yè)流程并行,降低聯(lián)調資損風險,加速項目的交付。
更為詳細的說明可以看官方文檔:https://opendocs.alipay.com/common/02kkv7
二、沙箱環(huán)境準備
2.1 注冊入駐支付寶開放平臺
登錄支付寶開放平臺,支付寶登錄平臺,找到開發(fā)接入入駐為開發(fā)者。

2.2 配置沙箱環(huán)境
進入到開發(fā)者的控制臺,找到最下方的開發(fā)者工具推薦 ,點擊沙箱。

2.3 沙箱應用
獲取支付參數(shù)信息
打開沙箱應用后,需要拿到3個參數(shù),appId,應用私鑰,支付寶公鑰,用于對接支付接口使用。


支付寶網關里的https://不要復制,會幫我們自動拼接

三、SpringBoot 結合 支付寶沙箱

3.1 pom.xml
<!--引入支付寶sdk --> <!-- https://mvnrepository.com/artifact/com.alipay.sdk/alipay-easysdk --> <dependency> <groupId>com.alipay.sdk</groupId> <artifactId>alipay-easysdk</artifactId> <version>2.2.2</version> </dependency>
3.2 application.yml
spring:
application:
name:
SpringBoot_Pay
alipay:
appId: 9021000137619573
appPrivateKey: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC43Mr6YjCPwWDhb+d+2fxatYjDeJjrNKj78KY6oD2hatVAWsQvG/dW9Sr3bouit2rvOc6AQIem7CJQ3gQEvw15dn8Q4Uh+LWxBB5aujCjgr2Fvp0ELqHlnKNUgxACPgzfqLCpIYGcGI6zqrrGtA2PCD3TyjNbgyo18c4OZLLWhpokr2Ml7fI/F0h0irMM+zymupY2L/Q5Zjcf2Y7Z7cVFefOF+wI06CRCfpFQE9mjffH/MNHMdgxmY/mqvFE1slCPulmRi2wMDKV34dQZFQ0B0cMBMbIlwNFAa/QtEJ5xN3ksvNZ2VS7Fj9r5/Z7pEUtHEQT8OYbDnZye2OjHSKt1ZAgMBAAECggEACc1TSfF457Z2P53iZXyDf//OL6cuXJJfP3SkK8mhWvTCN/ZYHrNZ6xd23sXSy570IZksFOrXBofQzf7nsaS7vywEUs3PPTmFWvFfEQRHippiDTyOG2MkhM7KdkFOUk2/4j/TQiEydUXg/lSjASyD1p9hMRc8sZCr7eRmHvIa82Y9D078bprdZEDjcFRiLN8jxikpmCnezPcSmI2VWpKQIemo62HIuYD3iQUr+S0MYmlkH229HU4c9rBJ+MCjuDj9eWkyT7DhtmhFcUlQvae/lGQukRu4ZEIdY1eBvICJ2SExmH0oCu11CuPIeu2KSI5zaInnDr7bAsQRg90U+JFs7QKBgQDqbMv1/s8X6Cu/GfGMLJrVkANR6C+N0EhEzJ/53HowZopyVI1qaLmFpK7veMukPxVYbmO/h+iSbahQ1+S2Gw3CsEQDimGrC1+s1dhkrgFZhWTpVg3I1rIbXFkHDNvAa6+HgtB/ZIjP0qUrmGO+HipUSEmvCXNRV0L3TlWpco2G4wKBgQDJ4EV/KoPFk/XOJHGn/Kt6QhK+YOCC59835qOM3zX9f6klWGl+9NeIefxRcQ4kqDp4kCQzw+y5Ds7Lv5EYGiWsuYVN2ObcG+MLj0qisrMwE61mJ1bCXok7C+1ild3+FyXMBXqp7zuNog3rGwZAzS99x5ouELl/Mems1n/pt1NDkwKBgQC0E4UN34Hn5HIOZ3h0bCM4YFschRZagp+xMdrFzgaSvYImVysWjYHN1naHACy2a7sS5iF7lIQkT1YXW/CVruyAHHTyn09tW9xP4SlMFZp10RF2aKNIHxxMBkFhOBBqnI4Gs4dEBM9PjYlRlssv1O5BNhJcAg9ycWzAmo0VECkFbwKBgBD+hTswTAl87CtfXAYFOjY/i65lH2FFvb/J9aitPbFKZuXS7IaYe/BsPHZqqwMg+lMd5z5IVww5F+WFCeTahqNktrkX8k9DNbjKZkEOBBGfBnDcDOyt4qWK2n/7F8YFEtR6/ZmCnyPMKZnKG5um6kGPZQZNuB/iBsbbA8eb/DFrAoGAdM5Wn1q8G6uB7QsxHFfjir6kbvfrf3WMPDvIIDTKS49t0WucVvLPNtIPGCSb99MEWOEZvWvMhn0RmCZNHWX7Fy4HB4FcJW57aWvIDKwxEcI9gdy5Vmg0uRIsd3WPzcZxbTCERUvIXRgh/tacaTq9/wPTEq1vp0AGYXoJHQslxLs=
publicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArEEt6BXEXKinvjjQooptYjjyJIy+4DHhxBK2BOMUWs2Ol9xQStPrkCz3gVwZg0yM1nIvv/G970u8siXL7GN42CbPEw3hVimCjiclDn1qMaurTakOUtUT0RygF118wThny40rZYsMbnDs7uCV4yynI8/5dEhHvUfe4pZm3by8Wy+aNjlX9Fwn1FbRa8aWnZmglcEp92xGkIyhC7Yc/DJA7J4xc44mgWVcHy8lNJv7Cznoehsq9dAew5mpjYvRCr1PIwGHw8D9Tkz/T1gOREiiejaBwF3zZpEUhq85t1GBoyPKwGtsb2Ve8ribP3EfKbqORgOc9ay7CnMkz8KRTRuK4wIDAQAB
# 回調函數(shù)的地址 http://localhost:8080/api/alipay/notify
# 要使用公網地址,用路由俠進行內網穿透
notifyUrl: https://o4662e9430.vicp.fun/api/alipay/notify
gatewayHost: openapi-sandbox.dl.alipaydev.com3.3 對應的配置類
package com.by.config;
import com.alipay.easysdk.factory.Factory;
import com.alipay.easysdk.kernel.Config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
@Component
@ConfigurationProperties(prefix = "alipay")
@Data
public class AlipayConfig {
// 應用Id
private String appId;
// 應用私鑰
private String appPrivateKey;
// 支付寶公鑰
private String publicKey;
// 回調接口路徑,要進行內網穿透
private String notifyUrl;
// 支付寶網關地址:配置文件中不要寫https://,會自動補全
private String gatewayHost;
@PostConstruct
public void init(){
Config config = new Config();
// 基礎配置
config.protocol = "https";
config.gatewayHost = this.gatewayHost;// 支付寶網關地址
config.signType = "RSA2";
// 業(yè)務配置
config.appId = this.appId;
config.merchantPrivateKey = this.appPrivateKey;
config.alipayPublicKey = this.publicKey;
config.notifyUrl = this.notifyUrl;
// 將配置信息, 添加到相應的工廠類
Factory.setOptions(config);
System.out.println("支付寶初始化配置完成");
}
}3.4 支付接口,和支付的回調接口
package com.by.controller;
import com.alipay.easysdk.factory.Factory;
import com.alipay.easysdk.payment.page.models.AlipayTradePagePayResponse;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
@RestController
@RequestMapping("/api/alipay")
public class PayController {
/**
* 訂單支付接口, 核心是調用支付寶的 Factory.Payment.Page().pay() 方法
* @param subject 支付對象信息
* @param outTradeNo 訂單號
* @param totalAmount 訂單金額
* @param returnUrl 支付成功以后返回的頁面地址
* @return
*/
@GetMapping
public String pay(String subject, String outTradeNo, String totalAmount,String returnUrl) throws Exception {
AlipayTradePagePayResponse response = Factory.Payment.Page().pay(subject, outTradeNo, totalAmount, returnUrl);
String body = response.getBody();
return body;
}
/**
* 支付回調接口,如果支付成功,支付寶將會請求此接口,將成功信息返回
*/
@PostMapping("/notify")
public String notify(@RequestParam Map parameterMap) throws Exception {
String tradeStatus = parameterMap.getOrDefault("trade_status","").toString();
if (tradeStatus.trim().equals("TRADE_SUCCESS")) {
// 驗證請求的有效性
if (Factory.Payment.Common().verifyNotify(parameterMap)) {
System.out.println("通過支付寶的驗證");
System.out.println("訂單id:" + parameterMap.get("out_trade_no"));
}else {
System.out.println("支付驗證不通過");
}
}
return "success";
}
}3.5 支付頁面 apy.html
傳遞的參數(shù)用于支付接口接收 ,其中里的
subject商品名稱或交易標題outTradeNo商戶訂單號totalAmount訂單總金額,單位為元returnUrl訂單返回URL,本來應該為http://localhost:8080/payok.html?orderId=1001,要傳遞一個下單id,因為有問號,所以要進行url編碼

<body>
<a href="/api/alipay?subject=商品支付&outTradeNo=3123&totalAmount=16.8&returnUrl=http%3A%2F%2Flocalhost%3A8080%2Fpayok.html%3ForderId%3D1001" rel="external nofollow" class="a">
<img src="https://zhengxin-pub.bj.bcebos.com/logopic/a9936a369e82e0c6c42112674a5220e8_fullsize.jpg?x-bce-process=image/resize,m_lfit,w_200" alt="支付寶支付">
<h2>支付寶支付</h2>
</a>
</body>3.6 支付成功的頁面 payok.html
<div class="alert alert-primary" role="alert">
支付成功
</div>四、測試
4.1 訪問http://localhost:8080/pay.html




總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
WebSocket獲取httpSession空指針異常的解決辦法
這篇文章主要介紹了在使用WebSocket實現(xiàn)p2p或一對多聊天功能時,如何獲取HttpSession來獲取用戶信息,本文結合實例代碼給大家介紹的非常詳細,感興趣的朋友一起看看吧2025-01-01
Reactor 多任務并發(fā)執(zhí)行且結果按順序返回第一個
這篇文章主要介紹了Reactor 多任務并發(fā)執(zhí)行且結果按順序返回第一個,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下2022-09-09
Java?Scanner?類讀取一維數(shù)組二維數(shù)組示例詳解
這篇文章主要為大家介紹了Java?Scanner?類讀取一維數(shù)組二維數(shù)組示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-11-11
一文詳細解析Java?8?Stream?API中的flatMap方法
這篇文章主要介紹了Java?8?Stream?API中的flatMap方法的相關資料,flatMap方法是Java?StreamAPI中的重要中間操作,用于將流中的每個元素轉換為一個新的流,并將多個流合并為一個單一的流,常用于處理嵌套集合和一對多映射,需要的朋友可以參考下2024-12-12

