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

Java微信支付接入(9) - API V3 微信支付查单API

1.查单接口的调用

        商户后台未收到异步支付结果通知时,商户应该主动调用《微信支付查单接口》,同步订单状态。

WxPayController

/*** 查询订单* @param orderNo* @return* @throws URISyntaxException* @throws IOException*/
@ApiOperation("查询订单:测试订单状态用")
@GetMapping("query/{orderNo}")
public R queryOrder(@PathVariable String orderNo) throws Exception {log.info("查询订单");String bodyAsString = wxPayService.queryOrder(orderNo);return R.ok().setMessage("查询成功").data("bodyAsString", bodyAsString);
}

WxPayService

/*** 查单接口调用*/
@Override
public String queryOrder(String orderNo) throws Exception {log.info("查单接口调用 ===> {}", orderNo);String url = String.format(WxApiType.ORDER_QUERY_BY_NO.getType(), orderNo);url = wxPayConfig.getDomain().concat(url).concat("?
mchid=").concat(wxPayConfig.getMchId());HttpGet httpGet = new HttpGet(url);httpGet.setHeader("Accept", "application/json");//完成签名并执行请求CloseableHttpResponse response = wxPayClient.execute(httpGet);try {String bodyAsString = EntityUtils.toString(response.getEntity());//响应体int statusCode = response.getStatusLine().getStatusCode();//响应状态码if (statusCode == 200) { //处理成功log.info("成功, 返回结果 = " + bodyAsString);} else if (statusCode == 204) { //处理成功,无返回Bodylog.info("成功");} else {log.info("Native下单失败,响应码 = " + statusCode+ ",返回结果 = " + 
bodyAsString);throw new IOException("request failed");}return bodyAsString;} finally {response.close();}
}

集成Spring Task

Spring 3.0后提供Spring Task实现任务调度

启动类添加注解 statistics启动类添加注解

@EnableScheduling

定时查找超时订单

(1)WxPayTask

@Resource
private OrderInfoService orderInfoService;
@Resource
private WxPayService wxPayService;
/*** 从第0秒开始每隔30秒执行1次,查询创建超过5分钟,并且未支付的订单*/
@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);}
}

OrderInfoService

/*** 找出创建超过minutes分钟并且未支付的订单* @param minutes* @return*/
@Override
public List<OrderInfo> getNoPayOrderByDuration(int minutes) {//minutes分钟之前的时间Instant instant = Instant.now().minus(Duration.ofMinutes(minutes));QueryWrapper<OrderInfo> queryWrapper = new QueryWrapper<>();queryWrapper.eq("order_status", OrderStatus.NOTPAY.getType());queryWrapper.le("create_time", instant);List<OrderInfo> orderInfoList = baseMapper.selectList(queryWrapper);return orderInfoList;
}

处理超时订单

WxPayService

/*** 根据订单号查询微信支付查单接口,核实订单状态* 如果订单已支付,则更新商户端订单状态,并记录支付日志* 如果订单未支付,则调用关单接口关闭订单,并更新商户端订单状态* @param orderNo*/
@Override
public void checkOrderStatus(String orderNo) throws Exception {log.warn("根据订单号核实订单状态 ===> {}", orderNo);//调用微信支付查单接口String result = this.queryOrder(orderNo);Gson gson = new Gson();Map resultMap = gson.fromJson(result, HashMap.class);//获取微信支付端的订单状态Object tradeState = resultMap.get("trade_state");//判断订单状态if(WxTradeState.SUCCESS.getType().equals(tradeState)){log.warn("核实订单已支付 ===> {}", orderNo);//如果确认订单已支付则更新本地订单状态orderInfoService.updateStatusByOrderNo(orderNo, OrderStatus.SUCCESS);//记录支付日志paymentInfoService.createPaymentInfo(result);}if(WxTradeState.NOTPAY.getType().equals(tradeState)){log.warn("核实订单未支付 ===> {}", orderNo);//如果订单未支付,则调用关单接口this.closeOrder(orderNo);//更新本地订单状态orderInfoService.updateStatusByOrderNo(orderNo, OrderStatus.CLOSED);}
}


http://www.mrgr.cn/news/51051.html

相关文章:

  • 地平线与英伟达工具链 PTQ 工具功能参数对比与实操
  • 文件IO(Linux文件IO)
  • 二维码生成器 1.02.41| 一站式QR码生成器和美化工具
  • 判断 HTTP/2 多路复用是否在服务器上实现
  • Vue中v-bind对样式控制的增强—(详解v-bind操作class以及操作style属性,附有案例+代码)
  • 10.15学习
  • 【读书笔记-《30天自制操作系统》-28】Day29
  • libaom 源码分析:aomenc.c 文件
  • 【数据结构】二叉树(一)遍历
  • 虚拟机错误:‘VirtualBox Host-Only Ethernet Adapter #2‘
  • 猿人学 — 第1届第4题(解题思路附源码)
  • 前端性能优化之概述篇
  • C/C++语言基础--C++异常看这一篇就够了
  • 关于this指针
  • 海​能​达​一​面
  • 生成一个带有二维数据和对应标签的螺旋形数据集(非线性可分数据集)的代码解析
  • linux线程 | 同步与互斥(上)
  • C语言动态内存开辟
  • 尚硅谷rabbitmq2024 第15-18节 springboot整合与可靠性答疑
  • 在 Spring 中使用 @EhCache 注解作为缓存