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

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

2.3 沙箱應(yīng)用
獲取支付參數(shù)信息
打開(kāi)沙箱應(yīng)用后,需要拿到3個(gè)參數(shù),appId,應(yīng)用私鑰,支付寶公鑰,用于對(duì)接支付接口使用。


支付寶網(wǎng)關(guān)里的https://不要復(fù)制,會(huì)幫我們自動(dòng)拼接

三、SpringBoot 結(jié)合 支付寶沙箱

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
# 回調(diào)函數(shù)的地址 http://localhost:8080/api/alipay/notify
# 要使用公網(wǎng)地址,用路由俠進(jìn)行內(nèi)網(wǎng)穿透
notifyUrl: https://o4662e9430.vicp.fun/api/alipay/notify
gatewayHost: openapi-sandbox.dl.alipaydev.com3.3 對(duì)應(yīng)的配置類(lèi)
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 {
// 應(yīng)用Id
private String appId;
// 應(yīng)用私鑰
private String appPrivateKey;
// 支付寶公鑰
private String publicKey;
// 回調(diào)接口路徑,要進(jìn)行內(nèi)網(wǎng)穿透
private String notifyUrl;
// 支付寶網(wǎng)關(guān)地址:配置文件中不要寫(xiě)https://,會(huì)自動(dòng)補(bǔ)全
private String gatewayHost;
@PostConstruct
public void init(){
Config config = new Config();
// 基礎(chǔ)配置
config.protocol = "https";
config.gatewayHost = this.gatewayHost;// 支付寶網(wǎng)關(guān)地址
config.signType = "RSA2";
// 業(yè)務(wù)配置
config.appId = this.appId;
config.merchantPrivateKey = this.appPrivateKey;
config.alipayPublicKey = this.publicKey;
config.notifyUrl = this.notifyUrl;
// 將配置信息, 添加到相應(yīng)的工廠類(lèi)
Factory.setOptions(config);
System.out.println("支付寶初始化配置完成");
}
}3.4 支付接口,和支付的回調(diào)接口
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 {
/**
* 訂單支付接口, 核心是調(diào)用支付寶的 Factory.Payment.Page().pay() 方法
* @param subject 支付對(duì)象信息
* @param outTradeNo 訂單號(hào)
* @param totalAmount 訂單金額
* @param returnUrl 支付成功以后返回的頁(yè)面地址
* @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;
}
/**
* 支付回調(diào)接口,如果支付成功,支付寶將會(huì)請(qǐng)求此接口,將成功信息返回
*/
@PostMapping("/notify")
public String notify(@RequestParam Map parameterMap) throws Exception {
String tradeStatus = parameterMap.getOrDefault("trade_status","").toString();
if (tradeStatus.trim().equals("TRADE_SUCCESS")) {
// 驗(yàn)證請(qǐng)求的有效性
if (Factory.Payment.Common().verifyNotify(parameterMap)) {
System.out.println("通過(guò)支付寶的驗(yàn)證");
System.out.println("訂單id:" + parameterMap.get("out_trade_no"));
}else {
System.out.println("支付驗(yàn)證不通過(guò)");
}
}
return "success";
}
}3.5 支付頁(yè)面 apy.html
傳遞的參數(shù)用于支付接口接收 ,其中里的
subject商品名稱(chēng)或交易標(biāo)題outTradeNo商戶訂單號(hào)totalAmount訂單總金額,單位為元returnUrl訂單返回URL,本來(lái)應(yīng)該為http://localhost:8080/payok.html?orderId=1001,要傳遞一個(gè)下單id,因?yàn)橛袉?wèn)號(hào),所以要進(jìn)行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 支付成功的頁(yè)面 payok.html
<div class="alert alert-primary" role="alert">
支付成功
</div>四、測(cè)試
4.1 訪問(wèn)http://localhost:8080/pay.html




總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
WebSocket獲取httpSession空指針異常的解決辦法
這篇文章主要介紹了在使用WebSocket實(shí)現(xiàn)p2p或一對(duì)多聊天功能時(shí),如何獲取HttpSession來(lái)獲取用戶信息,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2025-01-01
Java從零開(kāi)始創(chuàng)建功能豐富的PDF文檔
隨著數(shù)字化辦公的普及,PDF格式因其跨平臺(tái)兼容性和安全性而被廣泛應(yīng)用于各種場(chǎng)景中,本文將詳細(xì)介紹如何使用Java來(lái)實(shí)現(xiàn)PDF文檔的一鍵生成,有需要的可以了解下2025-01-01
Java數(shù)據(jù)結(jié)構(gòu)之復(fù)雜度篇
算法復(fù)雜度分為時(shí)間復(fù)雜度和空間復(fù)雜度。其作用:?時(shí)間復(fù)雜度是度量算法執(zhí)行的時(shí)間長(zhǎng)短;而空間復(fù)雜度是度量算法所需存儲(chǔ)空間的大小2022-01-01
深入淺析Netty 在 Dubbo 中是如何應(yīng)用的
國(guó)內(nèi)知名框架 Dubbo 底層使用的是 Netty 作為網(wǎng)絡(luò)通信,那么內(nèi)部到底是如何使用的呢?今天通過(guò)本文給大家詳細(xì)講解,對(duì)Netty 在 Dubbo中應(yīng)用相關(guān)知識(shí)感興趣的朋友跟隨小編一起看看吧2020-05-05
Reactor 多任務(wù)并發(fā)執(zhí)行且結(jié)果按順序返回第一個(gè)
這篇文章主要介紹了Reactor 多任務(wù)并發(fā)執(zhí)行且結(jié)果按順序返回第一個(gè),文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下2022-09-09
Java?Scanner?類(lèi)讀取一維數(shù)組二維數(shù)組示例詳解
這篇文章主要為大家介紹了Java?Scanner?類(lèi)讀取一維數(shù)組二維數(shù)組示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11
一文詳細(xì)解析Java?8?Stream?API中的flatMap方法
這篇文章主要介紹了Java?8?Stream?API中的flatMap方法的相關(guān)資料,flatMap方法是Java?StreamAPI中的重要中間操作,用于將流中的每個(gè)元素轉(zhuǎn)換為一個(gè)新的流,并將多個(gè)流合并為一個(gè)單一的流,常用于處理嵌套集合和一對(duì)多映射,需要的朋友可以參考下2024-12-12

