当前位置: 首页 > news >正文

SpringBoot项目集成支付宝

在 Spring Boot 项目中对接支付宝的第三方支付接口涉及几个主要步骤:集成支付宝 SDK、配置支付宝相关信息、实现支付和退款逻辑。

1. 添加依赖

首先,你需要在项目的 pom.xml 文件中添加支付宝 SDK 的依赖。如果使用 Maven,可以添加如下依赖:

<dependency><groupId>com.alipay.sdk</groupId><artifactId>alipay-sdk-java</artifactId><version>4.14.37.ALL</version> <!-- 使用最新的版本 -->
</dependency>

2. 配置支付宝信息

application.propertiesapplication.yml 文件中配置支付宝相关的信息,包括商户 ID、应用 ID、私钥和支付宝公钥等。

# application.properties
alipay.app-id=YOUR_APP_ID
alipay.merchant-private-key=YOUR_PRIVATE_KEY
alipay.alipay-public-key=ALIPAY_PUBLIC_KEY
alipay.gateway-url=https://openapi.alipay.com/gateway.do

3. 创建支付服务

创建一个服务类来处理支付宝支付和退款请求。首先是支付请求的构造和发送:

import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.AlipayRequest;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.response.AlipayTradePagePayResponse;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;@Service
public class AlipayService {@Value("${alipay.gateway-url}")private String gatewayUrl;@Value("${alipay.app-id}")private String appId;@Value("${alipay.merchant-private-key}")private String privateKey;@Value("${alipay.alipay-public-key}")private String alipayPublicKey;private AlipayClient alipayClient;public AlipayService() {alipayClient = new DefaultAlipayClient(gatewayUrl,appId,privateKey,"json","UTF-8",alipayPublicKey,"RSA2");}public String createPaymentUrl(String outTradeNo, String totalAmount, String subject) throws AlipayApiException {AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();request.setReturnUrl("http://yourdomain.com/return_url");request.setNotifyUrl("http://yourdomain.com/notify_url");StringBuilder bizContent = new StringBuilder();bizContent.append("{").append("\"out_trade_no\":\"").append(outTradeNo).append("\",").append("\"total_amount\":\"").append(totalAmount).append("\",").append("\"subject\":\"").append(subject).append("\",").append("\"product_code\":\"FAST_INSTANT_TRADE_PAY\"").append("}");request.setBizContent(bizContent.toString());AlipayTradePagePayResponse response = alipayClient.pageExecute(request);if (response.isSuccess()) {return response.getBody(); // 这是支付宝返回的支付页面的 HTML 内容} else {throw new RuntimeException("Alipay request failed: " + response.getSubMsg());}}
}

4. 创建退款服务

退款服务类处理退款请求:

import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradeRefundRequest;
import com.alipay.api.response.AlipayTradeRefundResponse;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;@Service
public class AlipayRefundService {@Value("${alipay.gateway-url}")private String gatewayUrl;@Value("${alipay.app-id}")private String appId;@Value("${alipay.merchant-private-key}")private String privateKey;@Value("${alipay.alipay-public-key}")private String alipayPublicKey;private AlipayClient alipayClient;public AlipayRefundService() {alipayClient = new DefaultAlipayClient(gatewayUrl,appId,privateKey,"json","UTF-8",alipayPublicKey,"RSA2");}public String refund(String outTradeNo, String refundAmount) throws AlipayApiException {AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();request.setBizContent("{"+ "\"out_trade_no\":\"" + outTradeNo + "\","+ "\"refund_amount\":\"" + refundAmount + "\""+ "}");AlipayTradeRefundResponse response = alipayClient.execute(request);if (response.isSuccess()) {return "Refund successful";} else {throw new RuntimeException("Alipay refund failed: " + response.getSubMsg());}}
}

5. 创建控制器

在控制器中创建端点来处理支付和退款请求:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.alipay.api.AlipayApiException;@RestController
public class AlipayController {@Autowiredprivate AlipayService alipayService;@Autowiredprivate AlipayRefundService alipayRefundService;@GetMapping("/pay")public String pay(@RequestParam String outTradeNo, @RequestParam String totalAmount, @RequestParam String subject) {try {String paymentUrl = alipayService.createPaymentUrl(outTradeNo, totalAmount, subject);return paymentUrl; // 返回支付页面的 HTML 内容} catch (AlipayApiException e) {return "Error occurred: " + e.getMessage();}}@PostMapping("/refund")public String refund(@RequestParam String outTradeNo, @RequestParam String refundAmount) {try {return alipayRefundService.refund(outTradeNo, refundAmount);} catch (AlipayApiException e) {return "Error occurred: " + e.getMessage();}}
}

6. 处理异步通知

支付宝支付和退款成功后会向你配置的 notify_url 发送异步通知。你需要在应用中创建一个处理这些通知的端点:

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradeQueryRequest;
import com.alipay.api.response.AlipayTradeQueryResponse;@RestController
public class AlipayNotifyController {@PostMapping("/notify_url")public String notifyUrl(@RequestParam Map<String, String> params) {// 验证通知的真实性// 处理支付或退款成功后的逻辑String outTradeNo = params.get("out_trade_no");// 处理支付逻辑// ...return "success"; // 返回给支付宝,确认收到通知}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • VS-E5PH3006L-N3 600V 30A 高效低损耗整流器 二极管 电动 / 混动汽车电池充电的可靠之选
  • 【Python】3.基础语法(3)函数
  • 【每日刷题】Day106
  • GoF 代理模式
  • 什么是 AWS CloudWatch?
  • Day54 | Floyd 算法 A * 算法
  • [Algorithm][综合训练][拜访][买卖股票的最好时机(四)]详细讲解
  • 第四章 Java核心类库 第四节 异常处理
  • 重头开始嵌入式第三十天(Linux系统编程 ip头)
  • 骨灵冷火!Solon Cloud Gateway 照面发布
  • rabbitmq高可用集群搭建
  • 【软件测试专栏】软件测试 — 用例篇
  • docker 启动ElasticSearch
  • 小程序的页面跳转方式
  • 【go-zero】goctl笔记
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • angular2 简述
  • Bootstrap JS插件Alert源码分析
  • flutter的key在widget list的作用以及必要性
  • Js基础知识(一) - 变量
  • XForms - 更强大的Form
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 搭建gitbook 和 访问权限认证
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 聊聊flink的TableFactory
  • 前嗅ForeSpider教程:创建模板
  • 前言-如何学习区块链
  • 如何编写一个可升级的智能合约
  • 突破自己的技术思维
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • 树莓派用上kodexplorer也能玩成私有网盘
  • # Apache SeaTunnel 究竟是什么?
  • #etcd#安装时出错
  • (7) cmake 编译C++程序(二)
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (第61天)多租户架构(CDB/PDB)
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (三)终结任务
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • (自用)交互协议设计——protobuf序列化
  • (最新)华为 2024 届秋招-硬件技术工程师-单板硬件开发—机试题—(共12套)(每套四十题)
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .naturalWidth 和naturalHeight属性,
  • .NET 8 跨平台高性能边缘采集网关
  • .net core 控制台应用程序读取配置文件app.config
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .NET 常见的偏门问题
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • @ohos.systemParameterEnhance系统参数接口调用:控制设备硬件(执行shell命令方式)
  • [.NET]桃源网络硬盘 v7.4
  • [20161101]rman备份与数据文件变化7.txt