Browse Source

修复微信无法同步支付状态时可以重复支付,生成重复订单的bug

release_toaliyun_real
xiaohanzi 6 years ago
parent
commit
390e205fe7
2 changed files with 100 additions and 71 deletions
  1. +3
    -1
      mallinkCApi/src/main/java/com/iformall/controller/WxPayOrderController.java
  2. +97
    -70
      mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java

+ 3
- 1
mallinkCApi/src/main/java/com/iformall/controller/WxPayOrderController.java View File

@@ -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);


+ 97
- 70
mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java View File

@@ -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<WxPayOrder> 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<WxPayOrder> 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<WxProfitSharingReceiver> merList = wxProfitSharingReceiverMapper.findList(receiver);
// if (merList.size() > 0) {
// isShare = EnumPayShare.YES;
// } else {
// isShare = EnumPayShare.NO;
// }
// }
// */
//
// //支付中的订单, 都是已经点过支付的订单,要等微信通知更新,不能再操作。
// record.setPayOrderStatus(EnumPayStatus.PAY_STATUS_WAIT.getCode());
// List<WxPayOrder> 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<WxProfitSharingReceiver> 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<WxPayOrder> list = wxPayOrderMapper.findList(record);
String payOrderNo = "";
if (list.size() > 0) {
// 3.0 已有支付订单,关闭之前的
payOrderClose(appInfo, list.get(0));
//一个订单只有一条支付记录。
List<WxPayOrder> 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();


Loading…
Cancel
Save