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("消息接收失败,重新入队");
    }
}

四:🚀友情链接

目录
打赏
0
1
0
0
22
分享
相关文章
SpringBoot项目打war包流程
本文介绍了将Spring Boot项目改造为WAR包并部署到外部Tomcat服务器的步骤。主要内容包括:1) 修改pom.xml中的打包方式为WAR;2) 排除Spring Boot内置的Tomcat依赖;3) 添加Servlet API依赖;4) 改造启动类以支持WAR部署;5) 打包和部署。通过这些步骤,可以轻松地将Spring Boot应用转换为适合外部Tomcat服务器的WAR包。
155 64
SpringBoot项目打war包流程
基于SpringBoot的智慧停车场微信小程序源码分享
智慧停车场微信小程序主要包含管理端和小程序端。管理端包括停车场管理,公告信息管理,用户信息管理,预定信息管理,用户反馈管理等功能。小程序端包括登录注册,预约停车位,停车导航,停车缴费,用户信息,车辆信息,钱包充值,意见反馈等功能。
34 5
基于SpringBoot的智慧停车场微信小程序源码分享
SpringBoot项目打包成war包
通过上述步骤,我们成功地将一个Spring Boot应用打包成WAR文件,并部署到外部的Tomcat服务器中。这种方式适用于需要与传统Servlet容器集成的场景。
30 8
|
2月前
基于springboot+thymeleaf+Redis仿知乎网站问答项目源码
基于springboot+thymeleaf+Redis仿知乎网站问答项目源码
161 36
SpringBoot start.aliyun.com创建项目,解决properties乱码的问题
通过确保文件和开发环境的编码一致,配置 Maven 编码,设置 Spring Boot 应用和嵌入式服务器的编码,可以有效解决 properties 文件的乱码问题。以上步骤可以帮助开发者确保在 Spring Boot 项目中正确处理和显示多语言字符,避免因编码问题导致的乱码现象。
46 5
SpringBoot获取项目文件的绝对路径和相对路径
SpringBoot获取项目文件的绝对路径和相对路径
187 1
SpringBoot获取项目文件的绝对路径和相对路径
SpringBoot项目中mysql字段映射使用JSONObject和JSONArray类型
SpringBoot项目中mysql字段映射使用JSONObject和JSONArray类型 图像处理 光通信 分布式计算 算法语言 信息技术 计算机应用
82 8
Spring运维之boot项目多环境(yaml 多文件 proerties)及分组管理与开发控制
通过以上措施,可以保证Spring Boot项目的配置管理在专业水准上,并且易于维护和管理,符合搜索引擎收录标准。
90 2
解决跨域问题大集合:vue-cli项目 和 java/springboot(6种方式) 两端解决(完美解决)
这篇文章详细介绍了如何在前端Vue项目和后端Spring Boot项目中通过多种方式解决跨域问题。
462 1
解决跨域问题大集合:vue-cli项目 和 java/springboot(6种方式) 两端解决(完美解决)
SpringBoot项目的html页面使用axios进行get post请求
SpringBoot项目的html页面使用axios进行get post请求
78 2

热门文章

最新文章