Java中Spring Boot支付寶掃碼支付及支付回調(diào)的實現(xiàn)代碼
前言:最近開發(fā)支付寶支付功能,總結(jié)一下做個分享
官方文檔:https://opendocs.alipay.com/apis
支付寶沙箱地址: https://openhome.alipay.com/platform/appDaily.htm?tab=info
支付寶支付流程:
準備工作:獲取支付寶沙箱數(shù)據(jù)(APPID,支付寶網(wǎng)關(guān),RSA2秘,沙箱支付賬號等)
集成SpringBoot,使用Java代碼發(fā)起支付請求
支付寶收到支付請求后,返回HTML代碼片段,用于前端展示二維碼
掃碼支付成功后,支付寶發(fā)送同步、異步通知請求,同步、異步通知路徑可在配置文件中進行配置
收到異步通知結(jié)果后,進行驗簽,驗簽通過,返回成功信息通知支付寶不在進行異步通知
此時支付寶支付流程完成,調(diào)用支付寶查詢接口,確認支付成功
一、獲取支付寶沙箱數(shù)據(jù)
打開上述沙箱地址,獲取沙箱配置,查看下圖信息

二、集成SpringBoot,使用Java代碼發(fā)起支付請求
1、在pom.xml文件添加支付寶依賴
<!-- 支付寶支付 --> <dependency> <groupId>com.alipay.sdk</groupId> <artifactId>alipay-sdk-java</artifactId> <version>3.7.26.ALL</version> </dependency>
2、在項目中新建一個支付寶工具類
public class AlipayConfig {
// ↓↓↓↓↓↓↓↓↓↓請在這里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
// 應(yīng)用ID,您的APPID,收款賬號既是您的APPID對應(yīng)支付寶賬號
public static String app_id = "";
// 商戶私鑰,您的PKCS8格式RSA2私鑰
public static String merchant_private_key = "";
// 支付寶公鑰,查看地址:https://openhome.alipay.com/platform/keyManage.htm 對應(yīng)APPID下的支付寶公鑰。
public static String alipay_public_key = "";
// 服務(wù)器異步通知頁面路徑 需http://格式的完整路徑,不能加?id=123這類自定義參數(shù),必須外網(wǎng)可以正常訪問
// 這里需要配置支付寶回調(diào)的后端路徑,必須要外網(wǎng)可以訪問
public static String notify_url = "http://localhost:8080/alipay.trade.page.pay-JAVA-UTF-8/notify_url.jsp";
// 頁面跳轉(zhuǎn)同步通知頁面路徑 需http://格式的完整路徑,不能加?id=123這類自定義參數(shù),必須外網(wǎng)可以正常訪問
// TODO 這里需要配置支付寶回調(diào)的前端路徑,必須要外網(wǎng)可以訪問
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:\\";
// ↑↑↑↑↑↑↑↑↑↑請在這里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
/**
* 寫日志,方便測試(看網(wǎng)站需求,也可以改成把記錄存入數(shù)據(jù)庫)
*
* @param sWord 要寫入日志里的文本內(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 訂單編號(唯一)
* @param totalAmount 訂單價格
* @param subject 商品名稱
*/
String goPay(String outTradeNo,BigDecimal totalAmount,String subject) throws Exception;
/**
* 交易查詢
* @param outTradeNo 訂單編號(唯一)
*/
String query(String outTradeNo) throws AlipayApiException;
/**
* 交易關(guān)閉
* @param outTradeNo訂單編號(唯一)
*/
String close(String outTradeNo) throws AlipayApiException;
}
4、實現(xiàn)ServiceImpl,發(fā)起支付請求,交易查詢等
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();
/** 同步通知,支付完成后,支付成功頁面 */
alipayRequest.setReturnUrl(AlipayConfig.return_url);
/** 異步通知,支付完成后,需要進行的異步處理 */
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();
/** 請求接口 */
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ù)庫,從后臺調(diào)數(shù)據(jù)*/
String outTradeNo = "202101010001";
BigDecimaltotalAmount = new BigDecimal(10000);
String subject = "蘋果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)取支付訂單號*/
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 {
// 獲取支付寶的請求信息
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);
}
// 驗簽
boolean signVerified = AlipaySignature.rsaCheckV1(map, AlipayConfig.alipay_public_key, AlipayConfig.charset,
AlipayConfig.sign_type);
// 驗簽通過
if (signVerified) {
//支付成功后進行操作
}
return "failure";
}
}
到此SpringBoot整合支付寶掃碼支付,就完成了
到此這篇關(guān)于Java中Spring Boot支付寶掃碼支付及支付回調(diào)的實現(xiàn)代碼的文章就介紹到這了,更多相關(guān)Spring Boot支付寶掃碼支付內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java基礎(chǔ)之spring5新功能學(xué)習(xí)
- Java Spring5學(xué)習(xí)之JdbcTemplate詳解
- Java基礎(chǔ)之Spring5的核心之一IOC容器
- SpringBoot+JavaMailSender實現(xiàn)騰訊企業(yè)郵箱配置
- Spring通過Java配置集成Tomcat的方法
- java、spring、springboot中整合Redis的詳細講解
- Spring的@Validation和javax包下的@Valid區(qū)別以及自定義校驗注解
- 最優(yōu)雅地整合 Spring & Spring MVC & MyBatis 搭建 Java 企業(yè)級應(yīng)用(附源碼)
- Java Spring數(shù)據(jù)單元配置過程解析
- Java Spring WEB應(yīng)用實例化如何實現(xiàn)
- Java Spring事務(wù)使用及驗證過程詳解
- Spring5學(xué)習(xí)之基礎(chǔ)知識總結(jié)
相關(guān)文章
java -D參數(shù)設(shè)置系統(tǒng)屬性無效問題及解決
這篇文章主要介紹了java -D參數(shù)設(shè)置系統(tǒng)屬性無效問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12
SpringCloud Feign服務(wù)調(diào)用請求方式總結(jié)
這篇文章主要介紹了SpringCloud Feign服務(wù)調(diào)用方式總結(jié),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-04-04
在springboot3微項目中如何用idea批量創(chuàng)建單元測試邏輯
這篇文章主要介紹了在SpringBoot3項目中使用IntelliJIDEA批量創(chuàng)建單元測試包括準備工作(確保項目配置正確,添加測試依賴),使用IntelliJIDEA創(chuàng)建測試,感興趣的朋友一起看看吧2024-10-10
Java 語言實現(xiàn)清除帶 html 標簽的內(nèi)容方法
下面小編就為大家?guī)硪黄狫ava 語言實現(xiàn)清除帶 html 標簽的內(nèi)容方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02
IntelliJ IDEA基于Maven構(gòu)建Java項目
在 Java 開發(fā)中,使用 Maven 是一種廣泛采用的構(gòu)建工具,本文主要介紹了IntelliJ IDEA基于Maven構(gòu)建Java項目,具有一定的參考價值,感興趣的可以了解一下2024-03-03

