支付宝支付Java+uniapp支付宝小程序
JS:
request.post('/vip/pay', {//这是自己写的java支付接口id: this.vipInfo.id,payWay: 'alipay-mini'}).then((res) => {let success = (res2) => {//前端的支付成功回调函数this.$refs.popup.close();// 支付成功刷新当前页面setTimeout(() => {this.doGetVipInfo(this.vipInfo.id);}, 2500)}let fail = (res) => {//支付失败,进行提示util.showToast(this.$t('pay.fail'))}let payObj = {"provider": "alipay","orderInfo": res.data.tradeNo,success,fail};console.log("支付>>>" + JSON.stringify(payObj));uni.requestPayment(payObj);//uniapp提供的统一支付接口,可以在支付宝小程序内调起支付宝支付界面}).finally(() => {})
Java:
/*** 会员卡支付*/@PostMapping("/pay")@RepeatSubmitpublic R<Object> pay(@RequestBody AppVipPayVo pay) {long tradeId = payTradeService.save(pay.payWay(), pay.getPayAmount(), pay.getVipId(), TradeTypeEnum.VIP.getCode());//创建自己的交易订单if (StrUtil.equals(payWay, PayWayEnum.MIN_ALIPAY.getCode()) || StrUtil.equals(payWay, PayWayEnum.ALIPAY.getCode())) {return aliPayRequest(tradeId, pay.getPayAmount(), pay.payWay(), "https://xxx.xxx.xxx/vip/alipayCallback","会员卡");}return R.fail();}//发起支付宝支付private Object aliPayRequest(Long tradeId, BigDecimal payMoney, String payWay, String notifyUrl, String subject) {AliPayConfig ali = new AliPayConfig();//获取商户的支付配置AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", ali.getAppId(), ali.getPrivateSign(), "json", StandardCharsets.UTF_8.name(), ali.getPublicKey(), ali.getSignType());if (StrUtil.equals(payWay, PayWayEnum.MIN_ALIPAY.getCode())) {//支付宝小程序AlipayTradePayModel bizContent = new AlipayTradePayModel();bizContent.setBuyerOpenId(LoginHelper.getLoginUser().getToken());bizContent.setOutTradeNo(String.valueOf(tradeId));//存入我们自己的流水号bizContent.setTotalAmount(String.valueOf(payMoney));bizContent.setSubject(subject);AlipayTradeCreateRequest aliRequest = new AlipayTradeCreateRequest();aliRequest.setNotifyUrl(notifyUrl);aliRequest.setBizModel(bizContent);try {AlipayTradeCreateResponse response = alipayClient.execute(aliRequest);if (response.isSuccess()) {return response;}throw new ServiceException(response.getSubMsg());} catch (AlipayApiException e) {throw new ServiceException(e.getErrMsg());}}if (StrUtil.equals(payWay, PayWayEnum.ALIPAY.getCode())) {//支付宝AlipayTradeAppPayModel bizContent = new AlipayTradeAppPayModel();bizContent.setOutTradeNo(String.valueOf(tradeId));//存入我们自己的流水号bizContent.setTotalAmount(String.valueOf(payMoney));bizContent.setSubject(subject);AlipayTradeAppPayRequest aliRequest = new AlipayTradeAppPayRequest();aliRequest.setNotifyUrl(notifyUrl);aliRequest.setBizModel(bizContent);try {AlipayTradeAppPayResponse response = alipayClient.sdkExecute(aliRequest);if (response.isSuccess()) {return response.getBody();}throw new ServiceException(response.getSubMsg());} catch (AlipayApiException e) {throw new ServiceException(e.getErrMsg());}}return R.ok();}/*** 回调*/@PostMapping("/alipayCallback")@SaIgnorepublic String alipayCallback(HttpServletRequest request) {Map<String, String> params = ServletUtils.getParamMap(request);StaticLog.info("支付宝支付回调={}", JSONObject.toJSONString(params));String outTradeNo = params.get("out_trade_no");//拿到我们自己的流水号String tradeNo = params.get("trade_no");String tradeStatus = params.get("trade_status");String gmtPayment = params.get("gmt_payment");LambdaQueryWrapper<PayTrade> eq = Wrappers.<PayTrade>lambdaQuery().eq(PayTrade::getId, outTradeNo).isNull(PayTrade::getOutTradeNo).eq(PayTrade::getTradeStatus, TradeStatusEnum.WAIT_PAY.getCode());PayTrade trade = PayTradeMapper.selectOne(eq);if (ObjectUtil.isNull(trade) || !"TRADE_SUCCESS".equals(tradeStatus)) {StaticLog.info("支付信息不存在或支付失败");return "failure";}AliPayConfig ali = new AliPayConfig();//获取商户的支付配置boolean signVerified = AlipaySignature.rsaCheckV1(params, ali.getPublicKey(),StandardCharsets.UTF_8.name(), ali.getSignType());if (!signVerified) {StaticLog.info("验签失败");return "failure";}long orderId = trade.getOrderId();//这个是业务订单ID,也就是VIP表的IDlong payTime = DateUtil.parse(gmtPayment, NORM_DATETIME_FORMATTER).getTime() / 1000;paySuccess(tradeNo, payTime, outTradeNo, orderId, trade.getUserId());return "success";}//支付成功业务逻辑private void paySuccess(String tradeNo, long payTime, String outTradeNo, long orderId, Long userId) {//修改订单状态payTradeMapper.update(null, new LambdaUpdateWrapper<PayTrade>().set(PayTrade::getTradeStatus, TradeStatusEnum.PAY_SUCCESS.getCode()).set(PayTrade::getOutTradeNo, tradeNo).set(PayTrade::getPayTime, payTime).set(PayTrade::getHasNotify, true).eq(PayTrade::getId, outTradeNo));}
pom.xml:
<dependency><groupId>com.alipay.sdk</groupId><artifactId>alipay-sdk-java</artifactId><version>4.39.150.ALL</version></dependency>
相关文章:
支付宝支付Java+uniapp支付宝小程序
JS: request.post(/vip/pay, {//这是自己写的java支付接口id: this.vipInfo.id,payWay: alipay-mini}).then((res) > {let success (res2) > {//前端的支付成功回调函数this.$refs.popup.close();// 支付成功刷新当前页面setTimeout(() > {this.doGetVipI…...

Linux-磁盘优化的几个思路
优化前先看看性能指标 I/O 基准测试 fio(Flexible I/O Tester)正是最常用的文件系统和磁盘 I/O 性能基准测试工具。这类工具非常用,了解即可 应用程序优化 应用程序处于整个 I/O 栈的最上端,它可以通过系统调用,来调…...

【第三版 系统集成项目管理工程师】第15章 组织保障
持续更新。。。。。。。。。。。。。。。 【第三版】第十五章 组织保障 15.1信息和文档管理15.1.1 信息和文档1.信息系统信息-P5462.信息系统文档-P546 15.1.2 信息(文档)管理规则和方法1.信息(文档)编制规范-P5472.信息(文档)定级保护-P5483.信息(文档)配置管理-P549练习 15.…...
从编程视角看生命、爱、自由、生活的排列顺序
从编程视角看生命、爱、自由、生活的排列顺序 离开大学校园,踏入大厂成为一名算法工程师后,我常以编程思维看待生活中的事物。在思考生命、爱、自由和生活的排列顺序时,发现从编程角度分析这些概念会有独特见解。 一、生命——程序的核心代…...

Lumerical——属性编辑窗口的详解
一、几何选项卡(Geometry tab) 通过几何选项卡中的选项可以设定物件的位置和大小。 二、材料选项卡(Material tab) ① 材料(MATERIAL): 在该字段可以设置成材料数据库中包含的任何材料。数据库也有可能包含一些新材料,也可以对已经包含的材料进行编辑。如果选…...
08实战篇:972应用题(2024)思路解析
在本节中,你将学习到: 2024年972应用题的基本解题思路如何应对陌生的社会/学术热点问题,避免初见杀题目一:阐述搜索引擎的工作基本原理 关键词:搜索引擎、基本原理题型:基础概念题这是一道混在应用题中的简答题。根据《信息检索》一书中的P37内容回答即可(同时对应P45—…...

解决应用程序启动失败问题:由于找不到d3dx9_43.dll文件,如何快速有效地恢复和修复缺失的DLL组件
由于找不到d3dx9_43.dll,许多用户在启动某些游戏或者图形相关软件时遇到了棘手的问题。这个小小的DLL文件,虽然看似不起眼,却在众多基于DirectX 9技术构建的应用程序中扮演着至关重要的角色。对于游戏爱好者来说,当满心欢喜地准备…...
Ubuntu——双系统Ubuntu22.04系统安装和基础配置
文章目录 一、Ubuntu22.04双系统安装双系统安装和卸载 二、基础配置更新软件源搜狗输入法TimeShift上网 三、AI配置CondaCUDA12.6Pytorch2.3.0-cu121 四、额外配置Samba局域网文件共享系统 一、Ubuntu22.04双系统安装 双系统安装和卸载 双系统卸载安装Ubuntu双系统windows系统…...

stm32定时器中断和外部中断
一,中断系统的介绍 中断:在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行 中…...
LeetCode 每日一题 2024/9/30-2024/10/6
记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步 目录 9/30 1845. 座位预约管理系统10/1 983. 最低票价10/2 1870. 准时到达的列车最小时速10/3 1928. 规定时间内到达终点的最小花费10/4 1227. 飞机座位分配概率10/5 2187. 完成…...

Redis篇(最佳实践)(持续更新迭代)
介绍一:键值设计 一、优雅的key结构 Redis 的 Key 虽然可以自定义,但最好遵循下面的几个最佳实践约定: 遵循基本格式:[业务名称]:[数据名]:[id]长度不超过 44 字节不包含特殊字符 例如: 我们的登录业务࿰…...
详细介绍pandas 在python中的用法
Pandas 是 Python 中非常流行的数据分析和处理库,特别适用于处理结构化数据。它构建在 NumPy 之上,提供了更高级的功能,例如数据清理、整理、筛选和统计分析。Pandas 的核心数据结构是 Series 和 DataFrame,分别用于处理一维数据和…...
八字命理测算系统开发-源码搭建
八字命理测算系统的开发是一个结合了传统命理学与现代科技的项目,旨在为用户提供基于个人出生年、月、日、时等信息的个性化命理分析和预测。以下是开发此类系统时需要考虑的关键步骤和技术要点: 一、前期准备 1.确定需求和目标用户 与客户或团队讨论&am…...
Python批量读取mat文件
一、前言 使用Python中的h5py库实现同一目录下多个mat文件的批量读取功能,获取数据、lon、lat等信息,其他变量内容可根据自己的mat格式进行更改。 二、代码 def open_matfiles(dir, start_indexNone, end_indexNone,lev_indexNone,lev_valueNone):打开…...

UE4 材质学习笔记05(凹凸偏移和视差映射/纹理压缩设置)
一.凹凸偏移和视差映射 1.偏移映射 这需要一个高度图并且它的分辨率很低,只有256*256,事实上,如果高度图的分辨率比较低并且有点模糊,效果反而会更好 然后将高度图输出到BumpOffset节点的height插槽中, 之后利用得到…...

基于贝叶斯决策的 CAD 程序设计方案
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...

算法: 二分查找题目练习
文章目录 二分查找二分查找在排序数组中查找元素的第一个和最后一个位置搜索插入位置x 的平方根山脉数组的峰顶索引寻找峰值寻找旋转排序数组中的最小值点名 总结模版 二分查找 二分查找 没啥可说的,轻轻松松~ class Solution {public int search(int[] nums, int target) {i…...
Qt开发技巧(十三)QList插入操作,扩展类型的使用,关于QSS的坑,Qt的延时方法,Qt编译的三种版本,环境搭建多练练,指向Qt源码的报错
继续讲一些Qt开发中的技巧操作: 1.QList插入操作 关于QList队列的处理中,我们最常用的就是调用append函数添加item,往前插入item很多人第一印象就是调用insert(0,xxx)来插入,其实QList完全提供了往前追加item的函数prepend()、pus…...

docker快速上手
一个轻量的虚拟机,让程序员不再纠结于环境部署,更多集中于代码编写,基础建设,开发 作用: 打包:把你软件运行所需的所有东西打包到一起 分发:把你打包好的“安装包”上传到一个镜像仓库&#…...
JAVA学习-练习试用Java实现“反转链表 II”
问题: 给定单链表的头指针 head 和两个整数 left 和 right ,其中 left < right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。 示例 1: 输入:head [1,2,3,4,5], left 2, right 4 输出…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...
PostgreSQL——环境搭建
一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在࿰…...

如何应对敏捷转型中的团队阻力
应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中,明确沟通敏捷转型目的尤为关键,团队成员只有清晰理解转型背后的原因和利益,才能降低对变化的…...

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器
拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件: 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...