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

发布时间:2026/7/15 10:12:31

SpringBoot 整合支付宝沙箱支付——从接入到回调
支付是电商系统的核心功能。接入支付宝需要企业资质但支付宝提供了沙箱环境——模拟真实支付流程不需要真实商户号适合开发测试和学习。一、沙箱环境准备1. 登录开放平台打开 open.alipay.com → 控制台 → 沙箱应用2. 获取配置参数APP_ID: 9021000122691234沙箱专用 应用私钥: 生成的 RSA2 私钥 支付宝公钥: 生成的 RSA2 公钥 服务器异步通知地址: http://你的地址/pay/notify3. 沙箱账号沙箱环境提供测试买家账号买家账号: rixwby5818sandbox.com 登录密码: 111111 支付密码: 111111二、SpringBoot 集成1. 引入依赖dependencygroupIdcom.alipay.sdk/groupIdartifactIdalipay-sdk-java/artifactIdversion4.38.200.ALL/version/dependency2. 配置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.do3. 配置类ConfigurationConfigurationProperties(prefixalipay)DatapublicclassAlipayConfig{privateStringappId;privateStringappPrivateKey;privateStringalipayPublicKey;privateStringnotifyUrl;privateStringreturnUrl;privateStringgatewayUrl;BeanpublicAlipayClientalipayClient(){returnnewDefaultAlipayClient(gatewayUrl,appId,appPrivateKey,json,utf-8,alipayPublicKey,RSA2);}}三、统一下单接口ServicepublicclassAlipayService{AutowiredprivateAlipayClientalipayClient;AutowiredprivateAlipayConfigalipayConfig;/** * 创建支付订单返回支付页面表单 */publicStringcreatePay(StringorderNo,BigDecimalamount,Stringsubject){AlipayTradePagePayRequestrequestnewAlipayTradePagePayRequest();// 同步回调地址用户支付完成后跳转request.setReturnUrl(alipayConfig.getReturnUrl());// 异步回调地址支付宝服务器通知request.setNotifyUrl(alipayConfig.getNotifyUrl());JSONObjectbiznewJSONObject();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{AlipayTradePagePayResponseresponsealipayClient.pageExecute(request);if(response.isSuccess()){returnresponse.getBody();// 返回 HTML 表单}}catch(AlipayApiExceptione){thrownewRuntimeException(支付宝下单失败,e);}returnnull;}}四、ControllerRestControllerRequestMapping(/pay)publicclassPayController{AutowiredprivateAlipayServicealipayService;/** * 发起支付 */PostMapping(/create)publicResultVOStringcreatePay(RequestBodyPayDTOdto){// 生成订单号StringorderNoORDIdUtil.simpleUUID().toUpperCase();StringformalipayService.createPay(orderNo,dto.getAmount(),dto.getSubject());returnResultVO.success(form);}/** * 同步回调用户支付完成后跳转到此页面 */GetMapping(/return)publicStringreturnUrl(HttpServletRequestrequest){// 获取支付宝返回的参数MapString,StringparamsgetParamsFromRequest(request);try{// 验签AlipaySignature.rsaCheckV1(params,alipayConfig.getAlipayPublicKey(),utf-8,RSA2);StringorderNoparams.get(out_trade_no);StringtradeNoparams.get(trade_no);return支付成功订单号: orderNo;}catch(AlipayApiExceptione){return验签失败;}}/** * 异步回调支付宝服务器通知必须返回 success */PostMapping(/notify)publicStringnotifyUrl(HttpServletRequestrequest){MapString,StringparamsgetParamsFromRequest(request);try{booleansignVerifiedAlipaySignature.rsaCheckV1(params,alipayConfig.getAlipayPublicKey(),utf-8,RSA2);if(signVerified){StringorderNoparams.get(out_trade_no);StringtradeNoparams.get(trade_no);StringtradeStatusparams.get(trade_status);// 支付成功if(TRADE_SUCCESS.equals(tradeStatus)){// 更新订单状态、归还库存等业务逻辑updateOrderStatus(orderNo,tradeNo);}returnsuccess;// 必须返回 success否则支付宝会重复通知}}catch(AlipayApiExceptione){e.printStackTrace();}returnfail;}privateMapString,StringgetParamsFromRequest(HttpServletRequestrequest){MapString,StringparamsnewHashMap();MapString,String[]requestParamsrequest.getParameterMap();for(Stringname:requestParams.keySet()){params.put(name,request.getParameter(name));}returnparams;}}五、秒杀系统集成支付支付完成后更新订单状态并归还库存ServicepublicclassPayService{AutowiredprivateOrderServiceorderService;AutowiredprivateProductServiceproductService;/** * 支付成功回调处理 */TransactionalpublicvoidhandlePaySuccess(StringorderNo,StringtradeNo){// 1. 查询订单SeckillOrderorderorderService.lambdaQuery().eq(SeckillOrder::getOrderNo,orderNo).one();if(ordernull||order.getStatus()!0){return;// 订单不存在或已处理}// 2. 更新订单状态为已支付order.setStatus(1);order.setPayTime(LocalDateTime.now());order.setTradeNo(tradeNo);orderService.updateById(order);// 3. 记录支付日志log.info(支付成功: 订单{}, 支付宝交易号{},orderNo,tradeNo);}}六、前端调用buttononclickpay()支付宝支付/buttonscriptasyncfunctionpay(){constrespawaitfetch(/pay/create,{method:POST,headers:{Content-Type:application/json},body:JSON.stringify({amount:99.99,subject:秒杀商品 - iPhone 15})});constresultawaitresp.json();if(result.code200){// 把返回的 HTML 表单写到页面并自动提交document.body.innerHTMLresult.data;document.forms[0].submit();// 自动跳转到支付宝}}/script七、注意事项异步通知必须返回 “success”全小写否则支付宝会重复通知 8 次验签必不可少防止伪造回调幂等处理——支付宝通知可能重复判断订单状态防止重复更新沙箱金额随便填不会真实扣款上生产环境只需把gateway-url换成生产地址其他代码不变 觉得有用的话点赞 关注【张老师技术栈】吧每周更新 Java/Python/爬虫 实战干货不让你白来。

相关新闻

Unity MyFramework:框架里的代码简化技巧(三)

Unity MyFramework:框架里的代码简化技巧(三)

2026/7/9 2:24:08

前两篇写了 MyFramework 里一些常用的代码简化技巧。 这一篇继续写第三组。 不过这次只写真正能让调用侧代码变短的东西。 也就是一眼能看到: 原本要写几行,现在一行就能表达清楚。 这类工具不是复杂系统。 它们更多是项目长期开发中沉淀出来的小函…

英雄联盟Akari助手:5个核心功能让你的游戏体验提升300%

英雄联盟Akari助手:5个核心功能让你的游戏体验提升300%

2026/7/8 13:33:42

英雄联盟Akari助手:5个核心功能让你的游戏体验提升300% 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 还在为英雄联盟中繁琐的配置…

告别漫画加载烦恼:用哔咔漫画下载器打造个人离线图书馆

告别漫画加载烦恼:用哔咔漫画下载器打造个人离线图书馆

2026/7/8 23:47:45

告别漫画加载烦恼:用哔咔漫画下载器打造个人离线图书馆 【免费下载链接】picacomic-downloader 哔咔漫画 picacomic pica漫画 bika漫画 PicACG 多线程下载器,带图形界面 带收藏夹,已打包exe 下载速度飞快 项目地址: https://gitcode.com/gh…

2小时掌握Pandas数据分析:从数据处理到可视化实战

2小时掌握Pandas数据分析:从数据处理到可视化实战

2026/7/15 10:08:49

在日常数据处理工作中,你是否遇到过这样的困扰:Excel处理大量数据时卡顿严重,SQL查询结果需要进一步分析时操作繁琐,或者需要从多个数据源整合信息时手动操作效率低下?这些问题都可以通过Python的Pandas库得到完美解决…

嵌入式没有 FPU 怎么算小数?用“分和元“讲透定点数(用分和元讲透(附代码))

嵌入式没有 FPU 怎么算小数?用“分和元“讲透定点数(用分和元讲透(附代码))

2026/7/15 10:08:49

一句话: Cortex-M3 没有硬件浮点,float 算一次几十条指令。定点数用整数存小数——像用"分"代替"元"——加减直接算,乘法多一步移位。3 条指令干完 float 几十条指令的活。适合谁读:适合嵌入式开发者、单片机初学者及遇到…

设计状态机时,先画转换条件,再画状态

设计状态机时,先画转换条件,再画状态

2026/7/15 10:08:49

一句话: 很多人设计状态机先枚举"有哪些状态"再想"怎么转换",容易漏掉转换路径。反过来:先画条件矩阵——每个条件组合下应该发生什么——状态自然浮现。适合谁读:适合嵌入式开发者、单片机初学者及遇到类似问题的工程师…

改完Keil工程文件被缓存覆盖?——uvprojx编辑的进阶四坑

改完Keil工程文件被缓存覆盖?——uvprojx编辑的进阶四坑

2026/7/15 10:08:49

一句话: 上一篇《Keil工程XML编辑5次失败》讲了基本流程。本文进阶——Perl 静默失败的根因、Keil 缓存回写的时间点、uvoptx 里有 uvprojx 没有的东西、sed 一刀切误伤活跃代码。如果你不止删文件,还要批量改工程配置,这四条会帮你少踩一轮坑。 适合谁读…

KAN网络:新一代可解释神经网络架构解析

KAN网络:新一代可解释神经网络架构解析

2026/7/15 10:08:49

1. KAN网络是什么?为什么它能引发热议?KAN(Kolmogorov–Arnold Networks)是2024年由MIT、加州理工等机构提出的全新神经网络架构。它的核心创新点在于对传统MLP(多层感知器)做了一个看似简单却影响深远的改…

XHRefreshControl性能优化技巧:让你的iOS应用流畅如丝

XHRefreshControl性能优化技巧:让你的iOS应用流畅如丝

2026/7/15 9:58:49

XHRefreshControl性能优化技巧:让你的iOS应用流畅如丝 【免费下载链接】XHRefreshControl XHRefreshControl 是一款高扩展性、低耦合度的下拉刷新、上提加载更多的组件。 项目地址: https://gitcode.com/gh_mirrors/xh/XHRefreshControl XHRefreshControl是一…

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

2026/7/14 10:03:09

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator XUnity.AutoTranslator作为Unity游戏社区中最成熟的文本翻译解决方…

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

2026/7/13 20:43:19

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持 【免费下载链接】raspberrypi-kernel It provides openEuler kernel source for Raspberry Pi 项目地址: https://gitcode.com/openeuler/raspberrypi-kernel 前往项目官网免费下载&…

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

2026/7/15 0:26:43

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧 【免费下载链接】integration-test The repo contains test suits for system integration test 项目地址: https://gitcode.com/openeuler/integration-test 前往项目官网免费下载:…

【LINUX】驱动

【LINUX】驱动

2026/7/15 0:08:14

【LINUX驱动】【字符设备】【中断】【Platform】【网课 设备树】【GPIO】【PINCTRL】【INPUT】【IIC】【SPI】【网络驱动】【屏幕驱动】【一 设备树】【二 内核模块编译】【三 基本驱动框架】【四 Platform总线设备驱动框架】【五 驱动子系统】【六 综合】

【1982-2026】全国高精度建筑轮廓|村级精度|SHP矢量

【1982-2026】全国高精度建筑轮廓|村级精度|SHP矢量

2026/7/15 0:08:14

🔍 数据简介 本次分享1982-2026年全国村级精度建筑轮廓矢量数据,覆盖全国各省市区县,到村级别精细,为2026年最新实时采集成果,非网传仅60/77个城市的老旧数据。 数据含带高度/不带高度双版本,单体建筑边界精…

【1975-2026】全国水系水路数据|河流/水库/运河|SHP矢量

【1975-2026】全国水系水路数据|河流/水库/运河|SHP矢量

2026/7/15 0:08:14

🔍 数据简介 本次分享1975-2026年全国高精度水系水路矢量数据,覆盖全国全域,包含河流、水系、水库、运河、湿地、冰川、沟渠等全类别水文要素。 数据集包含双层矢量图层,字段分类清晰、要素齐全,支持2013-2026逐年完整…