当前位置: 首页 > news >正文

微信小程序余额退费

需求:用户充值使用后的剩余金额,需要退回到用户原路。

参考文档:微信支付-开发者文档

pom.xml配置:

<!--微信支付SDK-->
<dependency><groupId>com.github.wechatpay-apiv3</groupId><artifactId>wechatpay-java</artifactId><version>0.2.12</version>
</dependency><!--微信支付SDK-->
<dependency><groupId>com.github.wechatpay-apiv3</groupId><artifactId>wechatpay-apache-httpclient</artifactId><version>0.4.4</version>
</dependency>

配置说明:在application.yml文件中配置

wx:app_id: wx70f123456abc0000 #微信小程序appIdapp_secret: 012029bc88ab195f64000c0f40003ed9 #小程序秘钥mch_id: 1000008342 #微信支付商户号mch_serial_no: 47401236EAE7432BA123456E95F3EC483A000000 #商户API证书序列号api_key: ABCD20225806STOPCHARGE0123WXZFSH #微信支付API密钥;apiV3秘钥key_path: C:\apiclient_key.pem #商户API私钥路径
package com.xxxx.common.vo;import lombok.Data;
import lombok.ToString;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;@Component
@ConfigurationProperties(prefix = "wx")
@Data
@ToString
public class WxPayV3Vo {//小程序appidprivate String appId;//商户号private String mchId;//证书序列号private String mchSerialNo;//小程序秘钥private String appSecret;//微信支付API密钥;apiV3秘钥private String apiKey;//证书地址private String keyPath;
}

不废话直接上代码

控制层:小程序传2个参数,余额和用户Id

    /*** 退款* @param amount* @param userId* @return*/@ApiOperation(value = "退款", notes = "退款")@GetMapping(value = "/refund")@ResponseBodypublic CommonResult<Boolean> refund(String amount,Integer userId) {return CommonResult.success(chargeOrderStatusService.refund(amount,userId));}

实现类

    /*** 退款*/@Overridepublic boolean refund(String amount, Integer userId) {BigDecimal amount1 = new BigDecimal(amount);//查询充值订单集合List<UserRecharge> chargeOrderStatusList = selectChargeOrderData(userId);for (UserRecharge userRecharge : chargeOrderStatusList) {String orderId = userRecharge.getOrderId();//商户订单号if (amount1.compareTo(BigDecimal.ZERO) <= 0) {throw new CrmebException("退款金额不能为0,请修改退款金额");}//用户剩余金额User user = queryUserMoney(userId);//退款金额>用户剩余金额if (amount1.compareTo(user.getNowMoney()) > 0) {throw new CrmebException("退款金额大于剩余金额,请修改退款金额");}if (amount1.compareTo(user.getNowMoney()) <= 0) {try {//开始退款chargeOrderStatusService.refundStart(amount1, userId, orderId);} catch (Exception e) {e.printStackTrace();throw new CrmebException("微信申请退款失败!");}}}return false;}
    /*** 查询充值订单** @return*/private List<UserRecharge> selectChargeOrderData(Integer userId) {LambdaQueryWrapper<UserRecharge> lqw = Wrappers.lambdaQuery();lqw.eq(UserRecharge::getUid, userId);lqw.orderByDesc(UserRecharge::getCreateTime);lqw.last("LIMIT 1");List<UserRecharge> userRechargeList = userRechargeDao.selectList(lqw);if (userRechargeList.size() < 0) {throw new CrmebException("没有找到充值订单信息");}return userRechargeList;}
    /*** 查询用户剩余金额** @return*/private User queryUserMoney(Integer userId) {LambdaQueryWrapper<User> lqw = Wrappers.lambdaQuery();lqw.eq(User::getUid, userId);User User = userDao.selectOne(lqw);if (ObjectUtil.isNull(User)) {throw new CrmebException("没有找到订单信息");}return User;}
   /*** 开始退款** @param amount1 退款金额* @param userId* @param orderId* @return*/@Overridepublic CommonResult<Object> refundStart(BigDecimal amount1, Integer userId, String orderId) {//查询用户剩余金额User user = queryUserMoney(userId);try {Config config = new RSAAutoCertificateConfig.Builder().merchantId(wxPayV3Bean.getMchId()).privateKeyFromPath(wxPayV3Bean.getKeyPath()).merchantSerialNumber(wxPayV3Bean.getMchSerialNo()).apiV3Key(wxPayV3Bean.getApiKey()).build();//构造申请退款对象RefundService service = new RefundService.Builder().config(config).build();//请求参数CreateRequest requestParam = new CreateRequest();//设置退款金额AmountReq amountReq = new AmountReq();String amountStr = amount1.toString();//用户退款金额Number number = Float.parseFloat(amountStr) * 100;int oamount = number.intValue();long refundLong = Long.valueOf(oamount);amountReq.setRefund(refundLong);//退款金额String nowMoneyStr = String.valueOf(user.getNowMoney());//用户剩余金额Number number1 = Float.parseFloat(nowMoneyStr) * 100;int oamount1 = number1.intValue();long LongNowMoney = Long.valueOf(oamount1);//生成商户退款单号String formattedTime = formatTime(LocalDateTime.now(), "yyyyMMddHHmmss");String randomNum = String.valueOf(generateRandomNumber(1000, 9999));String StartChargeSeq = "refund_" + formattedTime + randomNum;amountReq.setTotal(LongNowMoney);//原订单金额amountReq.setCurrency("CNY");//货币类型(默认人民币)requestParam.setAmount(amountReq);requestParam.setReason("退款");requestParam.setOutRefundNo(StartChargeSeq);requestParam.setOutTradeNo(orderId);//商户订单号//发起请求,申请退款Refund refund = service.create(requestParam);//调用成功的响应数据System.out.println("退款调用成功的响应数据======" + refund);if (Status.SUCCESS.equals(refund.getStatus().SUCCESS)) {return CommonResult.success("退款成功");}if (Status.PROCESSING.equals(refund.getStatus().PROCESSING)) {//根据请求返回状态修改对应订单状态return CommonResult.success("退款中");}if (Status.ABNORMAL.equals(refund.getStatus().ABNORMAL)) {//根据请求返回状态修改对应订单状态return CommonResult.success("退款异常");}if (Status.CLOSED.equals(refund.getStatus().CLOSED)) {//根据请求返回状态修改对应订单状态return CommonResult.success("退款关闭");}} catch (Exception e) {e.printStackTrace();}return null;}

相关文章:

微信小程序余额退费

需求&#xff1a;用户充值使用后的剩余金额&#xff0c;需要退回到用户原路。 参考文档&#xff1a;微信支付-开发者文档 pom.xml配置&#xff1a; <!--微信支付SDK--> <dependency><groupId>com.github.wechatpay-apiv3</groupId><artifactId&g…...

宁波银行票据案例解读,要注入科技赋能票据新形式

随着科技的飞速发展&#xff0c;金融行业正迎来一场前所未有的变革。作为一家以科技创新为驱动的现代化银行&#xff0c;宁波银行在这场变革中积极探索&#xff0c;宁波银行票据案例之后持续通过引入先进技术&#xff0c;为客户提供更加高效、智能的金融服务。 宁波银行推出的…...

博客已迁移

迁移至 烧烤er (makkapakka996.github.io)...

大模型应用研发基础环境配置(Miniconda、Python、Jupyter Lab、Ollama等)

老牛同学之前使用的MacBook Pro电脑配置有点旧&#xff08;2015 年生产&#xff09;&#xff0c;跑大模型感觉有点吃力&#xff0c;操作起来有点卡顿&#xff0c;因此不得已捡起了尘封了快两年的MateBook Pro电脑&#xff08;老牛同学其实不太喜欢用 Windows 电脑做研发工作&am…...

24年嘉兴市索贝进出口有限公司--信息安全实施项目

截至24年6月24日&#xff0c;oms生产环境订单数12万5673条。 索贝是一家致力于成为竹木小家具头部企业的公司&#xff0c;截至24年6月24日&#xff0c;在册员工数130人&#xff0c;产值10个亿。 由于信息安全人才和能力的缺失&#xff0c;导致部署在阿里云生产环境的系统处于…...

亚马逊云科技官方活动:一个月拿下助理架构师SAA+云从业者考试认证(送半价折扣券)

为了帮助大家考取AWS SAA和AWS云从业者认证&#xff0c;小李哥争取到了大量考试半价50%折扣券&#xff0c;使用折扣券考试最多可省75刀(545元人民币)。 领取折扣券需要加入云师兄必过班群&#xff0c;在群中免费领取。目前必过班群招募到了超过200名小伙伴&#xff0c;名额有限…...

【山东】2024年夏季高考文化成绩一分一段表

文末有图片版&#xff0c;可直接保存下载&#xff01;&#xff01; 2024年夏季高考文化成绩一分一段表分数段全体-选考物理-选考化学-选考生物-选考思想政治-选考历史-选考地理分数段本段人数累计人数本段人数累计人数本段人数累计人数本段人数累计人数本段人数累计人数本段人…...

栈与队列 Leetcode 347 前k个高频元素

栈与队列 Leetcode 347 前k个高频元素 Leetcode 347 灵活运用C库函数&#xff0c;使用匿名函数排序&#xff0c;sort可以替换为快排实现&#xff08;面试感觉可能会手撕&#xff0c;机考直接使用sort&#xff09; class Solution { public:vector<int> topKFrequent(v…...

windchill 相关配置

-Dhttp.proxyHostproxy.acme.com -Dhttp.proxyPort8080 -Dwt.rmi.clientSocketFactorywt.boot.WTRMIMasterSocketFactory -Dwt.rmi.javarmicgiservlet/JavaRMIServlet...

XGBoost算法深度解析:原理、实现与应用

摘要 XGBoost&#xff08;eXtreme Gradient Boosting&#xff09;是一种高效的机器学习算法&#xff0c;以其出色的预测性能和计算效率在众多数据科学竞赛和实际应用中取得了巨大成功。本文将深入探讨XGBoost算法的基本原理、实现机制、优化技巧以及在不同领域的应用案例。 1…...

27-29、redis优化(令牌主动失效机制)-controllert额外添加参数接收请求头、拦截器

1、SpringBoot集成redis <!--redis坐标--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency> @SpringBootTest//如果在测试类上添加了这个注解,那么…...

【Linux】性能分析器 gperftools 详解

1、安装 1.1 源码安装 1)源码下载 最新版本:https://github.com/gperftools/gperftools 稳定版本:https://github.com/gperftools/gperftools/releases 2)编译 ./configure make -j83)安装,默认安装在/usr/local/lib目录下 sudo make install1.2 命令安装 以Ubuntu…...

C语言基础——函数(2)

ʕ • ᴥ • ʔ づ♡ど &#x1f389; 欢迎点赞支持&#x1f389; 文章目录 前言 一、return语句 二、数组做函数参数 三、嵌套调用和链式访问 3.1 嵌套调用 3.2 链式访问 四、函数声明和定义 4.1 单个文件 4.2 多个文件 总结 前言 大家好啊&#xff0c;继我们上一…...

Kafka Stream 流处理设计概述

Kafka Stream 流处理设计概述 Kafka 流处理是指使用 Kafka 及其生态系统中的组件来处理实时数据流。Kafka Streams 是 Kafka 官方 提供的流处理库,它简化了构建流处理应用程序的过程,并与 Kafka 无缝集成。以下是 Kafka 流处理的设 计原理和相关概念。 1. Kafka 流处理基本…...

Centos7安装自动化运维Ansible

自动化运维Devops-Ansible Ansible是新出现的自动化运维工具&#xff0c;基于Python 开发&#xff0c;集合了众多运维工具&#xff08;puppet 、cfengine、chef、func、fabric&#xff09;的优点&#xff0c;实现了批量系统配置 、批量程序部署、批量运行命令 等功能。Ansible…...

element-ui 下拉菜单el-dropdown-item添加点击事件

使用element-ui下拉菜单组件Dropdown时绑定点击事件&#xff0c;事件不生效。 click 常见于其用在Vue中的事件绑定&#xff0c;而实际上是 v-on 的简写&#xff0c;而 v-on 则是对 vue 的事件体系封装之后的 API接口。 native修饰符用于处理DOM原生事件&#xff0c;由于组件 …...

Day45

Day45 jQuery动画 显示和隐藏 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title><script src"js/jquery-1.8.2.js" type"text/javascript" charset"utf-8"></script&…...

新媒体矩阵系统是什么?怎么搭建矩阵系统?

目录 前言&#xff1a; 一、新媒体矩阵分别是什么&#xff1f; 1、横向矩阵 2、 纵向矩阵 二、新媒体矩阵的作用&#xff1f; 1、多元化发展&#xff0c;吸引目标 2、多平台协同&#xff0c;放大宣传效果 3、多平台运营&#xff0c;分散风险 三、怎么做矩阵系统&…...

HarmonyOS应用开发——Hello World

下载 HUAWEI DevEco Studio: https://developer.harmonyos.com/cn/develop/deveco-studio/#download 同意&#xff0c;进入配置页面&#xff1a; 配置下载源以及本地存放路径&#xff0c;包括nodejs和ohpm: 配置鸿蒙SDK路径&#xff1a; 接受协议&#xff1a; 确认无误后&#…...

Ubuntu20.04使用Samba

目录 一、Samba介绍 Samba 的主要功能 二、启动samba 三、主机操作 四、Ubuntu与windows系统中文件互联 五、修改samba路径 一、Samba介绍 Samba 是一个开源软件套件&#xff0c;用于在 Linux 和 Unix 系统上实现 SMB&#xff08;Server Message Block&#xff09;协议…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

goreplay

1.github地址 https://github.com/buger/goreplay 2.简单介绍 GoReplay 是一个开源的网络监控工具&#xff0c;可以记录用户的实时流量并将其用于镜像、负载测试、监控和详细分析。 3.出现背景 随着应用程序的增长&#xff0c;测试它所需的工作量也会呈指数级增长。GoRepl…...

【记录坑点问题】IDEA运行:maven-resources-production:XX: OOM: Java heap space

问题&#xff1a;IDEA出现maven-resources-production:operation-service: java.lang.OutOfMemoryError: Java heap space 解决方案&#xff1a;将编译的堆内存增加一点 位置&#xff1a;设置setting-》构建菜单build-》编译器Complier...

CppCon 2015 学习:Simple, Extensible Pattern Matching in C++14

什么是 Pattern Matching&#xff08;模式匹配&#xff09; ❝ 模式匹配就是一种“描述式”的写法&#xff0c;不需要你手动判断、提取数据&#xff0c;而是直接描述你希望的数据结构是什么样子&#xff0c;系统自动判断并提取。❞ 你给的定义拆解&#xff1a; ✴ Instead of …...