Java中Spring Boot支付寶掃碼支付及支付回調(diào)的實(shí)現(xiàn)代碼
前言:最近開(kāi)發(fā)支付寶支付功能,總結(jié)一下做個(gè)分享
官方文檔:https://opendocs.alipay.com/apis
支付寶沙箱地址: https://openhome.alipay.com/platform/appDaily.htm?tab=info
支付寶支付流程:
準(zhǔn)備工作:獲取支付寶沙箱數(shù)據(jù)(APPID,支付寶網(wǎng)關(guān),RSA2秘,沙箱支付賬號(hào)等)
集成SpringBoot,使用Java代碼發(fā)起支付請(qǐng)求
支付寶收到支付請(qǐng)求后,返回HTML代碼片段,用于前端展示二維碼
掃碼支付成功后,支付寶發(fā)送同步、異步通知請(qǐng)求,同步、異步通知路徑可在配置文件中進(jìn)行配置
收到異步通知結(jié)果后,進(jìn)行驗(yàn)簽,驗(yàn)簽通過(guò),返回成功信息通知支付寶不在進(jìn)行異步通知
此時(shí)支付寶支付流程完成,調(diào)用支付寶查詢接口,確認(rèn)支付成功
一、獲取支付寶沙箱數(shù)據(jù)
打開(kāi)上述沙箱地址,獲取沙箱配置,查看下圖信息
二、集成SpringBoot,使用Java代碼發(fā)起支付請(qǐng)求
1、在pom.xml文件添加支付寶依賴
<!-- 支付寶支付 --> <dependency> <groupId>com.alipay.sdk</groupId> <artifactId>alipay-sdk-java</artifactId> <version>3.7.26.ALL</version> </dependency>
2、在項(xiàng)目中新建一個(gè)支付寶工具類
public class AlipayConfig { // ↓↓↓↓↓↓↓↓↓↓請(qǐng)?jiān)谶@里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ // 應(yīng)用ID,您的APPID,收款賬號(hào)既是您的APPID對(duì)應(yīng)支付寶賬號(hào) public static String app_id = ""; // 商戶私鑰,您的PKCS8格式RSA2私鑰 public static String merchant_private_key = ""; // 支付寶公鑰,查看地址:https://openhome.alipay.com/platform/keyManage.htm 對(duì)應(yīng)APPID下的支付寶公鑰。 public static String alipay_public_key = ""; // 服務(wù)器異步通知頁(yè)面路徑 需http://格式的完整路徑,不能加?id=123這類自定義參數(shù),必須外網(wǎng)可以正常訪問(wèn) // 這里需要配置支付寶回調(diào)的后端路徑,必須要外網(wǎng)可以訪問(wèn) public static String notify_url = "http://localhost:8080/alipay.trade.page.pay-JAVA-UTF-8/notify_url.jsp"; // 頁(yè)面跳轉(zhuǎn)同步通知頁(yè)面路徑 需http://格式的完整路徑,不能加?id=123這類自定義參數(shù),必須外網(wǎng)可以正常訪問(wèn) // TODO 這里需要配置支付寶回調(diào)的前端路徑,必須要外網(wǎng)可以訪問(wèn) public static String return_url = "http://localhost:8080/alipay.trade.page.pay-JAVA-UTF-8/return_url.jsp"; // 簽名方式 public static String sign_type = "RSA2"; // 字符編碼格式 public static String charset = "UTF-8"; // 支付寶網(wǎng)關(guān) public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do"; // 日志路徑 public static String log_path = "C:\\"; // ↑↑↑↑↑↑↑↑↑↑請(qǐng)?jiān)谶@里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ /** * 寫(xiě)日志,方便測(cè)試(看網(wǎng)站需求,也可以改成把記錄存入數(shù)據(jù)庫(kù)) * * @param sWord 要寫(xiě)入日志里的文本內(nèi)容 */ public static void logResult(String sWord) { FileWriter writer = null; try { writer = new FileWriter(log_path + "alipay_log_" + System.currentTimeMillis() + ".txt"); writer.write(sWord); } catch (Exception e) { e.printStackTrace(); } finally { if (writer != null) { try { writer.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
3、定義Service
public interface AlipayService { /** * 發(fā)起支付 * @param outTradeNo 訂單編號(hào)(唯一) * @param totalAmount 訂單價(jià)格 * @param subject 商品名稱 */ String goPay(String outTradeNo,BigDecimal totalAmount,String subject) throws Exception; /** * 交易查詢 * @param outTradeNo 訂單編號(hào)(唯一) */ String query(String outTradeNo) throws AlipayApiException; /** * 交易關(guān)閉 * @param outTradeNo訂單編號(hào)(唯一) */ String close(String outTradeNo) throws AlipayApiException; }
4、實(shí)現(xiàn)ServiceImpl,發(fā)起支付請(qǐng)求,交易查詢等
public class AlipayServiceImpl implements AlipayService { @Autowired private RechargeDetailService rechargeDetailService; @Override public String goPay(String outTradeNo, BigDecimal totalAmount, String subject) throws Exception { AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type); AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest(); /** 同步通知,支付完成后,支付成功頁(yè)面 */ alipayRequest.setReturnUrl(AlipayConfig.return_url); /** 異步通知,支付完成后,需要進(jìn)行的異步處理 */ alipayRequest.setNotifyUrl(AlipayConfig.notify_url); alipayRequest.setBizContent("{\"out_trade_no\":\"" + outTradeNo + "\"," + "\"total_amount\":\"" + totalAmount + "\"," + "\"subject\":\"" + subject + "\"," + "\"body\":\"付款\"," + "\"timeout_express\":\"15m\"," + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}"); /** 轉(zhuǎn)換格式 */ String form = ""; form = alipayClient.pageExecute(alipayRequest).getBody(); return form; } @Override public String query(String outTradeNo) throws AlipayApiException { AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type); AlipayTradeQueryRequest alipayRequest = new AlipayTradeQueryRequest(); /** 請(qǐng)求接口 */ alipayRequest.setBizContent("{\"out_trade_no\":\"" + outTradeNo + "\"," + "\"trade_no\":\"" + "" + "\"}"); /** 轉(zhuǎn)換格式 */ String result = alipayClient.execute(alipayRequest).getBody(); return result; } @Override public String close(String outTradeNo) throws AlipayApiException { AlipayTradeCloseRequest alipayRequest = new AlipayTradeCloseRequest(); AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type); alipayRequest.setBizContent("{\"out_trade_no\":\"" + outTradeNo + "\"," + "\"trade_no\":\"" + "" + "\"}"); String result = alipayClient.execute(alipayRequest).getBody(); return result; } }
5、創(chuàng)建支付寶controller
public class AlipayController { @Autowired private AlipayService alipayService; /** * 訂單支付 */ @GetMapping("goPay") public Map<Object, Object> goPay() throws Exception{ /** 模仿數(shù)據(jù)庫(kù),從后臺(tái)調(diào)數(shù)據(jù)*/ String outTradeNo = "202101010001"; BigDecimaltotalAmount = new BigDecimal(10000); String subject = "蘋(píng)果12"; String pay = alipayService.goPay(outTradeNo, totalAmount, subject); Map<Object, Object> pays = new HashMap<>(); pays.put("pay", pay); return pays; } /** * 交易查詢 */ @PostMapping("aipayQuery") public Result<Object> alipayQuery() throws Exception{ /**調(diào)取支付訂單號(hào)*/ String outTradeNo = "13123"; String query = alipayService.query(outTradeNo); Object json = JSONObject.toJSON(query); /*JSONObject jObject = new JSONObject(); jObject.get(query);*/ return Result.success(json); } /** * 交易關(guān)閉 * @throws AlipayApiException */ @PostMapping("alipayclose") public Result<Object> alipaycolse() throws AlipayApiException{ /** 調(diào)取數(shù)據(jù)*/ String outTradeNo = "13123"; String close = alipayService.close(outTradeNo); return Result.success(close); } /** * 異步通知支付結(jié)果 * * @param request * @return String * @throws AlipayApiException * @throws ParseException */ @PostMapping("/callBack") public String alipayNotify(HttpServletRequest request) throws Exception { // 獲取支付寶的請(qǐng)求信息 Map<String, String> map = new HashMap<>(); Map<String, String[]> requestParams = request.getParameterMap(); if(requestParams.isEmpty()) { return "failure"; } // 將 Map<String,String[]> 轉(zhuǎn)為 Map<String,String> for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext();) { String name = iter.next(); String[] values = requestParams.get(name); String valueStr = ""; for (int i = 0; i < values.length; i++) { valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ","; } map.put(name, valueStr); } // 驗(yàn)簽 boolean signVerified = AlipaySignature.rsaCheckV1(map, AlipayConfig.alipay_public_key, AlipayConfig.charset, AlipayConfig.sign_type); // 驗(yàn)簽通過(guò) if (signVerified) { //支付成功后進(jìn)行操作 } return "failure"; } }
到此SpringBoot整合支付寶掃碼支付,就完成了
到此這篇關(guān)于Java中Spring Boot支付寶掃碼支付及支付回調(diào)的實(shí)現(xiàn)代碼的文章就介紹到這了,更多相關(guān)Spring Boot支付寶掃碼支付內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java基礎(chǔ)之spring5新功能學(xué)習(xí)
- Java Spring5學(xué)習(xí)之JdbcTemplate詳解
- Java基礎(chǔ)之Spring5的核心之一IOC容器
- SpringBoot+JavaMailSender實(shí)現(xiàn)騰訊企業(yè)郵箱配置
- Spring通過(guò)Java配置集成Tomcat的方法
- java、spring、springboot中整合Redis的詳細(xì)講解
- Spring的@Validation和javax包下的@Valid區(qū)別以及自定義校驗(yàn)注解
- 最優(yōu)雅地整合 Spring & Spring MVC & MyBatis 搭建 Java 企業(yè)級(jí)應(yīng)用(附源碼)
- Java Spring數(shù)據(jù)單元配置過(guò)程解析
- Java Spring WEB應(yīng)用實(shí)例化如何實(shí)現(xiàn)
- Java Spring事務(wù)使用及驗(yàn)證過(guò)程詳解
- Spring5學(xué)習(xí)之基礎(chǔ)知識(shí)總結(jié)
相關(guān)文章
java -D參數(shù)設(shè)置系統(tǒng)屬性無(wú)效問(wèn)題及解決
這篇文章主要介紹了java -D參數(shù)設(shè)置系統(tǒng)屬性無(wú)效問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12SpringCloud Feign服務(wù)調(diào)用請(qǐng)求方式總結(jié)
這篇文章主要介紹了SpringCloud Feign服務(wù)調(diào)用方式總結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04在springboot3微項(xiàng)目中如何用idea批量創(chuàng)建單元測(cè)試邏輯
這篇文章主要介紹了在SpringBoot3項(xiàng)目中使用IntelliJIDEA批量創(chuàng)建單元測(cè)試包括準(zhǔn)備工作(確保項(xiàng)目配置正確,添加測(cè)試依賴),使用IntelliJIDEA創(chuàng)建測(cè)試,感興趣的朋友一起看看吧2024-10-10Java 語(yǔ)言實(shí)現(xiàn)清除帶 html 標(biāo)簽的內(nèi)容方法
下面小編就為大家?guī)?lái)一篇Java 語(yǔ)言實(shí)現(xiàn)清除帶 html 標(biāo)簽的內(nèi)容方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02IntelliJ IDEA基于Maven構(gòu)建Java項(xiàng)目
在 Java 開(kāi)發(fā)中,使用 Maven 是一種廣泛采用的構(gòu)建工具,本文主要介紹了IntelliJ IDEA基于Maven構(gòu)建Java項(xiàng)目,具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03