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,一经查实,立即删除!

相关文章

Ceph 中Crush 算法的理解

Crush&#xff08;Controlled Replication Under Scalable Hashing&#xff09;算法是一种可扩展的、分布式的副本数据放置算法&#xff0c;广泛用于存储系统中&#xff0c;特别是Ceph分布式存储系统中。以下是对CRUSH算法的详细解释&#xff1a; 一、算法原理 CRUSH算法根据…

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

目录 一、实验内容 二、具体内容 (在实验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…

Playwright 自动化测试与爬虫快速入门指南

1. 环境配置 # 安装 Playwright pip install playwright# 安装浏览器驱动 playwright install2. 基础用法 2.1 基本结构 from playwright.sync_api import sync_playwrightdef main():with sync_playwright() as p:# 启动浏览器&#xff0c;headlessFalse 可以看到浏览器界面…

等保测评中的常见问题总结

在信息安全等级保护测评&#xff08;等保测评&#xff09;过程中&#xff0c;企业常遇到的主要问题及其改进建议如下&#xff1a; ### 1. **安全责任不清** - **问题**&#xff1a;对于等保测评中涉及的安全责任&#xff0c;尤其是在使用云服务或外包服务时&#xff0c;企业…

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

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

LeetCode【0018】四数之和

本文目录 1 中文题目2 求解方法&#xff1a;双指针两层循环2.1 方法思路2.2 Python代码2.3 复杂度分析 3 题目总结 1 中文题目 给一个由 n n n 个整数组成的数组 n u m s nums nums &#xff0c;和一个目标值 t a r g e t target target 。请找出并返回满足下述全部条件且不…

扫雷游戏代码分享(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;为居民提供更为便捷、高效、安全…

Nginx 的 proxy_pass 使用简介

proxy_pass 是 Nginx 中一个非常重要的指令&#xff0c;用于将请求代理到后端服务器。本文将详细介绍 proxy_pass 的基本用法、配置示例以及一些高级用法。 1. 基本概念 1.1 proxy_pass 概述 proxy_pass 指令用于将请求转发到后端服务器。它可以用于 HTTP 和 Stream 模块&am…

在 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标签…

LeetCode34:在排序数组中查找元素第一个和最后一个位置

原题地址&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你一个按照非递减顺序排列的整数数组 nums&#xff0c;和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target&#xff0c;返回 [-1, -1]。 你必须…

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

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

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

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

苍穹外卖 数据可视化

将营业额、用户数据、订单数据、商品销量top10数据全部使用Apache Echarts可视化&#xff0c;展现在前端&#xff0c;后端只需要按照需要的格式&#xff0c;为前端提供数据即可。 ReportController package com.sky.controller.admin;import com.sky.result.Result; import co…

漏洞与攻击技术详解

漏洞与攻击技术是网络安全领域中的重要议题&#xff0c;它们之间存在着密切的关系。以下是对漏洞与攻击技术的详细分析&#xff1a; 一、漏洞的定义与分类漏洞是指在硬件、软件、协议的具体实现或系统安全策略上存在的缺陷&#xff0c;这些缺陷使得攻击者能够在未授权的情况下访…