SpringBoot沙箱环境支付宝支付

1、创建应用
登录支付宝开放平台
支付宝开放平台网址 :支付宝 (alipay.com)

支付宝开放平台

下拉最下边

2、获取appId、支付宝公钥、应用私钥

3、开始创建spring boot项目

#支付宝支付配置
alipay:#你的APPIDappId: 902************#你的应用私钥privateKey: MIIE***********#支付宝公钥publicKey:  MIIB***********#生产环境网关地址#serverUrl: https://openapi.alipay.com/gateway.do#沙箱环境网关地址serverUrl: https://openapi-sandbox.dl.alipaydev.com/gateway.do#生产环境域domain: gw.open.alipay.com#回调urlnoticeUrl: https://ie2204wi1077.vicp.fun


4、导入pom依赖

<dependency><groupId>com.alipay.sdk</groupId><artifactId>alipay-sdk-java</artifactId><version>4.39.134.ALL</version></dependency><!-- https://mvnrepository.com/artifact/com.alipay.sdk/alipay-easysdk --><dependency><groupId>com.alipay.sdk</groupId><artifactId>alipay-easysdk</artifactId><version>2.2.2</version></dependency><dependency><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-core</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><scope>provided</scope></dependency>


5、创建Controller

准备好密钥

import com.alipay.api.AlipayApiException;
import com.pig4cloud.pigx.alipay.util.PayVo;
import com.pig4cloud.pigx.alipay.service.AliPayService;
import com.pig4cloud.pigx.common.core.util.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;@Slf4j
@RequestMapping("/alipay")
@RestController
public class AliPayController {@Resourceprivate AliPayService aliPayService;@RequestMapping("/pay")public R paymoney(@RequestBody PayVo payVo) throws AlipayApiException {return R.ok(aliPayService.pay(payVo));}@PostMapping("/notify")  // 注意这里必须是POST接口public R notify(HttpServletRequest request) throws Exception {return R.ok(aliPayService.notify(request));}}


6、创建一个实体类来接受前端传递过来的参数
这是我的


import lombok.Data;@Data
public class PayVo {//订单idprivate String orderId;//会诊idprivate String conId;//支付金额private String money;//支付标题private String title;//成功返回页面private String url;}

7、AliPayService.java

import com.alipay.api.AlipayApiException;
import com.baomidou.mybatisplus.extension.service.IService;
import com.pig4cloud.pigx.alipay.util.PayVo;
import com.pig4cloud.pigx.ybiot.entity.MzRecipe;
import com.pig4cloud.pigx.ybiot.entity.RecipeDTO;
import org.springframework.web.bind.annotation.RequestBody;import javax.servlet.http.HttpServletRequest;/*** 支付宝支付接口** @author gwh* @date 2024-11-11 09:08:14*/
public interface AliPayService extends IService<MzRecipe> {/*** 支付接口* @param payVo* @return*/RecipeDTO pay(@RequestBody PayVo payVo) throws AlipayApiException;RecipeDTO notify(HttpServletRequest request) throws Exception;}

8、AliPayServiceImpl.java


import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.AlipayConfig;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradeWapPayModel;
import com.alipay.api.request.AlipayTradeWapPayRequest;
import com.alipay.api.response.AlipayTradeWapPayResponse;
import com.alipay.easysdk.factory.Factory;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.pig4cloud.pigx.alipay.util.AliPayConfig;
import com.pig4cloud.pigx.alipay.util.PayVo;
import com.pig4cloud.pigx.alipay.service.AliPayService;
import com.pig4cloud.pigx.ybiot.entity.MzRecipe;
import com.pig4cloud.pigx.ybiot.entity.RecipeDTO;
import com.pig4cloud.pigx.ybiot.mapper.MzRecipeMapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;/*** 支付宝支付实现** @author gwh* @date 2024-11-11 09:39:14*/
@Slf4j
@Service
@RequiredArgsConstructor
@Transactional(rollbackFor = Exception.class)
public class AliPayServiceImpl extends ServiceImpl<MzRecipeMapper, MzRecipe> implements AliPayService {@Autowiredprivate AliPayConfig aliPayConfig;@Overridepublic RecipeDTO pay(PayVo payVo) throws AlipayApiException {RecipeDTO resultDTO = new RecipeDTO();System.out.println(payVo);String appId = aliPayConfig.getAppId();// AppIdString privateKey = aliPayConfig.getPrivateKey(); //必填 自己的应用私钥,即PKCS8格式RSA2私钥String alipayPublicKey = aliPayConfig.getPublicKey();  //必填 自己的支付宝公钥String serverUrl = aliPayConfig.getServerUrl(); //必填  serverUrlString noticeUrl = aliPayConfig.getServerUrl(); //回调urlAlipayConfig alipayConfig = new AlipayConfig();alipayConfig.setServerUrl(serverUrl); //沙箱alipayConfig.setAppId(appId);   //必填 自己的AppIdalipayConfig.setPrivateKey(privateKey);alipayConfig.setFormat("json");alipayConfig.setAlipayPublicKey(alipayPublicKey);alipayConfig.setCharset("UTF-8");alipayConfig.setSignType("RSA2");AlipayClient alipayClient = new DefaultAlipayClient(alipayConfig);AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest();request.setNotifyUrl(noticeUrl);  //自己的内网地址, 这个是我的自己可以下载路由下自行配置request.setReturnUrl(payVo.getUrl());  //成功后跳转的地址AlipayTradeWapPayModel model = new AlipayTradeWapPayModel();model.setOutTradeNo(payVo.getOrderId()); //传过来的订单号, 这个我写的 自己写一个默认的测试一下model.setTotalAmount(payVo.getMoney()); //支付金额, 这个我写的 自己写一个默认的测试一下model.setSubject(payVo.getTitle());  //支付标题, 这个我写的 自己写一个默认的测试一下model.setProductCode("QUICK_WAP_WAY");model.setSellerId("2088721041615706");request.setBizModel(model);AlipayTradeWapPayResponse response = alipayClient.pageExecute(request, "POST");// 如果需要返回GET请求,请使用// AlipayTradeWapPayResponse response = alipayClient.pageExecute(request, "GET");String pageRedirectionData = response.getBody();System.out.println(pageRedirectionData);if (response.isSuccess()) {System.out.println("调用成功");} else {System.out.println("调用失败");// sdk版本是"4.38.0.ALL"及以上,可以参考下面的示例获取诊断链接// String diagnosisUrl = DiagnosisUtils.getDiagnosisUrl(response);// System.out.println(diagnosisUrl);}return resultDTO;}@Overridepublic RecipeDTO notify(HttpServletRequest request) throws Exception {RecipeDTO resultDTO = new RecipeDTO();if (request.getParameter("trade_status").equals("TRADE_SUCCESS")) {System.out.println("=========支付宝异步回调========");Map<String, String> params = new HashMap<>();Map<String, String[]> requestParams = request.getParameterMap();for (String name : requestParams.keySet()) {params.put(name, request.getParameter(name));// System.out.println(name + " = " + request.getParameter(name));}String tradeNo = params.get("out_trade_no");String gmtPayment = params.get("gmt_payment");String alipayTradeNo = params.get("trade_no");// 支付宝验签if (Factory.Payment.Common().verifyNotify(params)) {// 验签通过System.out.println("交易名称: " + params.get("subject"));System.out.println("交易状态: " + params.get("trade_status"));System.out.println("支付宝交易凭证号: " + params.get("trade_no"));System.out.println("商户订单号: " + params.get("out_trade_no"));System.out.println("交易金额: " + params.get("total_amount"));System.out.println("买家在支付宝唯一id: " + params.get("buyer_id"));System.out.println("买家付款时间: " + params.get("gmt_payment"));System.out.println("买家付款金额: " + params.get("buyer_pay_amount"));// 更新订单状态}}return resultDTO;}
}

9、付款页面

10、付款成功页面
这样就支付完成了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/60263.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机图形学 实验二 三维模型读取与控制

目录 一、实验内容 二、具体内容 (在实验2.3的基础上进行修改) 1、OFF格式三维模型文件的读取 2、三维模型的旋转动画 3、键盘鼠标的交互 4、模型的修改 三、代码 一、实验内容 读取实验提供的off格式三维模型&#xff0c;并对其赋色。利用鼠标和键盘的交互&#xff0…

FastGPT部署通义千问Qwen和智谱glm模型|OneAPI配置免费的第三方API

继这篇博客之后 从零开始FastGPT本地部署|Windows 有同学问&#xff0c;不想在多个平台申请API-Key&#xff0c;不好管理且要付费&#xff0c;有木有白嫖方案呀&#xff1f; 答&#xff1a;有啊。用硅基流动。 注册方法看这篇 【1024送福利】硅基流动送2000万token啦&#xff0…

SSE (Server-Sent Events) 服务器实时推送详解

Server-Sent Events 一、什么是 SSE ?二、SSE 的工作原理三、SSE 的基本配置1.HTTP 请求和响应头设置2.SSE 字段介绍3.SSE 事件数据流示例 四、SseEmitter 的基本配置1.SseEmitter 介绍及用法2.使用 SseEmitter 示例11)编写核心 SSE Client2)编写 Controller3)前端接收与处理 …

UE4/5 编译报错 MSB3073

UE4/5 编译报错 MSB3073 目录 UE4/5 编译报错 MSB3073 一、引言 二、方法1 三、方法2 四、方法3 一、引言 我们下载源代码之后编译时&#xff0c;可能会出现以下报错&#xff1a; MSB3073 命令“..\..\Build\BatchFiles\Rebuild.bat -Target"UE4Editor Win64 Devel…

Python学习从0到1 day28 Python 高阶技巧 ⑤ 多线程

若事与愿违&#xff0c;请相信&#xff0c;上天自有安排&#xff0c;允许一切如其所是 —— 24.11.12 一、进程、线程 现代操作系统比如Mac OS X&#xff0c;UNIX&#xff0c;Linux&#xff0c;Windows等&#xff0c;都是支持“多任务”的操作系统。 进程 进程&#xff1a;就…

扫雷游戏代码分享(c基础)

hi , I am 36. 代码来之不易&#x1f44d;&#x1f44d;&#x1f44d; 创建两个.c 一个.h 1&#xff1a;test.c #include"game.h"void game() {//创建数组char mine[ROWS][COLS] { 0 };char show[ROWS][COLS] { 0 };char temp[ROWS][COLS] { 0 };//初始化数…

智慧社区可视化解决方案:科技引领社区服务与管理新篇章

随着社会的发展&#xff0c;智慧社区作为新型城镇化发展目标和社区服务体系建设的重要举措&#xff0c;正逐步改变着我们的生活方式。智慧社区通过综合运用现代科学技术&#xff0c;整合区域资源&#xff0c;提升社区治理和服务水平&#xff0c;为居民提供更为便捷、高效、安全…

在 WPF 中,如何实现数据的双向绑定?

在 WPF 中&#xff0c;数据绑定是一个非常重要的特性&#xff0c;它允许 UI 与数据源之间自动同步。双向绑定是一种常见的绑定方式&#xff0c;当数据源更新时&#xff0c;UI 会自动更新&#xff1b;同样&#xff0c;当 UI 中的元素&#xff08;如文本框&#xff09;发生改变时…

[Docker#4] 镜像仓库 | 部分常用命令

目录 什么是 Docker Registry 镜像仓库生活案例 镜像仓库分类 镜像仓库工作机制 常用的镜像仓库 私有仓库 镜像仓库命令 镜像命令[部分] 容器命令[部分] 什么是 Docker Registry 定义&#xff1a;Docker Registry 负责存储、管理和分发镜像&#xff0c;并提供了登录认…

嵌入式学习-网络高级-Day03

嵌入式学习-网络高级-Day03 基于webserver的工业数据采集 HTTP协议 http简介 http特点 http协议格式 客户端请求数据格式 请求行&#xff1a; 请求头部 空行&#xff1a; 请求体 服务器响应数据格式 webserver源码分析 postman的使用 整体流程分析 任务 html html简介 html标签…

2024年Python最新下载安装教程,附详细图文,持续更新

大家好&#xff0c;我是Java徐师兄&#xff0c;今天为大家带来的是Python3 的下载安装教程&#xff0c;适用于所有 Python3 版本&#xff0c;感兴趣的可以看一下 文章目录 简介一、Python的下载1 网盘下载地址 (下载速度比较快&#xff0c;推荐&#xff09;2 官网下载地址 二、…

原生鸿蒙应用市场:赋能开发者全生命周期服务体验

文章目录 背景自动化检测前移&#xff1a;早发现&#xff0c;早解决技术细节&#xff1a;静态代码分析与兼容性测试应用场景 按需加载&#xff1a;优化性能&#xff0c;提升用户体验技术细节&#xff1a;模块化与懒加载实现应用场景 应用加密&#xff1a;保护应用代码安全&…

kafka面试题解答(四)

5、消费者组和分区数之间的关系是怎样的&#xff1f; 消费者组数小于等于分区数&#xff0c;消费者组内每个消费者负责消费不同分区的数据&#xff0c;一个分区只能由一个组内消费者消费。 6、kafka如何知道哪个消费者消费哪个分区&#xff1f; 生产者把数据发送给各个分区&…

鸿蒙华为商城APP案例

模拟器运行效果如下&#xff1a; 鸿蒙版APP-华为商城-演示视频

C++【STL容器系列(二)】vector的模拟实现

文章目录 1. vector的结构2. vector的默认成员函数2.1构造函数2.1.1 默认构造2.1.2 迭代器构造2.1.3 用n个val初始化构造 2.2 拷贝构造2.3 析构函数2.4 operator 3. vector iterator函数3.1 begin 和 cbegin函数3.2 end() 和 cend()函数 4. vector的小函数4.1 size函数4.2 capa…

Linux开发讲课49--- Linux 启动过程分析

理解运转良好的系统对于处理不可避免的故障是最好的准备。 启动过程非常简单。内核在单核上以单线程和同步状态启动&#xff0c;似乎可以理解。但内核本身是如何启动的呢&#xff1f;initrd&#xff08;initial ramdisk&#xff09; 和引导程序(bootloader)具有哪些功能&#…

vscode中执行git合并操作需要输入合并commit信息,打开的nano小型文本编辑器说明-

1.前提: VScode中的git组件执行任何合并动作的时候需要提交远程合并的commit信息,然后编辑器自动打开的是nano文本编辑器 2.nano编辑器说明: 1.保存文件:按 Ctrl + O,然后按 Enter 来保存文件。 2.退出编辑器:按 Ctrl + X,这会退出 nano。 3.剪切文本:移动光标到要剪…

Java 并发相关集合

文章目录 一、CopyOnWriteArrayList 源码1.1. 概述1.2. 思想1.3. 源码① 数据结构② 初始化③ 添加元素④ 获取元素⑤ 删除元素 二、ArrayBlockingQueue 源码2.1. 概述2.2. 思想2.3. 源码① 数据结构② 初始化③ 阻塞式获取和新增元素④ 非阻塞式获取和新增元素⑤ 指定超时时间…

AutoDL使用简记

AutoDL使用简记 一、前言二、AutoDL显卡配置、价格简介2.1显卡配置及价格2.2计费方式的种类2.3开通会员及优惠 三、AutoDL使用教程3.1选择深度学习架构3.2文件传输3.3运行程序 一、前言 在进行深度学习模型训练时&#xff0c;通常会面临本地显卡显存或者运行速度的不足&#x…

基于STM32智能电流表

采用STM32F103C8T6微控制器为核心&#xff0c;设计了一款精密的电流表。该电流表通过精确采集采样电阻上的分压信号&#xff0c;并进行信号放大处理&#xff0c;随后利用ADC&#xff08;模数转换器&#xff09;高效地捕获放大后的电压信号&#xff0c;通过一系列算法运算&#…