From 390e205fe797d60c808f11a923abbcd81b2e19e2 Mon Sep 17 00:00:00 2001 From: xiaohanzi Date: Tue, 9 Jun 2020 18:55:40 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=BE=AE=E4=BF=A1=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E5=90=8C=E6=AD=A5=E6=94=AF=E4=BB=98=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E6=97=B6=E5=8F=AF=E4=BB=A5=E9=87=8D=E5=A4=8D=E6=94=AF=E4=BB=98?= =?UTF-8?q?=EF=BC=8C=E7=94=9F=E6=88=90=E9=87=8D=E5=A4=8D=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/WxPayOrderController.java | 4 +- .../service/impl/WxPayOrderServiceImpl.java | 167 ++++++++++-------- 2 files changed, 100 insertions(+), 71 deletions(-) diff --git a/mallinkCApi/src/main/java/com/iformall/controller/WxPayOrderController.java b/mallinkCApi/src/main/java/com/iformall/controller/WxPayOrderController.java index 56c779ab7..93a3007e7 100644 --- a/mallinkCApi/src/main/java/com/iformall/controller/WxPayOrderController.java +++ b/mallinkCApi/src/main/java/com/iformall/controller/WxPayOrderController.java @@ -69,7 +69,6 @@ public class WxPayOrderController extends BaseController { } WxPayOrder record = new WxPayOrder(); record.setOrderId(orderId); - try { record.setIp(IPUtil.getIpAddr(request)); return wxPayOrderService.createPayOrder(appInfo, user, record, EnumPayWay.PAY_WAY_WECHAT); @@ -129,6 +128,9 @@ public class WxPayOrderController extends BaseController { // 前端提示支付成功, 不作为支付成功标志,只检查支付订单状态 // 有价券不走update, callback更新 payOrder = wxPayOrderService.getById(payOrderId); + if (null == payOrder) { + return new ResultData(ErrorCode.PAY_ORDER_ERROR, "未查询到payOrder."); + } if (payOrder.getPayOrderStatus().equals(EnumPayStatus.PAY_STATUS_SUCCESS.getCode())) { order = wxOrderService.getById(orderId); return new ResultData(Result.SUCCESS, "支付状态更新成功", order); 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 a1a30978f..159173113 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java @@ -180,82 +180,109 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { isShare = EnumPayShare.YES; } - // 1.5 检查是否有已支付订单 - { - WxPayOrder payOrderParams = new WxPayOrder(); - payOrderParams.setOrderId(order.getId()); - payOrderParams.setPayOrderStatus(EnumPayStatus.PAY_STATUS_SUCCESS.getCode()); - QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.setEntity(payOrderParams); - int count = wxPayOrderMapper.selectCount(queryWrapper); - if (count > 0) { - logger.error("已支付>>>" + order); - throw new MallinkException(ErrorCode.PAY_ORDER_EXIST); - } - } +// // 1.5 检查是否有已支付订单 +// { +// WxPayOrder payOrderParams = new WxPayOrder(); +// payOrderParams.setOrderId(order.getId()); +// payOrderParams.setPayOrderStatus(EnumPayStatus.PAY_STATUS_SUCCESS.getCode()); +// QueryWrapper queryWrapper = new QueryWrapper<>(); +// queryWrapper.setEntity(payOrderParams); +// int count = wxPayOrderMapper.selectCount(queryWrapper); +// if (count > 0) { +// logger.error("已支付>>>" + order); +// throw new MallinkException(ErrorCode.PAY_ORDER_EXIST); +// } +// } +// +// /*设置进入分账,待分账时再判断是否存在对应的分账账户 +// // 1.5 check 分账 receive +// if (isShare == EnumPayShare.YES) { +// WxProfitSharingReceiver receiver = new WxProfitSharingReceiver(); +// receiver.setMerchantId(order.getMerchantId()); +// List merList = wxProfitSharingReceiverMapper.findList(receiver); +// if (merList.size() > 0) { +// isShare = EnumPayShare.YES; +// } else { +// isShare = EnumPayShare.NO; +// } +// } +// */ +// +// //支付中的订单, 都是已经点过支付的订单,要等微信通知更新,不能再操作。 +// record.setPayOrderStatus(EnumPayStatus.PAY_STATUS_WAIT.getCode()); +// List list = wxPayOrderMapper.findList(record); +// if (list.size() > 0) { +// logger.error("支付状态等待微信同步中>>>" + order); +// throw new MallinkException(ErrorCode.PAY_ORDER_PAYING.getCode(),"订单支付状态等待微信同步中"); +// // 3.0 已有支付订单,关闭之前的 +// //payOrderClose(appInfo, list.get(0)); +// } - /*设置进入分账,待分账时再判断是否存在对应的分账账户 - // 1.5 check 分账 receive - if (isShare == EnumPayShare.YES) { - WxProfitSharingReceiver receiver = new WxProfitSharingReceiver(); - receiver.setMerchantId(order.getMerchantId()); - List merList = wxProfitSharingReceiverMapper.findList(receiver); - if (merList.size() > 0) { - isShare = EnumPayShare.YES; - } else { - isShare = EnumPayShare.NO; - } - } - */ - - // 2. check 是否有支付中订单 Date currentDate = new Date(); - record.setPayOrderStatus(EnumPayStatus.PAY_STATUS_WAIT.getCode()); - List list = wxPayOrderMapper.findList(record); String payOrderNo = ""; - if (list.size() > 0) { - // 3.0 已有支付订单,关闭之前的 - payOrderClose(appInfo, list.get(0)); + //一个订单只有一条支付记录。 + List list = wxPayOrderMapper.findList(record); + WxPayOrder oldRecord = null; + if (null != list && list.size() > 0) { + oldRecord = list.get(0); } - - - { - // 3.1 创建支付订单 - Long id = idworker.nextId(); - payOrderNo = String.valueOf(id); - record.setId(id); - record.updateTenantInfo(order); - record.setCUserId(user.getId()); - record.setCreateTime(currentDate); - record.setUpdateTime(currentDate); - record.setPayTimeStart(currentDate); - record.setPayTimeEnd(currentDate); - // 支付单号 - record.setPayOrderNo(payOrderNo); - record.setPayAmount(order.getPayment()); - record.setPayVendor(EnumPayWay.PAY_WAY_WEAPP.getCode()); - record.setPayOrderStatus(EnumPayStatus.PAY_STATUS_WAIT.getCode()); - record.setShare(isShare.getCode()); - if (isShare == EnumPayShare.YES) { - // 分账金额 - int iChargeFee = PayUtils.getPayRate(record.getPayAmount(), payAccount.getRate(), false); - Integer share_amount = record.getPayAmount() - iChargeFee; - record.setShareAmount(share_amount); - if(payAccount.getRealRate() != null) { - int iRealChargeFee = PayUtils.getPayRate(record.getPayAmount(), payAccount.getRealRate(), true); - if(iChargeFee > iRealChargeFee) { - record.setRateAmount(iChargeFee - iRealChargeFee); - } - } - } - - int sqlRow = wxPayOrderMapper.insert(record); - if (sqlRow != 1) { - logger.error("pay order insert error: " + record.toString()); - throw new MallinkException(ErrorCode.DB_FAIL); + + if (null != oldRecord) { + //如果是已经支付成功,则不能再次支付。如果是支付中的,也不能再次支付,等待微信同步结果 + if (oldRecord.getPayOrderStatus()==EnumPayStatus.PAY_STATUS_SUCCESS.getCode()) { + logger.error("已支付>>>" + order); + throw new MallinkException(ErrorCode.PAY_ORDER_EXIST); + }else if (oldRecord.getPayOrderStatus()==EnumPayStatus.PAY_STATUS_WAIT.getCode()) { + logger.error("支付中,等待微信同步状态>>>" + order); + throw new MallinkException(ErrorCode.PAY_ORDER_PAYING.getCode(),"订单支付中,等待微信同步状态"); + }else { + //如果是其他状态的,可以重复支付,把状态更新为支付中,不再新增订单 + oldRecord.setPayOrderStatus(EnumPayStatus.PAY_STATUS_WAIT.getCode()); + int sqlRow0 = wxPayOrderMapper.updateById(oldRecord); + if (sqlRow0 != 1) { + logger.error("pay order update error: " + record.toString()); + throw new MallinkException(ErrorCode.DB_FAIL); + } + record = oldRecord; } + }else { + { + // 3.1 创建支付订单 + Long id = idworker.nextId(); + payOrderNo = String.valueOf(id); + record.setId(id); + record.updateTenantInfo(order); + record.setCUserId(user.getId()); + record.setCreateTime(currentDate); + record.setUpdateTime(currentDate); + record.setPayTimeStart(currentDate); + record.setPayTimeEnd(currentDate); + // 支付单号 + record.setPayOrderNo(payOrderNo); + record.setPayAmount(order.getPayment()); + record.setPayVendor(EnumPayWay.PAY_WAY_WEAPP.getCode()); + record.setPayOrderStatus(EnumPayStatus.PAY_STATUS_WAIT.getCode()); + record.setShare(isShare.getCode()); + if (isShare == EnumPayShare.YES) { + // 分账金额 + int iChargeFee = PayUtils.getPayRate(record.getPayAmount(), payAccount.getRate(), false); + Integer share_amount = record.getPayAmount() - iChargeFee; + record.setShareAmount(share_amount); + if(payAccount.getRealRate() != null) { + int iRealChargeFee = PayUtils.getPayRate(record.getPayAmount(), payAccount.getRealRate(), true); + if(iChargeFee > iRealChargeFee) { + record.setRateAmount(iChargeFee - iRealChargeFee); + } + } + } + + int sqlRow = wxPayOrderMapper.insert(record); + if (sqlRow != 1) { + logger.error("pay order insert error: " + record.toString()); + throw new MallinkException(ErrorCode.DB_FAIL); + } + } } - if (payAccount.getType() == EnumPayMode.MCH.getCode()) { // 统一下单 普通商户模式 String noncestr = Utility.generate32UUID();