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

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) { //处理成功,无返回Body
            log.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.kler.cn/a/349251.html

相关文章:

  • Linux的zookeeper安装部署
  • Agent自动执行异常场景下,通过人工介入提高可用性|实在Agent研究
  • FLINK SQL语法(1)
  • Python中的`raise`语句:如何优雅地处理异常?
  • 商标侵权屡禁不止,保护之路何去何从
  • jupyterlab的安装与使用攻略/包括汉化方法
  • 【Redis】Set类型常用命令
  • CSS伪元素详解
  • 【火山引擎】调用火山大模型的方法 | SDK安装 | 配置 | 客户端初始化 | 设置
  • leetcode hot 100 之【LeetCode 283. 移动零】 java实现
  • 10.15学习
  • 电子电气架构---软件定义汽车,产业变革
  • C语言笔记 13
  • 【Fargo】2:发送侧流量统计
  • 使用redis存储股股票数据及近一个月的行情数据
  • 【深度学习系统】Lecture 2 - ML Refresher / Softmax Regression
  • 偷啥的都有!
  • 基于JAVA+SpringBoot+Vue的旅游管理系统
  • kubernetes自定义pod启动用户
  • Android TextView实现一串文字特定几个字改变颜色