Java微信支付接入(10)API V3 申请退款API

devtools/2024/10/18 0:38:34/

官方文档:

https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_4_9.shtml

1.创建退款单

接口:

    @ApiOperation("退款企业订单")@PostMapping("/refunds")public ResultMessageBean refunds(String orderId){return businessOrderService.refund(orderId);}

业务实现:

@Overridepublic ResultMessageBean refund(String orderId) {try {//生成退款订单if(!this.createRefundByOrderId(orderId)){return new ResultMessageBean(ResultErrorEnum.custom_error.getCode(), "生成退款订单失败,orderId ===> " + orderId);}//调用微信退款APIif(!wxRefund(orderId)){return new ResultMessageBean(ResultErrorEnum.custom_error.getCode(), "调用微信退款API失败,orderId ===> " + orderId);}}catch (Exception e){logger.info("订单退款失败,orderId ===> " + orderId);return new ResultMessageBean(ResultErrorEnum.custom_error.getCode(), "订单退款失败,orderId ===> " + orderId);}return new ResultMessageBean(ResultErrorEnum.request_success.getCode(), ResultErrorEnum.request_success.getMessage());}

创建退款订单方法

 private boolean createRefundByOrderId(String orderId) {TBusinessOrder tBusinessOrder=bussinessOrderMapper.findByOrderIdAndState(orderId,2);if(null==tBusinessOrder){return false;}TBusinessOrder refundBusinessOrder=new TBusinessOrder();refundBusinessOrder.setOrderId(orderId);refundBusinessOrder.setRefundId(UUIDTool.getUUID());refundBusinessOrder.setRefundPrice(tBusinessOrder.getPrice());refundBusinessOrder.setRefundTime(new Date());int flag=bussinessOrderMapper.updateBusinessOrder(refundBusinessOrder);if(flag!=0){return true;}return false;}

调用微信退款API 方法

/*** 调用微信退款接口* */private boolean wxRefund(String orderId) {try {logger.info("调用退款API orderId===>"+orderId);TBusinessOrder refundsInfo =bussinessOrderMapper.findByOrderIdAndState(orderId, 2);//调用统一下单APIString url = wxPayConfig.getDomain().concat(WxApiTypeEnum.DOMESTIC_REFUNDS.getType());logger.info("微信退款API URL ===> " + url);HttpPost httpPost = new HttpPost(url);// 请求body参数Gson gson = new Gson();Map paramsMap = new HashMap();paramsMap.put("out_trade_no", orderId);//订单编号paramsMap.put("out_refund_no", refundsInfo.getRefundId());//退款单编号paramsMap.put("notify_url", wxPayConfig.getNotifyDomain().concat(WxNotifyTypeEnum.REFUND_NOTIFY.getType()));//退款通知地址Map amountMap = new HashMap();amountMap.put("refund", refundsInfo.getRefundPrice());//退款金额amountMap.put("total", refundsInfo.getPrice());//原订单金额amountMap.put("currency", "CNY");//退款币种paramsMap.put("amount", amountMap);//将参数转换成json字符串String jsonParams = gson.toJson(paramsMap);logger.info("微信退款API请求参数 ===> {}" + jsonParams);StringEntity entity = new StringEntity(jsonParams,"utf-8");entity.setContentType("application/json");//设置请求报文格式httpPost.setEntity(entity);//将请求报文放入请求对象httpPost.setHeader("Accept", "application/json");//设置响应报文格式//TODO:完成签名并执行请求,并完成验签//CloseableHttpResponse response = wxPayClient.execute(httpPost);//TODO:解析响应结果//String bodyAsString = EntityUtils.toString(response.getEntity());//int statusCode = response.getStatusLine().getStatusCode();//TODO:假设响应结果为200,响应内容为退款下单成功int statusCode=200;String bodyAsString="退款下单成功";if (statusCode == 200) {logger.info("成功, 退款返回结果 = " + bodyAsString);} else if (statusCode == 204) {logger.info("成功");} else {logger.info("退款下单失败"+bodyAsString);return false;}}catch (Exception e){e.printStackTrace();logger.infoError(e);return false;}//更新订单状态TBusinessOrder refundBusinessOrder=new TBusinessOrder();refundBusinessOrder.setOrderId(orderId);refundBusinessOrder.setState(4);bussinessOrderMapper.updateBusinessOrder(refundBusinessOrder);return true;}


http://www.ppmy.cn/devtools/126591.html

相关文章

常见网络协议的介绍、使用场景及 Java 代码样例

以下是几种常见网络协议的介绍、使用场景及 Java 代码样例: 一、HTTP(HyperText Transfer Protocol,超文本传输协议) 介绍: HTTP 是用于在 Web 浏览器和 Web 服务器之间传输超文本的应用层协议。基于请求 - 响应模式…

Java 动态代理机制

可以通过 Java 动态代理机制来实现一个通用的代理类,使它能够处理任意接口中包含的 set 和 get 方法,并且将属性值保存在一个内部的 Map 中。这样,每次调用 set 方法时,值会被存储到 Map 中,而调用 get 方法时&#xf…

Android应用性能优化的方法

Android应用性能优化是一个复杂而关键的过程,涉及多个方面,包括布局优化、网络优化、安装包优化、内存优化、卡顿优化、启动优化等。以下是对这些优化方法的详细解析: 一、布局优化 布局优化是Android性能优化的基础,主要目标是…

H.266都来了,为什么感觉H.265标准还没普及?

技术背景 H.266,也被称为多功能视频编码(Versatile Video Coding,简称 VVC)是最新一代视频编码标准,2020 年 7 月定稿,ITU 第一版于当年 11 月正式发布,ISO/IEC 第一版于 2021 年 2 月正式发布…

蛋白质结构中的pdb_strand_id 和 pdbx_strand_id

在蛋白质结构文件(如 .cif 文件)中,pdb_strand_id 和 pdbx_strand_id 不是同一个概念,它们分别指代不同的字段,具有不同的含义。 1. pdb_strand_id: 这个术语通常在 PDB 数据库的老版本中使用,是指蛋白质…

springboot项目多个数据源配置 dblink

当项目中涉及到多个数据库连接的时候该如何处理? 在对应的配置文件,配置对应的数据库情况,不过我确实没咋测试对于事务的处理我可以后续在多做测试 配置文件中配置对应的数据源 然后再使用的时候使用这个 DS(“pd_ob”)注解。 然后又长知识…

3.3 Thymeleaf语法

文章目录 引言Thymeleaf标签显示标签链接地址标签条件判断标签元素遍历标签 Thymeleaf表达式变量表达式选择变量表达式消息表达式链接表达式 Thymeleaf内置对象上下文对象上下文变量上下文区域请求对象响应对象会话对象日期对象 实战演练创建控制器创建模板页面 结语 引言 Thy…

三、AOP

文章目录 1. AOP(概念)2. AOP(底层原理)2.1 AOP 底层使用动态代理2.2 AOP(JDK动态代理) 3. AOP(术语)3.1 连接点3.2 切入点3.3 通知(增强)3.4 切面 4. AOP操作…