diff --git a/mallinkCApi/src/main/java/com/iformall/controller/WxPayOrderController.java b/mallinkCApi/src/main/java/com/iformall/controller/WxPayOrderController.java index e59e1cb2f..1a4c3b8a2 100644 --- a/mallinkCApi/src/main/java/com/iformall/controller/WxPayOrderController.java +++ b/mallinkCApi/src/main/java/com/iformall/controller/WxPayOrderController.java @@ -107,6 +107,7 @@ public class WxPayOrderController extends BaseController { payOrder.setFailReason(reasonStr); try { if(status.equals(EnumPayStatus.PAY_STATUS_SUCCESS.getCode()) && !payOrderIdStr.equals("0")) { + // 前端提示支付成功, 不作为支付成功标志,只检查支付订单状态 // 有价券不走update, callback更新 payOrder = wxPayOrderService.getById(payOrderId); if(payOrder.getPayOrderStatus().equals(EnumPayStatus.PAY_STATUS_SUCCESS.getCode())) { @@ -115,7 +116,13 @@ public class WxPayOrderController extends BaseController { return new ResultData(ErrorCode.PAY_ORDER_ERROR, "支付未状态,请等待!!"); } } else { - wxPayOrderService.handlePayOrderStatusUpdate(payOrder); + // 1. 免费券,status = 1,成功 + // 2. 有价券,status = 2,取消支付 + if(status.equals(EnumPayStatus.PAY_STATUS_SUCCESS.getCode())) { + wxPayOrderService.handlePayOrderStatusUpdate(payOrder, 1); + } else if (status.equals(EnumPayStatus.PAY_STATUS_FAIL.getCode())) { + wxPayOrderService.handlePayOrderStatusUpdate(payOrder, 2); + } } return new ResultData(Result.SUCCESS, "支付状态更新成功"); } catch (MallinkException e) { diff --git a/mallinkSchedule/src/main/java/com/iformall/schedule/OrderExpiringSchedule.java b/mallinkSchedule/src/main/java/com/iformall/schedule/OrderExpiringSchedule.java index 5daee43af..b315119fd 100644 --- a/mallinkSchedule/src/main/java/com/iformall/schedule/OrderExpiringSchedule.java +++ b/mallinkSchedule/src/main/java/com/iformall/schedule/OrderExpiringSchedule.java @@ -2,6 +2,7 @@ package com.iformall.schedule; import com.iformall.domain.po.WxOrder; import com.iformall.enums.EnumOrderStatus; +import com.iformall.enums.EnumOrderType; import com.iformall.mapper.WxOrderMapper; import com.iformall.service.WxOrderService; import org.slf4j.Logger; @@ -37,7 +38,8 @@ public class OrderExpiringSchedule { Map dateMap = new HashMap(); Date curDate = new Date(); - //dateMap.put("startDate",new Date(curDate.getTime() - 2*TIME_OUT_VALUE)); + // 只检查券相关订单 + dateMap.put("type", EnumOrderType.COUPON.getCode()); dateMap.put("endDate", new Date(curDate.getTime() - TIME_OUT_VALUE )); List wxOrderList = wxOrderMapper.findListOfUnpaidOrderByDate(dateMap); @@ -49,6 +51,7 @@ public class OrderExpiringSchedule { @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) public void orderExpired(WxOrder order) { order.setUpdateDate(new Date()); + order.setType(EnumOrderType.COUPON.getCode()); order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_OVERTIME_CANCEL.getCode()); wxOrderMapper.updateByPrimaryKeySelective(order); diff --git a/mallinkService/src/main/java/com/iformall/service/WxPayOrderService.java b/mallinkService/src/main/java/com/iformall/service/WxPayOrderService.java index e25731ff9..b90d6f058 100644 --- a/mallinkService/src/main/java/com/iformall/service/WxPayOrderService.java +++ b/mallinkService/src/main/java/com/iformall/service/WxPayOrderService.java @@ -79,7 +79,7 @@ public interface WxPayOrderService { * * @param record */ - void handlePayOrderStatusUpdate(WxPayOrder record); + void handlePayOrderStatusUpdate(WxPayOrder record, int status); /** * 页面回调 diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java index b8e7fe81b..e6e2e8cfd 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java @@ -771,14 +771,16 @@ public class WxOrderServiceImpl implements WxOrderService { payOrderQ.setPayOrderStatus(EnumPayStatus.PAY_STATUS_WAIT.getCode()); List payOrders = wxPayOrderMapper.select(payOrderQ); + // 3. wx pay order close for(WxPayOrder payOrder: payOrders) { - // 3. wx pay order close try { - ResultData payclose = wxPayOrderService.payOrderClose(appInfo, payOrder); + wxPayOrderService.payOrderClose(appInfo, payOrder); } catch (Exception e) { logger.error("微信关单失败:" + e.getMessage()); + throw new MallinkException(ErrorCode.PAY_ORDER_ERROR); } } + return new ResultData(); } diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java index dac3b1a63..9b3c56c0c 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java @@ -139,8 +139,14 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { record.setPayOrderStatus(EnumPayStatus.PAY_STATUS_WAIT.getCode()); List list = wxPayOrderMapper.findList(record); String payOrderNo = ""; - if (list.size() <= 0) { - // 3. 创建支付订单 + if (list.size() > 0) { + // 3.0 已有支付订单,关闭之前的 + payOrderClose(appInfo, list.get(0)); + } + + + { + // 3.1 创建支付订单 Long id = idworker.nextId(); payOrderNo = String.valueOf(id); record.setId(id); @@ -168,10 +174,6 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { logger.error("pay order insert error: " + record.toString()); throw new MallinkException(ErrorCode.DB_FAIL); } - } else { - record = list.get(0); - record.setShare(isShare.getCode()); - payOrderNo = String.valueOf(record.getId()); } @@ -837,8 +839,13 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { if ("SUCCESS".equalsIgnoreCase(return_code)) { if ("SUCCESS".equals(result_code)) { record.setPayOrderStatus(EnumPayStatus.PAY_STATUS_CANCEL.getCode()); - handlePayOrderStatusUpdate(record); - return new ResultData(Result.SUCCESS, "订单关闭成功", returnMap); + record.setUpdateTime(new Date()); + try { + wxPayOrderMapper.updateByPrimaryKeySelective(record); + } catch (Exception e) { + logger.error("pay order 关单:{} 成功", record.getId()); + } + return new ResultData(Result.SUCCESS, "支付订单关闭成功", returnMap); } else { String errMsg = ""; JSONObject errObj = errorMapClose.getJSONObject(result_code); @@ -1319,7 +1326,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { @Override @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) - public void handlePayOrderStatusUpdate(WxPayOrder record) { + public void handlePayOrderStatusUpdate(WxPayOrder record, int status) { // 判断支付状态 if (record.getPayOrderStatus() == EnumPayStatus.PAY_STATUS_WAIT.getCode()) { logger.error("pay handle, payOrder " + record.getPayOrderNo() + @@ -1348,80 +1355,51 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { Date currentDate = new Date(); if (record.getId() > 0) { + // 有价券 // 1. get appinfo WxAppinfo appInfo = getWxAppinfo(order.getType(), order.getTenantId()); - WxPayOrder updateOrder = null; - - // 检查支付订单状态 - WxPayOrder payOrderQ = new WxPayOrder(); - payOrderQ.setId(record.getId()); - payOrderQ.setTenantId(order.getTenantId()); - payOrderQ.setOrderId(record.getOrderId()); - try { - updateOrder = wxPayOrderMapper.selectOne(payOrderQ); - } catch (Exception e) { - logger.error(e.getMessage()); - throw new MallinkException(ErrorCode.PAY_ORDER_NOT_FOUND); - } - - if (record.getPayOrderStatus() == EnumPayStatus.PAY_STATUS_FAIL.getCode()) { - // 支付订单失败,取消此订单 - if (record.getPayAmount() > 0) { - payOrderQ = new WxPayOrder(); - payOrderQ.setTenantId(order.getTenantId()); - payOrderQ.setOrderId(record.getOrderId()); - payOrderQ.setPayOrderStatus(EnumPayStatus.PAY_STATUS_WAIT.getCode()); - List payOrders = wxPayOrderMapper.select(payOrderQ); - for (WxPayOrder payOrder : payOrders) { - payOrderClose(appInfo, payOrder); - } - } - } else { - // 支付订单成功? - if (updateOrder.getPayOrderStatus().equals(EnumPayStatus.PAY_STATUS_SUCCESS.getCode())) { - if (StringUtils.isNotBlank(updateOrder.getTransactionId())) { - // 回调已设置成功 - // 继续修改订单状态 - } else { - // 回调异常 - throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), "transactionId未获取"); - } - } else if (updateOrder.getPayOrderStatus().equals(EnumPayStatus.PAY_STATUS_WAIT.getCode())) { - // 回调未返回,主动检查支付订单状态 - try { - record.setPayOrderNo(String.valueOf(record.getId())); - String response = wechatPayOrderQuery(appInfo, record); + if (2 == status) { + // 前端支付取消, + // 回调未返回,主动检查支付订单状态 + try { + record.setPayOrderNo(String.valueOf(record.getId())); + String response = wechatPayOrderQuery(appInfo, record); - logger.info("pay order query, " + record.toString() + ", response: " + response); - Map returnMap = WxPayment.xmlToMap(response); - String result_code = returnMap.get("result_code"); - if ("SUCCESS".equals(result_code)) { - String trade_state = returnMap.get("trade_state"); - //SUCCESS—支付成功 - //REFUND—转入退款 - //NOTPAY—未支付 - //CLOSED—已关闭 - //REVOKED—已撤销(刷卡支付) - //USERPAYING--用户支付中 - //PAYERROR--支付失败(其他原因,如银行返回失败) - if ("SUCCESS".equals(trade_state)) { - // 查询支付订单 -- 已支付 - // 继续更改状态 - } else if ("USERPAYING".equals(trade_state)) { - // 继续检查状态 - } else { - // 支付订单未成功,返回异常 - throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), "支付订单未成功"); + logger.info("pay order query, " + record.toString() + ", response: " + response); + Map returnMap = WxPayment.xmlToMap(response); + String result_code = returnMap.get("result_code"); + if ("SUCCESS".equals(result_code)) { + String trade_state = returnMap.get("trade_state"); + //SUCCESS—支付成功 + //REFUND—转入退款 + //NOTPAY—未支付 + //CLOSED—已关闭 + //REVOKED—已撤销(刷卡支付) + //USERPAYING--用户支付中 + //PAYERROR--支付失败(其他原因,如银行返回失败) + if ("SUCCESS".equals(trade_state)) { + // 查询支付订单 -- 已支付 + // 继续更改状态 + } else if ("USERPAYING".equals(trade_state)) { + // 继续检查状态 + } else { + // 支付订单未成功,返回异常 + record.setPayOrderStatus(EnumPayStatus.PAY_STATUS_FAIL.getCode()); + try { + wxPayOrderMapper.updateByPrimaryKeySelective(record); + } catch (Exception e) { + logger.error("支付订单失败状态更新异常: " + e.getMessage()); } + throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), "支付订单未成功"); } - } catch (MallinkException e) { - throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); - } catch (RuntimeException e) { - throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); - } catch (Exception e) { - throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); } + } catch (MallinkException e) { + throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); + } catch (RuntimeException e) { + throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); + } catch (Exception e) { + throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); } } } diff --git a/mallinkService/src/main/resources/mapper/WxOrderMapper.xml b/mallinkService/src/main/resources/mapper/WxOrderMapper.xml index 88df11981..5f74a3a74 100644 --- a/mallinkService/src/main/resources/mapper/WxOrderMapper.xml +++ b/mallinkService/src/main/resources/mapper/WxOrderMapper.xml @@ -129,6 +129,9 @@ from wx_order where order_status = '0' + + AND type = #{type,jdbcType=TINYINT} + AND create_date > #{startDate,jdbcType=TIMESTAMP}