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

SpringBoot 整合支付宝沙箱支付——从接入到回调

支付是电商系统的核心功能。接入支付宝需要企业资质,但支付宝提供了沙箱环境——模拟真实支付流程,不需要真实商户号,适合开发测试和学习。

一、沙箱环境准备

1. 登录开放平台

打开 open.alipay.com → 控制台 → 沙箱应用

2. 获取配置参数

APP_ID: 9021000122691234(沙箱专用) 应用私钥: 生成的 RSA2 私钥 支付宝公钥: 生成的 RSA2 公钥 服务器异步通知地址: http://你的地址/pay/notify

3. 沙箱账号

沙箱环境提供测试买家账号:

买家账号: rixwby5818@sandbox.com 登录密码: 111111 支付密码: 111111

二、SpringBoot 集成

1. 引入依赖

<dependency><groupId>com.alipay.sdk</groupId><artifactId>alipay-sdk-java</artifactId><version>4.38.200.ALL</version></dependency>

2. 配置

alipay:app-id:9021000122691234app-private-key:|-----BEGIN RSA PRIVATE KEY----- MIIEowIBAAKCAQ... (你的应用私钥,不要写在配置里!建议用Jasypt加密) -----END RSA PRIVATE KEY-----alipay-public-key:|-----BEGIN PUBLIC KEY----- MIIBIjANBgk... (支付宝公钥) -----END PUBLIC KEY-----notify-url:http://你的公网IP/pay/notifyreturn-url:http://localhost:9090/pay/returngateway-url:https://openapi-sandbox.dl.alipaydev.com/gateway.do

3. 配置类

@Configuration@ConfigurationProperties(prefix="alipay")@DatapublicclassAlipayConfig{privateStringappId;privateStringappPrivateKey;privateStringalipayPublicKey;privateStringnotifyUrl;privateStringreturnUrl;privateStringgatewayUrl;@BeanpublicAlipayClientalipayClient(){returnnewDefaultAlipayClient(gatewayUrl,appId,appPrivateKey,"json","utf-8",alipayPublicKey,"RSA2");}}

三、统一下单接口

@ServicepublicclassAlipayService{@AutowiredprivateAlipayClientalipayClient;@AutowiredprivateAlipayConfigalipayConfig;/** * 创建支付订单,返回支付页面表单 */publicStringcreatePay(StringorderNo,BigDecimalamount,Stringsubject){AlipayTradePagePayRequestrequest=newAlipayTradePagePayRequest();// 同步回调地址(用户支付完成后跳转)request.setReturnUrl(alipayConfig.getReturnUrl());// 异步回调地址(支付宝服务器通知)request.setNotifyUrl(alipayConfig.getNotifyUrl());JSONObjectbiz=newJSONObject();biz.put("out_trade_no",orderNo);// 商户订单号biz.put("total_amount",amount.toString());// 支付金额biz.put("subject",subject);// 订单标题biz.put("product_code","FAST_INSTANT_TRADE_PAY");// 电脑网站支付request.setBizContent(biz.toJSONString());try{AlipayTradePagePayResponseresponse=alipayClient.pageExecute(request);if(response.isSuccess()){returnresponse.getBody();// 返回 HTML 表单}}catch(AlipayApiExceptione){thrownewRuntimeException("支付宝下单失败",e);}returnnull;}}

四、Controller

@RestController@RequestMapping("/pay")publicclassPayController{@AutowiredprivateAlipayServicealipayService;/** * 发起支付 */@PostMapping("/create")publicResultVO<String>createPay(@RequestBodyPayDTOdto){// 生成订单号StringorderNo="ORD"+IdUtil.simpleUUID().toUpperCase();Stringform=alipayService.createPay(orderNo,dto.getAmount(),dto.getSubject());returnResultVO.success(form);}/** * 同步回调(用户支付完成后跳转到此页面) */@GetMapping("/return")publicStringreturnUrl(HttpServletRequestrequest){// 获取支付宝返回的参数Map<String,String>params=getParamsFromRequest(request);try{// 验签AlipaySignature.rsaCheckV1(params,alipayConfig.getAlipayPublicKey(),"utf-8","RSA2");StringorderNo=params.get("out_trade_no");StringtradeNo=params.get("trade_no");return"支付成功!订单号: "+orderNo;}catch(AlipayApiExceptione){return"验签失败";}}/** * 异步回调(支付宝服务器通知,必须返回 success) */@PostMapping("/notify")publicStringnotifyUrl(HttpServletRequestrequest){Map<String,String>params=getParamsFromRequest(request);try{booleansignVerified=AlipaySignature.rsaCheckV1(params,alipayConfig.getAlipayPublicKey(),"utf-8","RSA2");if(signVerified){StringorderNo=params.get("out_trade_no");StringtradeNo=params.get("trade_no");StringtradeStatus=params.get("trade_status");// 支付成功if("TRADE_SUCCESS".equals(tradeStatus)){// 更新订单状态、归还库存等业务逻辑updateOrderStatus(orderNo,tradeNo);}return"success";// 必须返回 success,否则支付宝会重复通知}}catch(AlipayApiExceptione){e.printStackTrace();}return"fail";}privateMap<String,String>getParamsFromRequest(HttpServletRequestrequest){Map<String,String>params=newHashMap<>();Map<String,String[]>requestParams=request.getParameterMap();for(Stringname:requestParams.keySet()){params.put(name,request.getParameter(name));}returnparams;}}

五、秒杀系统集成支付

支付完成后更新订单状态并归还库存:

@ServicepublicclassPayService{@AutowiredprivateOrderServiceorderService;@AutowiredprivateProductServiceproductService;/** * 支付成功回调处理 */@TransactionalpublicvoidhandlePaySuccess(StringorderNo,StringtradeNo){// 1. 查询订单SeckillOrderorder=orderService.lambdaQuery().eq(SeckillOrder::getOrderNo,orderNo).one();if(order==null||order.getStatus()!=0){return;// 订单不存在或已处理}// 2. 更新订单状态为已支付order.setStatus(1);order.setPayTime(LocalDateTime.now());order.setTradeNo(tradeNo);orderService.updateById(order);// 3. 记录支付日志log.info("支付成功: 订单={}, 支付宝交易号={}",orderNo,tradeNo);}}

六、前端调用

<buttononclick="pay()">支付宝支付</button><script>asyncfunctionpay(){constresp=awaitfetch('/pay/create',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({amount:99.99,subject:'秒杀商品 - iPhone 15'})});constresult=awaitresp.json();if(result.code===200){// 把返回的 HTML 表单写到页面并自动提交document.body.innerHTML=result.data;document.forms[0].submit();// 自动跳转到支付宝}}</script>

七、注意事项

  1. 异步通知必须返回 “success”(全小写),否则支付宝会重复通知 8 次
  2. 验签必不可少,防止伪造回调
  3. 幂等处理——支付宝通知可能重复,判断订单状态防止重复更新
  4. 沙箱金额随便填,不会真实扣款
  5. 上生产环境只需把gateway-url换成生产地址,其他代码不变

💡 觉得有用的话,点赞 + 关注【张老师技术栈】吧!每周更新 Java/Python/爬虫 实战干货,不让你白来。

http://www.gsyq.cn/news/1646882.html

相关文章:

  • Codux:一个开源的多项目 AI 终端,Codex、Claude Code 按项目统一管理——聊聊设计思路
  • 基于YOLOv8的斗地主手牌检测实战指南
  • Spring Boot项目JUnit 5与Spring-test版本冲突诊断与解决方案
  • Innovus 23.1 电源规划实战:5步完成多电压域 Power Mesh 设计(附 IR Drop 分析)
  • 用Python开发一个简单的Web应用:步骤详解
  • RGB-D 抓取检测实战:基于 YOLOv8 与 FastSAM 的 3D 物体分割 Pipeline 实现
  • 从零搭建SpringBoot项目,这些配置细节值得留意
  • 测试转大模型:AI 测试工程师的能力跃迁,把学习路线落到项目证据
  • WorkshopDL终极指南:跨平台畅玩Steam创意工坊模组的完整解决方案
  • OFDM信道估计实战:LS与LMMSE算法在5G NR导频下的MSE对比
  • ISP CCM 色彩校正矩阵实战:3x3矩阵参数解析与24色卡ΔE优化
  • Agent 核心原理:工具调用记忆与任务规划,用业务场景检验技术取舍
  • PyTorch 图像识别数据工程:3步自动化爬取与清洗,构建专属数据集
  • PowerToys Text Extractor:解锁屏幕文字的智能钥匙,让每一段文字都触手可及
  • 舵机 PD 控制参数整定指南:从 P 项振荡到 D 项抑制的 4 步调参法
  • 工业镜头选型实战:5步公式从视野/靶面/物距计算焦距(附Excel工具)
  • RMFD 口罩人脸数据集实战:基于 ArcFace 的 95% 识别率模型复现指南
  • 心脏冠脉VR重建实战:基于3D Slicer的CTA数据分割与优势型可视化
  • YOLOv8 训练自定义 COCO 数据集:从 0 到 1 的 5 个关键步骤与性能调优
  • AI新纪元来了:普通人必须懂的3个真相
  • 如何3分钟搞定全网热门资源?专业级多平台下载神器实战指南
  • Agent 观测性:一次失败要能追到每个工具调用
  • EldenRingSaveCopier:专业级艾尔登法环存档管理与迁移解决方案
  • OpenCV视觉学习:几何变换与轮廓检测实战
  • 2026永久免费去水印软件推荐,电脑手机在线免费工具教程
  • 大模型微调实战:从LoRA/QLoRA原理到完整落地指南
  • 晶圆接受测试WAT与工程测试:数据驱动工艺优化
  • Copy-Paste 数据增强实战:VOC格式语义分割数据集扩增 5 倍(附完整代码)
  • OpenCV 4.8.0 形态学操作实战:3种核形状与5种算子对二值图处理效果对比
  • 2026年AI大模型学习路线与实战指南