Springboot----项目整合微信支付(用户取消订单)

简介: Springboot----项目整合微信支付(用户取消订单)

一:🚀问题引入

1.1:🥃使用场景

实际场景中会遇到用户下单之后不想要了或者其他原因而申请取消订单,取消订单并不是单单更新商户后台数据库订单状态这么简单,还需要向微信支付后台申请关闭订单服务。有两种情况需要调用微信支付的关单接口,其一就是上面提到的用户主动取消订单,其二就是订单过期自动取消。

1.2:🥫接口说明

1.3:🚨注意事项

关单没有时间限制,建议在订单生成后间隔几分钟(最短5分钟)再调用关单接口,避免出现订单状态同步不及时导致关单失败。

二:🚀处理流程

关闭订单的处理流程比较简单,没有什么逻辑判断,只需要单纯创建远程请求对象然后完成签名并执行请求即可,最后还需要更新订单状态。

三:🚀代码实现

3.1:controller层

/**
* 用户取消订单
* @param order
* @return
*/
@ApiOperation("取消订单")
@PostMapping("/cancel")
public R<String> cancelOrder(@RequestBody Orders order) throws Exception {
    log.info("取消订单");
    wxPayService.cancelOrder(order);
    return R.success("取消订单成功");
}

3.2:service层

/**
* 取消订单
* @param order
*/
@Override
public void cancelOrder(Orders order) throws Exception {
    //调用微信支付的关单接口
    this.closeOrder(order.getNumber());
    //更新订单状态
    Orders order_temp = ordersService.getById(order.getId());
    ordersService.updateStatusByOrderNo(order_temp.getNumber(),"5");
}
/**
* 关单接口的调用
* @param orderNo
*/
@Override
public void closeOrder(String orderNo) throws Exception {
    log.info("关单接口的调用,订单号 ===> {}", orderNo);
    //创建远程请求对象
    String url = String.format(WxApiType.CLOSE_ORDER_BY_NO.getType(), orderNo);
    url = wxPayConfig.getDomain().concat(url);
    HttpPost httpPost = new HttpPost(url);
    httpPost.addHeader("Accept", "application/json");
    httpPost.addHeader("Content-type","application/json; charset=utf-8");
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    ObjectMapper objectMapper = new ObjectMapper();
    ObjectNode rootNode = objectMapper.createObjectNode();
    rootNode.put("mchid",wxPayConfig.getMchId());
    objectMapper.writeValue(bos, rootNode);
    httpPost.setEntity(new StringEntity(bos.toString(StandardCharsets.UTF_8), "UTF-8"));
    //完成签名并执行请求
    try (CloseableHttpResponse response = wxPayClient.execute(httpPost)) {
        String jsonString = JSON.toJSONString(response);
        JSONObject body = JSON.parseObject(jsonString);
        JSONObject statusLine = body.getJSONObject("statusLine");
        String code = statusLine.getString("statusCode");
        log.info("关闭订单成功订单号:===>{}", code);
    }
}

在微信支付开发者文档中介绍说关闭订单是没有返回参数的,但是我们可以在response中获取到返回的状态码以判断是否处理成功,执行断点调试可以发现返回状态码为204。

3.3:RabbitmqDelayConsumer

/**
 * 监听订单延迟队列
 * @param orderNo
 * @throws Exception
*/
@RabbitListener(queues = {"plugin.delay.order.queue"})
public void orderDelayQueue(String orderNo, Message message, Channel channel) throws Exception {
    log.info("订单延迟队列开始消费...");
    try {
        //处理订单
        wxPayService.checkOrderStatus(orderNo);
        //告诉服务器收到这条消息 已经被我消费了 可以在队列删掉 这样以后就不会再发了 否则消息服务器以为这条消息没处理掉 后续还会在发
        channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
        log.info("消息接收成功");
    } catch (Exception e) {
        e.printStackTrace();
        //消息重新入队
        channel.basicNack(message.getMessageProperties().getDeliveryTag(), false,true);
        log.info("消息接收失败,重新入队");
    }
}

四:🚀友情链接

相关文章
|
27天前
|
Java 数据库连接 Maven
springBoot:项目建立&配置修改&yaml的使用&resource 文件夹(二)
本文档介绍了如何创建一个基于Maven的项目,并配置阿里云仓库、数据库连接、端口号、自定义启动横幅及多环境配置等。同时,详细说明了如何使用YAML格式进行配置,以及如何处理静态资源和模板文件。文档还涵盖了Spring Boot项目的`application.properties`和`application.yaml`文件的配置方法,包括设置数据库驱动、URL、用户名、密码等关键信息,以及如何通过配置文件管理不同环境下的应用设置。
|
5天前
|
Java 应用服务中间件
SpringBoot获取项目文件的绝对路径和相对路径
SpringBoot获取项目文件的绝对路径和相对路径
40 1
SpringBoot获取项目文件的绝对路径和相对路径
|
25天前
|
JavaScript 前端开发 Java
解决跨域问题大集合:vue-cli项目 和 java/springboot(6种方式) 两端解决(完美解决)
这篇文章详细介绍了如何在前端Vue项目和后端Spring Boot项目中通过多种方式解决跨域问题。
280 1
解决跨域问题大集合:vue-cli项目 和 java/springboot(6种方式) 两端解决(完美解决)
|
7天前
|
JavaScript 前端开发 Java
SpringBoot项目的html页面使用axios进行get post请求
SpringBoot项目的html页面使用axios进行get post请求
25 2
|
7天前
|
前端开发 Java Spring
SpringBoot项目thymeleaf页面支持词条国际化切换
SpringBoot项目thymeleaf页面支持词条国际化切换
27 2
|
7天前
|
JSON Java 数据库
SpringBoot项目使用AOP及自定义注解保存操作日志
SpringBoot项目使用AOP及自定义注解保存操作日志
25 1
|
9天前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
1月前
|
Java Maven Android开发
eclipse如何导入springboot项目
本文介绍了如何在Eclipse中导入Spring Boot项目。
24 1
eclipse如何导入springboot项目
|
21天前
|
移动开发 小程序 数据可视化
基于npm CLI脚手架的uniapp项目创建、运行与打包全攻略(微信小程序、H5、APP全覆盖)
基于npm CLI脚手架的uniapp项目创建、运行与打包全攻略(微信小程序、H5、APP全覆盖)
145 3
|
25天前
|
Java Maven Spring
springboot学习一:idea社区版本创建springboot项目的三种方式(第三种为主)
这篇文章介绍了在IntelliJ IDEA社区版中创建Spring Boot项目的三种方法,特别强调了第三种方法的详细步骤。
148 0
springboot学习一:idea社区版本创建springboot项目的三种方式(第三种为主)