SpringBoot實(shí)現(xiàn)簡易支付寶網(wǎng)頁支付功能
該文章描述了一個(gè)基于SpringBoot程序的支付寶支付demo,由于是個(gè)人開發(fā)者而非企業(yè),因此設(shè)計(jì)到的技術(shù)較為簡單,功能也有局限,適合初學(xué)者入門學(xué)習(xí)【我自己就是哈哈哈】
準(zhǔn)備工作
流程簡介

該圖截取于支付寶開放平臺官網(wǎng),描述了消費(fèi)者和商戶【開發(fā)者】服務(wù)器和支付寶服務(wù)間的請求流程,可以看到用戶是通過商戶的服務(wù)器進(jìn)行發(fā)送支付請求,再由消費(fèi)者輸入相關(guān)用戶登錄信息和支付信息【該流程商戶服務(wù)器無法干預(yù)和監(jiān)聽】,用戶和支付寶方的結(jié)果會(huì)由支付寶服務(wù)器通知回商戶服務(wù)器,商戶服務(wù)器可以編寫對應(yīng)的邏輯去處理。
獲取相關(guān)支付秘鑰信息
由于是個(gè)人開發(fā),沒有企業(yè)的營業(yè)執(zhí)照,因此自己采取的是使用沙箱模型進(jìn)行支付寶模擬,對應(yīng)的,支付寶掃碼軟件需要是沙箱版的支付寶,沙箱支付寶下載地址:支付寶
首先登陸螞蟻金服開放平臺,登錄后進(jìn)入管理中心


登錄后點(diǎn)擊該服務(wù),進(jìn)入后可以查看到屬于自己的沙箱測試賬號和一些公鑰私鑰等信息

<!-- aliPay相關(guān)SDK-->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.17.5.ALL</version>
</dependency>
<!-- 二維碼生成器-->
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.3.0</version>
</dependency>
這些信息很重要,我們可以在配置類中去定義配置這些信息,這里給出一個(gè)支付寶官方給出的配置類。
import java.io.FileWriter;
import java.io.IOException;
public class AlipayConfig {
//↓↓↓↓↓↓↓↓↓↓請?jiān)谶@里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
// 應(yīng)用ID,您的APPID,收款賬號既是您的APPID對應(yīng)支付寶賬號
public static String app_id = "你的APPID";
// 商戶私鑰,您的PKCS8格式RSA2私鑰
public static String merchant_private_key = "你的私鑰";
// 支付寶公鑰,查看地址:https://openhome.alipay.com/platform/keyManage.htm 對應(yīng)APPID下的支付寶公鑰。
public static String alipay_public_key="你的應(yīng)用公鑰";
// 下面是兩個(gè)回調(diào)地址,指支付成功后用戶會(huì)跳轉(zhuǎn)到哪些頁面,不填也可以
// 服務(wù)器異步通知頁面路徑 需http://格式的完整路徑,不能加?id=123這類自定義參數(shù),必須外網(wǎng)可以正常訪問
public static String notify_url = "http://工程公網(wǎng)訪問地址/alipay.trade.page.pay-JAVA-UTF-8/notify_url.jsp";
// 頁面跳轉(zhuǎn)同步通知頁面路徑 需http://格式的完整路徑,不能加?id=123這類自定義參數(shù),必須外網(wǎng)可以正常訪問
public static String return_url = "http://工程公網(wǎng)訪問地址/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) 正式支付網(wǎng)關(guān)是 https://openapi.alipay.com/gateway.do 千萬不要混淆了
public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";
// 支付寶網(wǎng)關(guān)
public static String log_path = "C:\\";
// json格式
public static String format = "json";
//↑↑↑↑↑↑↑↑↑↑請?jiān)谶@里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
/**
* 寫日志,方便測試(看網(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();
}
}
}
}
}
代碼編寫
支付請求鏈接
上述準(zhǔn)備工作配置完之后,就可以編寫controller了,在該controller中,許多信息都雜糅在了一起,實(shí)際上這些步驟可能需要拆分成多個(gè)步驟才是更合理的,這里僅僅為了代碼演示方便而放在一起。
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.data.domain.Pageable;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Controller;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import io.swagger.annotations.*;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @website https://el-admin.vip
* @author nijunwei
* @date 2021-10-18
**/
@Controller
@RequestMapping("/api/test")
public class TestController {
@GetMapping("/transcation")
public void doPost (HttpServletRequest httpRequest,
HttpServletResponse httpResponse) throws ServletException, IOException {
AlipayClient alipayClient = new DefaultAlipayClient( AlipayConfig.gatewayUrl , AlipayConfig.app_id, AlipayConfig.merchant_private_key,AlipayConfig.format , AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type); //獲得初始化的AlipayClient
AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest(); //創(chuàng)建API對應(yīng)的request
//商戶訂單號,商戶網(wǎng)站訂單系統(tǒng)中唯一訂單號,必填
String out_trade_no = UUID.randomUUID().toString().substring(0,13);
//付款金額,必填
String total_amount = new String("88.88");
//訂單名稱,必填
String subject="冬天的第一杯奶茶";
//商品描述,可空
String body = new String("我的你的什么?你是我的優(yōu)樂美");
String bizContent="{\"out_trade_no\":\""+ out_trade_no +"\","
+ "\"total_amount\":\""+ total_amount +"\","
+ "\"subject\":\""+ subject +"\","
+ "\"body\":\""+ body +"\","
+ "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}";
alipayRequest.setBizContent(bizContent);
// alipayRequest.setBizContent(json);
String form= "" ;
try {
form = alipayClient.pageExecute(alipayRequest).getBody(); //調(diào)用SDK生成表單
} catch (AlipayApiException e) {
e.printStackTrace();
}
// 頁面刷新會(huì)客戶端
httpResponse.setCharacterEncoding("UTF-8");
httpResponse.setContentType("text/html;charset=UTF-8");
httpResponse.getWriter().write(form); //直接將完整的表單html輸出到頁面
httpResponse.getWriter().flush();
httpResponse.getWriter().close();
}
}
幾個(gè)比較值得注意的參數(shù),其余的請求體參數(shù)可以在支付寶開放平臺查詢完整的參數(shù)含義
out_tarde_no:支付單號,用于辨別是否重復(fù)確認(rèn),支付寶那邊會(huì)有一套機(jī)制防止用戶重復(fù)支付一個(gè)單號的訂單。 total_amount:支付金額,單位為元,可達(dá)到小數(shù)點(diǎn)后兩位,如88.88表示88元8角8分。 subject:支付時(shí)顯示訂單標(biāo)題 body:商品的信息描述 product_code:此處固定為FAST_INSTANT_TRADE_PAY,對于其他代碼的含義可查看官方文檔
使用沙箱支付寶請求該鏈接后頁面如下,不同頁面是不同請求地址的,但大致流程與原理一致。

使用沙箱支付寶進(jìn)入該連接就可以了,例如
二維碼生成
那么外部該如何訪問呢?使用支付寶的掃碼功能可以很好的解決這個(gè)問題
一個(gè)生成QRCode的工具類如下
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
public class QRCodeGeneratorUtil {
// 暫定圖片路徑
private static final String QR_CODE_IMAGE_PATH = "D:\\eladmin\\eladmin\\QRCodePics\\test.png";
private static void generateQRCodeImage(String text, int width, int height, String filePath) throws WriterException, IOException {
QRCodeWriter qrCodeWriter = new QRCodeWriter();
BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height);
Path path = FileSystems.getDefault().getPath(filePath);
MatrixToImageWriter.writeToPath(bitMatrix, "PNG", path);
}
public static void main(String[] args) {
try {
generateQRCodeImage("http://192.168.137.1:8000/api/test/transcation", 350, 350, QR_CODE_IMAGE_PATH);
} catch (WriterException e) {
System.out.println("Could not generate QR Code, WriterException :: " + e.getMessage());
} catch (IOException e) {
System.out.println("Could not generate QR Code, IOException :: " + e.getMessage());
}
}
}
主方法中生成了一張信息為
長寬為350的二維碼,掃描該二維嗎即可訪問其中的信息【會(huì)直接向該鏈接發(fā)生請求】
其中,請求的ip地址如果部署在公網(wǎng)可以訪問的服務(wù)器,那么直接使用手機(jī)上的沙箱支付寶掃描即可。如果沒有公網(wǎng)的服務(wù)器【如阿里云】那么可以讓手機(jī)和電腦置于同一局域網(wǎng)然后內(nèi)網(wǎng)訪問,或者使用電腦自帶的熱點(diǎn)功能,開啟后讓手機(jī)連接。

然后打開cmd,查看局域網(wǎng)內(nèi)網(wǎng)絡(luò)配置,輸入ipconfig查看,如果是linux,則ifconfig

可以看到是192.168.137.1這個(gè)地址,這和上面我那段代碼是一樣的,因此選取該IP地址即可在內(nèi)網(wǎng)進(jìn)行訪問,達(dá)到模擬的效果,支付寶掃碼時(shí)便可向SpringBoot程序發(fā)送請求,然后傳到支付寶端,處理請求后傳回html頁面,直接返回給客戶端。
到此這篇關(guān)于SpringBoot實(shí)現(xiàn)簡易支付寶網(wǎng)頁支付的文章就介紹到這了,更多相關(guān)SpringBoot支付寶網(wǎng)頁支付內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Springboot集成第三方j(luò)ar快速實(shí)現(xiàn)微信、支付寶等支付場景
- SpringBoot接入支付寶支付的方法步驟
- springboot+vue+對接支付寶接口+二維碼掃描支付功能(沙箱環(huán)境)
- springboot 集成支付寶支付的示例代碼
- springboot對接支付寶支付接口(詳細(xì)開發(fā)步驟總結(jié))
- springboot調(diào)用支付寶第三方接口(沙箱環(huán)境)
- SpringBoot整合支付寶APP支付
- SpringBoot集成支付寶沙箱支付(支付、退款)
- IDEA基于支付寶小程序搭建springboot項(xiàng)目的詳細(xì)步驟
相關(guān)文章
spring-boot2.7.8添加swagger的案例詳解
這篇文章主要介紹了spring-boot2.7.8添加swagger的案例詳解,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-01-01
java 根據(jù)坐標(biāo)截取圖片實(shí)例代碼
這篇文章主要介紹了java 根據(jù)坐標(biāo)截取圖片實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-03-03
SpringBoot實(shí)現(xiàn)IP地址解析的示例代碼
本篇帶大家實(shí)踐在springboot項(xiàng)目中獲取請求的ip與詳細(xì)地址,我們的很多網(wǎng)站app中都已經(jīng)新增了ip地址顯示,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01
SpringbootJPA分頁 PageRequest過時(shí)的替代方法
這篇文章主要介紹了SpringbootJPA分頁 PageRequest過時(shí)的替代方法,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
SpringBoot實(shí)現(xiàn)異步的八種方法
Spring Boot 的異步處理主要是通過非阻塞I/O和回調(diào)機(jī)制來實(shí)現(xiàn)的,目的是提高應(yīng)用的并發(fā)性能,它支持多種方式來創(chuàng)建異步任務(wù),本文給大家介紹了SpringBoot實(shí)現(xiàn)異步的八種方法,需要的朋友可以參考下2024-07-07

