news 2026/4/3 3:57:07

Springboot集成支付宝

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Springboot集成支付宝

1、支付宝开放平台操作

我们需要做内网穿透,推荐使用 ngrok | API Gateway, Kubernetes Ingress, Webhook Gateway

详细接口参考API - 开放平台

进入 控制台首页 - 开放平台,开通沙箱环境

支付宝公钥,和你的秘钥点击查看就能看到

2、Springboot项目集成

1、添加依赖

添加支付宝sdk依赖和糊涂工具包

<dependency> <groupId>com.alipay.sdk</groupId> <artifactId>alipay-sdk-java</artifactId> <version>4.22.110.ALL</version> </dependency> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.8.25</version> </dependency>

2、配置文件添加

alipay: # 应用ID app-id: 你的APPID # 商户私钥 merchant-private-key: 你的私钥 # 支付宝公钥 alipay-public-key: 支付宝公钥 # 网关地址 gateway-url: https://openapi.alipay.com/gateway.do # 回调地址(需公网可访问) notify-url: https://your-domain.com/alipay/notify return-url: https://your-domain.com/alipay/return # 签名方式 sign-type: RSA2 charset: UTF-8 format: JSON

3、代码实现

配置类

package com.jha.springcloudlearn.entity; import com.alipay.api.AlipayClient; import com.alipay.api.DefaultAlipayClient; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class AlipayConfig { @Value("${alipay.app-id}") private String appId; @Value("${alipay.merchant-private-key}") private String privateKey; @Value("${alipay.alipay-public-key}") private String alipayPublicKey; @Value("${alipay.gateway-url}") private String gatewayUrl; @Value("${alipay.sign-type}") private String signType; @Value("${alipay.charset}") private String charset; @Value("${alipay.format}") private String format; @Bean public AlipayClient alipayClient() { return new DefaultAlipayClient( gatewayUrl, appId, privateKey, format, charset, alipayPublicKey, signType ); } }

支付服务类

package com.jha.springcloudlearn.service.impl; import com.alipay.api.AlipayClient; import com.alipay.api.domain.AlipayTradePagePayModel; import com.alipay.api.request.AlipayTradePagePayRequest; import com.alipay.api.response.AlipayTradePagePayResponse; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.math.BigDecimal; @Service public class AlipayService { @Autowired private AlipayClient alipayClient; @Value("${alipay.notify-url}") private String notifyUrl; @Value("${alipay.return-url}") private String returnUrl; /** * 电脑网站支付 */ public String pagePay(AlipayOrder order) throws Exception { AlipayTradePagePayRequest request = new AlipayTradePagePayRequest(); // 设置异步通知地址 request.setNotifyUrl(notifyUrl); // 设置同步通知地址 request.setReturnUrl(returnUrl); AlipayTradePagePayModel model = new AlipayTradePagePayModel(); model.setOutTradeNo(order.getOutTradeNo()); model.setTotalAmount(order.getTotalAmount().toString()); model.setSubject(order.getSubject()); model.setBody(order.getBody()); model.setProductCode("FAST_INSTANT_TRADE_PAY"); request.setBizModel(model); AlipayTradePagePayResponse response = alipayClient.pageExecute(request); if (response.isSuccess()) { return response.getBody(); } else { throw new RuntimeException("支付宝支付调用失败"); } } /** * 订单实体类 */ @Data @AllArgsConstructor @NoArgsConstructor public static class AlipayOrder { private String outTradeNo; // 商户订单号 private BigDecimal totalAmount; // 订单金额 private String subject; // 订单标题 private String body; // 订单描述 } }

支付控制器

package com.jha.springcloudlearn.controller; import cn.hutool.json.JSONObject; import com.alipay.api.AlipayApiException; import com.alipay.api.internal.util.AlipaySignature; import com.alipay.api.request.AlipayTradeQueryRequest; import com.jha.springcloudlearn.service.impl.AlipayService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.Map; @RestController @RequestMapping("/alipay") public class AlipayController { @Autowired private AlipayService alipayService; @Value("${alipay.alipay-public-key}") private String alipayPublicKey; @Value("${alipay.charset}") private String charset; @Value("${alipay.sign-type}") private String signType; /** * 发起支付 */ @PostMapping("/pay") public void pay(@RequestBody AlipayService.AlipayOrder orderDTO, HttpServletResponse response) throws Exception { AlipayService.AlipayOrder order = new AlipayService.AlipayOrder( orderDTO.getOutTradeNo(), orderDTO.getTotalAmount(), orderDTO.getSubject(), orderDTO.getBody() ); String form = alipayService.pagePay(order); // 直接将表单输出到浏览器 response.setContentType("text/html;charset=UTF-8"); response.getWriter().write(form); response.getWriter().flush(); response.getWriter().close(); } /** * 支付宝异步通知回调 */ @PostMapping("/notify") public String notifyUrl(@RequestParam Map<String, String> params) { try { // 验证签名 boolean signVerified = AlipaySignature.rsaCheckV1( params, alipayPublicKey, charset, signType ); if (!signVerified) { return "failure"; } // 处理业务逻辑 String tradeStatus = params.get("trade_status"); String outTradeNo = params.get("out_trade_no"); String tradeNo = params.get("trade_no"); if ("TRADE_SUCCESS".equals(tradeStatus) || "TRADE_FINISHED".equals(tradeStatus)) { // 更新订单状态为已支付 return "success"; } return "failure"; } catch (Exception e) { return "failure"; } } /** * 支付成功同步回调 */ @GetMapping("/return") public String returnUrl(@RequestParam Map<String, String> params) { // 这里通常显示支付成功页面,实际订单状态以异步通知为准 return "支付成功!订单号:" + params.get("out_trade_no"); } /** * 订单查询 */ @GetMapping("/query") public String queryOrder(String outTradeNo) throws AlipayApiException { AlipayTradeQueryRequest request = new AlipayTradeQueryRequest(); JSONObject bizContent = new JSONObject(); bizContent.put("out_trade_no", outTradeNo); request.setBizContent(bizContent.toString()); return null; } }

支付回调验证工具类

package com.jha.springcloudlearn.controller; import com.alipay.api.AlipayApiException; import com.alipay.api.AlipayClient; import com.alipay.api.internal.util.AlipaySignature; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import java.util.Map; @Component public class AlipayNotifyHandler { @Value("${alipay.alipay-public-key}") private String alipayPublicKey; @Value("${alipay.charset}") private String charset; @Value("${alipay.sign-type}") private String signType; /** * 验证支付宝回调的签名 */ public boolean verifySignature(Map<String, String> params) { try { return AlipaySignature.rsaCheckV1( params, alipayPublicKey, charset, signType ); } catch (AlipayApiException e) { return false; } } }

这样就能接入了支付宝了

3、测试

运行我们的项目,然后使用接口工具进行测试

1、获取表单

得到的出参就是一个form表单,正常来说由前端那边去做接受然后处理,这边我们就自己把他放到html中去做后续支付操作

2、构建html

<!-- 将返回的HTML代码保存为 .html 文件 --> <!DOCTYPE html> <html> <head> <title>支付宝支付</title> </head> <body> <!-- 返回的form表单复制到下面,并运行即可 --> </body> </html>

3、支付流程

打开html之后,出现如下页面

这里扫码支付暂时是不行的,因为我们使用的是沙箱,所以使用账号登录

账号在如下图所示位置

输入账户密码之后,跳转到另一个支付页面

输入支付密码之后,进行确认付款即可

然后就是跳转到成功支付的页面,然后再调用我们的回调函数

这样支付宝就接入成功了,后续可以加入自己个性化的东西,如订单操作等

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/31 17:19:45

情感分享:当代码成为我的第二语言——一位测试工程师的心路历程

在软件测试的世界里&#xff0c;我们常常被定义为“质量守门人”、“Bug猎人”&#xff0c;但鲜少有人关注我们与代码之间建立的那份深刻而复杂的情感连接。本文从一个资深软件测试工程师的视角出发&#xff0c;探讨代码如何超越工具属性&#xff0c;逐渐成为我们思维、表达甚至…

作者头像 李华
网站建设 2026/3/11 6:51:27

ssm204旅游景点线路网站

目录SSM204旅游景点线路网站摘要开发技术源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;SSM204旅游景点线路网站摘要 SSM204旅游景点线路网站是基于SSM&#xff08;SpringSpringMVCMyBatis&#xff09;框架开发的旅游信息管理平台&…

作者头像 李华
网站建设 2026/3/21 5:05:45

SSM207办公OA考勤请假健康设备系统

目录SSM207办公OA考勤请假健康设备系统摘要开发技术源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;SSM207办公OA考勤请假健康设备系统摘要 SSM207办公OA系统是一款基于SSM&#xff08;SpringSpringMVCMyBatis&#xff09;框架开发的综…

作者头像 李华
网站建设 2026/3/19 15:28:07

SSM221的大手海恩企业宣传网站vue

目录SSM221大手海恩企业宣传网站Vue摘要开发技术源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;SSM221大手海恩企业宣传网站Vue摘要 SSM221大手海恩企业宣传网站基于Vue.js框架开发&#xff0c;采用现代化的前端技术栈&#xff0c;旨在…

作者头像 李华
网站建设 2026/3/27 8:40:10

SSM235的动漫评论网站vue

目录SSM235动漫评论网站Vue摘要开发技术源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;SSM235动漫评论网站Vue摘要 SSM235是一个基于Vue.js开发的动漫评论网站&#xff0c;专注于为用户提供高质量的动漫内容讨论平台。该网站采用现代化…

作者头像 李华
网站建设 2026/3/10 10:41:19

救命神器9个AI论文软件,专科生搞定毕业论文+格式规范!

救命神器9个AI论文软件&#xff0c;专科生搞定毕业论文格式规范&#xff01; 专科生的毕业论文救星&#xff0c;AI工具如何帮你轻松过关&#xff1f; 对于许多专科生来说&#xff0c;毕业论文不仅是学术能力的考验&#xff0c;更是时间与精力的巨大挑战。尤其是在面对格式规范、…

作者头像 李华