JAVA全系列 教程
3762个小节阅读:7088.3k
目录
C语言快速入门
JAVA全系列 教程
面向对象的程序设计语言
Python全系列 教程
Python3.x版本,未来主流的版本
人工智能 教程
顺势而为,AI创新未来
大厂算法 教程
算法,程序员自我提升必经之路
C++ 教程
一门通用计算机编程语言
微服务 教程
目前业界流行的框架组合
web前端全系列 教程
通向WEB技术世界的钥匙
大数据全系列 教程
站在云端操控万千数据
AIGC全能工具班
A A
White Night
xxxxxxxxxx
/**
* 超时订单
* @param minutes
* @return
*/
List<OrderInfo> getNoPayOrderByDuration(int minutes);
xxxxxxxxxx
@Override
public List<OrderInfo> getNoPayOrderByDuration(int minutes) {
Instant instant = Instant.now().minus(Duration.ofMinutes(minutes));
// 1、查询条件构造器
QueryWrapper<OrderInfo> queryWrapper = new QueryWrapper<>();
// 2、订单类型
queryWrapper.eq("order_status", OrderStatus.NOTPAY.getType());
// 3、订单创建时间
queryWrapper.le("create_time", instant);
List<OrderInfo> orderInfoList = baseMapper.selectList(queryWrapper);
return orderInfoList;
}
创建定时任务WxPayTask
从第0秒开始每隔30秒执行1次,查询创建超过5分钟,并且未支付的订单。
xxxxxxxxxx
@Scheduled(cron = "0/30 * * * * ?")
public void orderConfirm() throws Exception {
log.info("orderConfirm 被执行......");
List<OrderInfo> orderInfoList = orderInfoService.getNoPayOrderByDuration(5);
for (OrderInfo orderInfo : orderInfoList) {
String orderNo = orderInfo.getOrderNo();
log.warn("超时订单 ===> {}", orderNo);
//核实订单状态:调用微信支付查单接口
wxPayService.checkOrderStatus(orderNo);
}
}
xxxxxxxxxx
/**
* 检查订单状态
* @param orderNo
* @throws Exception
*/
void checkOrderStatus(String orderNo) throws Exception;
xxxxxxxxxx
@Override
public void checkOrderStatus(String orderNo) throws Exception {
log.warn("根据订单号核实订单状态 ===> {}", orderNo);
// 1、调用微信支付查单接口
String result = this.queryOrderStatus(orderNo);
// 2、JSON转Map
Map<String, Object> resultMap = JSON.parseObject(result, HashMap.class);
// 3、获取微信支付端的订单状态
String tradeState = (String) resultMap.get("trade_state");
// 4、判断订单状态
if (WxTradeState.SUCCESS.getType().equals(tradeState)) {
log.warn("核实订单已支付 ===> {}", orderNo);
// 5、如果确认订单已支付则更新本地订单状态
iOrderInfoService.updateOrderStatus(orderNo, OrderStatus.SUCCESS);
// 6、记录支付日志
iPaymentInfoService.createPaymentInfo(resultMap);
}
if (WxTradeState.NOTPAY.getType().equals(tradeState)) {
log.warn("核实订单未支付 ===> {}", orderNo);
//更新本地订单状态
iOrderInfoService.updateOrderStatus(orderNo, OrderStatus.CLOSED);
}
}