SpringBoot基于沙箱環(huán)境實(shí)現(xiàn)支付寶支付教程
一、支付寶沙箱環(huán)境介紹
沙箱環(huán)境是支付寶開放平臺(tái)為開發(fā)者提供的安全低門檻的測(cè)試環(huán)境,開發(fā)者在沙箱環(huán)境中調(diào)用接口無(wú)需具備所需的商業(yè)資質(zhì),無(wú)需綁定和開通產(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è)入駐支付寶開放平臺(tái)
登錄支付寶開放平臺(tái),支付寶登錄平臺(tái),找到開發(fā)接入入駐為開發(fā)者。
2.2 配置沙箱環(huán)境
進(jìn)入到開發(fā)者的控制臺(tái),找到最下方的開發(fā)者工具推薦 ,點(diǎn)擊沙箱。
2.3 沙箱應(yīng)用
獲取支付參數(shù)信息
打開沙箱應(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.com
3.3 對(duì)應(yīng)的配置類
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)地址:配置文件中不要寫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)的工廠類 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
商品名稱或交易標(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)文章
Java打開瀏覽器訪問(wèn)指定頁(yè)面的實(shí)現(xiàn)方法
在開發(fā)Java應(yīng)用程序時(shí),有時(shí)需要從程序中啟動(dòng)默認(rèn)的Web瀏覽器并訪問(wèn)特定的網(wǎng)頁(yè),這在實(shí)現(xiàn)幫助文檔鏈接、用戶指南或在線資源導(dǎo)航等功能時(shí)非常有用,本文將介紹如何使用Java代碼來(lái)實(shí)現(xiàn)這一功能,需要的朋友可以參考下2025-01-01跳表的由來(lái)及Java實(shí)現(xiàn)詳解
跳表(Skip List)是一種基于鏈表的數(shù)據(jù)結(jié)構(gòu),它可以支持快速的查找、插入、刪除操作,本文主要來(lái)和大家講講跳表的由來(lái)與實(shí)現(xiàn),感興趣的小伙伴可以了解一下2023-06-06Spring-boot結(jié)合Shrio實(shí)現(xiàn)JWT的方法
這篇文章主要介紹了Spring-boot結(jié)合Shrio實(shí)現(xiàn)JWT的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05Java8深入學(xué)習(xí)系列(一)lambda表達(dá)式介紹
Java8最值得學(xué)習(xí)的特性就是Lambda表達(dá)式和Stream API,所以我們學(xué)習(xí)java8的第一課就是學(xué)習(xí)lambda表達(dá)式,下面這篇文章主要給大家介紹了關(guān)于Java8學(xué)習(xí)之lambda的相關(guān)資料,文中介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-08-08Spring Boot使用Spring的異步線程池的實(shí)現(xiàn)
這篇文章主要介紹了Spring Boot使用Spring的異步線程池的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02Java中Spring MVC接收表單數(shù)據(jù)的常用方法
Spring MVC是Spring框架中的一個(gè)模塊,用于開發(fā)基于MVC(Model-View-Controller)架構(gòu)的Web應(yīng)用程序,它提供了一種輕量級(jí)的、靈活的方式來(lái)構(gòu)建Web應(yīng)用,同時(shí)提供了豐富的功能和特性,本文給大家介紹了Spring MVC接收表單數(shù)據(jù)的方法,需要的朋友可以參考下2024-05-05