支付宝支付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>

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

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

相关文章

机器学习/数据分析--用通俗语言讲解时间序列自回归(AR)模型,并用其预测天气,拟合度98%+

时间序列在回归预测的领域的重要性&#xff0c;不言而喻&#xff0c;在数学建模中使用及其频繁&#xff0c;但是你真的了解ARIMA、AR、MA么&#xff1f;ACF图你会看么&#xff1f;&#xff1f; 时间序列数据如何构造&#xff1f;&#xff1f;&#xff1f;&#xff0c;我打过不少…

读书笔记 - 虚拟化技术 - 0 QEMU/KVM概述与历史

《QEMU/KVM源码解析与应用》 - 王强 概述 虚拟化简介 虚拟化思想 David Wheeler&#xff1a;计算机科学中任何问题都可以通过增加一个中间层来解决。 虚拟化思想存在与计算机科学的各个领域。 主要思想&#xff1a;通过分层将底层的复杂&#xff0c;难用的资源虚拟抽象为简…

32单片机 低功耗模式

以下是一个基于STM32的低功耗模式示例代码&#xff0c;展示如何将STM32微控制器置于低功耗模式&#xff0c;并在特定条件下唤醒它。这个示例使用的是STM32 HAL库。 ### 示例代码&#xff1a;进入睡眠模式并使用外部中断唤醒 c #include "stm32f4xx_hal.h" // 函数声明…

笔记本电脑按住电源键强行关机,对电脑有伤害吗?

电脑卡住了&#xff0c;我们习惯性地按住电源键或者直接拔掉电源强制关机&#xff0c;但这种做法真的安全吗&#xff1f;会不会对电脑造成伤害呢&#xff1f; 其实&#xff0c;按住电源键关机和直接拔掉电源关机是不一样的。它们在硬件层面有着本质区别。 按住电源键关机 当…

网络常用配置和运维命令以及使用方法

一、网络运维常见配置及命令 以下是一些整理简单网络常用配置和运维命令 1、ifconfig/ipconfig&#xff1a;查看和配置网络接口配置。 用法&#xff1a;ifconfig 或 ipconfig2、route/netstat -r&#xff1a;查看路由表。 用法&#xff1a;route -n 或 netstat -r3、netsta…

Spring Cloud 3.x 集成eureka快速入门Demo

1.什么是eureka&#xff1f; Eureka 由 Netflix 开发&#xff0c;是一种基于REST&#xff08;Representational State Transfer&#xff09;的服务&#xff0c;用于定位服务&#xff08;服务注册与发现&#xff09;&#xff0c;以实现中间层服务的负载均衡和故障转移&#xff…

工业和自动化领域常见的通信协议

在工业和自动化领域&#xff0c;有多种常见的通信协议&#xff0c;主要用于设备间的通信、数据传输和控制。 Modbus&#xff1a; 类型&#xff1a;串行通信协议用途&#xff1a;广泛用于工业自动化设备间的通信&#xff0c;如PLC、传感器和执行器。优点&#xff1a;简单、开放且…

day01-Qt5入门

day01-Qt5入门 窗体应用 1.1 窗体基类说明 创建项目在details中编辑器提供了三个基类&#xff0c;分别是 QMainWindows、Qwidget、QDialog 1、 QMainWindow QMainWindow 类提供一个有菜单条、锚接窗口&#xff08;例如工具条&#xff09;和一个状态条的主应用 程序窗口。…

【系统架构设计师】案例专题六(8大系统架构设计之1): 信息系统架构设计考点梳理

更多内容请见: 备考系统架构设计师-核心总结目录 文章目录 一、信息系统架构基本概念二、信息系统架构1、信息系统架构分类2、信息系统常用4种架构模型3、企业信息系统的总体框架三、信息系统架构设计方法1、ADM架构开发方法2、信息化总体架构方法3、TOGAF的目标、思想和组件四…

【C语言实现TCP客户端】

Question C语言实现TCP客户端 Answer 下面是一个简单的 C 语言实现的 TCP 客户端示例。这个客户端将连接到指定的服务器地址和端口&#xff0c;并发送一条消息&#xff0c;然后接收服务器返回的消息。 #include <stdio.h> #include <stdlib.h> #include <st…

Java-基础

1. 导入模块不能纯粹的复制粘贴&#xff0c;要从new里导入&#xff0c;因为前者建立不了关联 2. 数组 String[] name{"张三","李四","王五"};int[] numsnew int[]{1,2,3};//二维String[][] names{{"张三","李四"},{"…

RT-DETR改进策略:BackBone改进|CAFormer在RT-DETR中的创新应用,显著提升目标检测性能

摘要 在目标检测领域,模型性能的提升一直是研究者和开发者们关注的重点。近期,我们尝试将CAFormer模块引入RT-DETR模型中,以替换其原有的主干网络,这一创新性的改进带来了显著的性能提升。 CAFormer,作为MetaFormer框架下的一个变体,结合了深度可分离卷积和普通自注意力…

MATLAB - 机械臂手眼标定(眼在手内) - 估计安装在机器人上的移动相机的姿态

系列文章目录 前言 本示例展示了如何为装有手眼构型摄像头的机械臂或机械手执行和验证手眼校准。 一、概述 执行手眼校准有助于操作配备末端执行器&#xff08;简称 “手”&#xff09;的机械臂&#xff0c;该末端执行器依赖于摄像头提供的视觉数据。一旦完成了眼在手外的校准&…

LabVIEW 成绩统计系统

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

【算法】- 查询 -平衡二叉树

文章目录 前言一、平衡二叉树思想二、如何进行平衡调整2.1如何实现左平衡&#xff08;L_Balance&#xff09; 三、平衡二叉树总结 前言 编译语言&#xff1a;C 编译器&#xff1a;VS2022 一、平衡二叉树思想 在上节我们讲到了二叉排序树&#xff0c;当我们在使用二叉排序树时&a…

中科星图GVE(案例)——AI实现建筑用地变化前后对比情况

目录 简介 函数 gve.Services.AI.ConstructionLandChangeExtraction(image1,image2) 代码 结果 知识星球 机器学习 简介 AI可以通过分析卫星图像、航拍影像或其他地理信息数据&#xff0c;实现建筑用地变化前后对比。以下是一种可能的实现方法&#xff1a; 数据获取&am…

【Axure安装包与汉化包附带授权证书】

一、下载Axure安装包与汉化包附带授权证书 1.下载汉化包 【快传】: 点击链接即可保存 2.解压安装包 解压下载好的压缩包&#xff0c;能看到有lang也就是汉化包&#xff0c;AxureRP-Setup-RC.exe 也就是Axure9的安装程序&#xff0c;以及汉化说明和授权码。 二、安装Axure9…

小猿口算APP脚本(协议版)

小猿口算是一款专注于数学学习的教育应用,主要面向小学阶段的学生。它提供多种数学练习和测试,包括口算、速算、应用题等。通过智能化的题目生成和实时批改功能,帮助学生提高数学计算能力。此外,它还提供详细的学习报告和分析,帮助家长和教师了解学生的学习进度和薄弱环节…

【深度学习】— 多层感知机介绍、 隐藏层、从线性到非线性、线性模型的局限性

【深度学习】— 多层感知机介绍 4.1 多层感知机4.1.1 隐藏层线性模型的局限性引入隐藏层 4.2 从线性到非线性线性组合的局限性引入非线性堆叠更多隐藏层 4.1 多层感知机 在第 3 节中&#xff0c;我们介绍了 softmax 回归&#xff0c;并实现了其从零开始的实现和基于高级 API 的…

Springboot——使用poi实现excel动态图片导入解析

文章目录 前言依赖引入导入实现方式一方式二 导出参考 前言 最近要实现一个导入导出的功能点&#xff0c;需要能将带图片的列表数据导出到excel中&#xff0c;且可以导入带图片的excel列表数据。 考虑到低代码平台的表头与数据的不确定性&#xff0c;技术框架上暂定使用Apach…