| @@ -24,15 +24,17 @@ import com.iformall.common.ResultData; | |||||
| import com.iformall.domain.po.WxAppinfo; | import com.iformall.domain.po.WxAppinfo; | ||||
| import com.iformall.domain.po.WxCUser; | import com.iformall.domain.po.WxCUser; | ||||
| import com.iformall.domain.po.WxCUserBasicInfo; | import com.iformall.domain.po.WxCUserBasicInfo; | ||||
| import com.iformall.domain.po.WxCoupon; | |||||
| import com.iformall.domain.po.WxOrder; | import com.iformall.domain.po.WxOrder; | ||||
| import com.iformall.domain.po.WxPayAccount; | import com.iformall.domain.po.WxPayAccount; | ||||
| import com.iformall.domain.po.WxPayOrder; | import com.iformall.domain.po.WxPayOrder; | ||||
| import com.iformall.enums.EnumCreditLockedStatus; | import com.iformall.enums.EnumCreditLockedStatus; | ||||
| import com.iformall.enums.EnumOrderStatus; | |||||
| import com.iformall.enums.EnumPayStatus; | import com.iformall.enums.EnumPayStatus; | ||||
| import com.iformall.enums.EnumPayWay; | import com.iformall.enums.EnumPayWay; | ||||
| import com.iformall.exception.MallinkException; | import com.iformall.exception.MallinkException; | ||||
| import com.iformall.service.WxCUserBasicInfoService; | import com.iformall.service.WxCUserBasicInfoService; | ||||
| import com.iformall.service.WxOrderGroupService; | |||||
| import com.iformall.service.WxCouponService; | |||||
| import com.iformall.service.WxOrderService; | import com.iformall.service.WxOrderService; | ||||
| import com.iformall.service.WxPayAccountService; | import com.iformall.service.WxPayAccountService; | ||||
| import com.iformall.service.WxPayOrderService; | import com.iformall.service.WxPayOrderService; | ||||
| @@ -62,8 +64,9 @@ public class WxPayOrderController extends BaseController { | |||||
| private WxPayAccountService wxPayAccountService; | private WxPayAccountService wxPayAccountService; | ||||
| @Autowired | @Autowired | ||||
| private WxOrderGroupService orderGroupService; | |||||
| private WxCouponService wxCouponService; | |||||
| //@ApiOperation(value = "发起微信小程序支付订单", notes = "{\"orderId\":\"string\"}") | //@ApiOperation(value = "发起微信小程序支付订单", notes = "{\"orderId\":\"string\"}") | ||||
| @RequestMapping(value = "/create", method = RequestMethod.POST) | @RequestMapping(value = "/create", method = RequestMethod.POST) | ||||
| public ResultData _create(@RequestBody Map<String, String> paramMap, HttpServletRequest request) throws Exception { | public ResultData _create(@RequestBody Map<String, String> paramMap, HttpServletRequest request) throws Exception { | ||||
| @@ -143,8 +146,6 @@ public class WxPayOrderController extends BaseController { | |||||
| payOrder.setPayOrderStatus(status); | payOrder.setPayOrderStatus(status); | ||||
| payOrder.setFailReason(reasonStr); | payOrder.setFailReason(reasonStr); | ||||
| WxOrder order = null; | |||||
| try { | try { | ||||
| //有价券支付成功 | //有价券支付成功 | ||||
| if (status.equals(EnumPayStatus.PAY_STATUS_SUCCESS.getCode())) { | if (status.equals(EnumPayStatus.PAY_STATUS_SUCCESS.getCode())) { | ||||
| @@ -158,34 +159,47 @@ public class WxPayOrderController extends BaseController { | |||||
| if (null == payOrder) { | if (null == payOrder) { | ||||
| return new ResultData(ErrorCode.PAY_ORDER_ERROR, "未查询到payOrder."); | return new ResultData(ErrorCode.PAY_ORDER_ERROR, "未查询到payOrder."); | ||||
| } | } | ||||
| if (payOrder.getPayOrderStatus().equals(EnumPayStatus.PAY_STATUS_SUCCESS.getCode())) { | |||||
| order = wxOrderService.getById(orderId); | |||||
| //如果是拼团,需要处理拼团状态和人数 | |||||
| if(order.getOrderGroupId() != null && !order.getOrderGroupId().equals(0L)) { | |||||
| orderGroupService.afterPaySuccessUpdate(order); | |||||
| } | |||||
| return new ResultData(Result.SUCCESS, "支付状态更新成功", order); | |||||
| } else{ | |||||
| //查询微信订单状态并更新 | |||||
| WxCUser user = getUser(); | |||||
| WxAppinfo appInfo = getAppInfo(user.getAppId()); | |||||
| if (null == appInfo) { | |||||
| return new ResultData(ErrorCode.PAY_ORDER_ERROR, "当前用户appId["+user.getAppId()+"]找不到appInfo"); | |||||
| WxOrder order = wxOrderService.getById(orderId); | |||||
| if (null == order) { | |||||
| return new ResultData(ErrorCode.PAY_ORDER_ERROR, "未查询到Order["+orderId+"]."); | |||||
| } | |||||
| WxCoupon wxCoupon = wxCouponService.getById(order.getProductId()); | |||||
| if (null == wxCoupon) { | |||||
| return new ResultData(ErrorCode.PAY_ORDER_ERROR, "未查询到优惠券[orderId:"+orderId+"]."); | |||||
| } | |||||
| //拼团的订单,如果查询到是拼团待付款的,则重新查询是否已经真的支付,其他的直接返回订单信息 | |||||
| if (wxPayOrderService.isOrderGroupCoupon(payOrder, wxCoupon)) { | |||||
| if (order.getOrderStatus()!=EnumOrderStatus.ORDER_STATUS_COOPERATING_UNPAID.getCode()) { | |||||
| return new ResultData(Result.SUCCESS, "支付状态更新成功", order); | |||||
| } | } | ||||
| WxPayAccount payAccount = wxPayAccountService.getById(appInfo.getPayId()); | |||||
| order = wxOrderService.getById(orderId); | |||||
| try { | |||||
| WxPayOrder wo = wxPayOrderService.handleWxOrderQuery(payOrder, order, appInfo, payAccount, IdWorker.get(),false); | |||||
| if (null != wo) { | |||||
| return new ResultData(Result.SUCCESS, "支付状态更新成功", order); | |||||
| } | |||||
| }catch(MallinkException e) { | |||||
| //已经同步了微信的支付状态,表示已经更新 | |||||
| }else { | |||||
| //非拼团的订单,支付成功,关闭订单,撤销支付订单,支付转退款的,直接返回订单信息,其他需要查询真实支付状态 | |||||
| if (payOrder.getPayOrderStatus().equals(EnumPayStatus.PAY_STATUS_SUCCESS.getCode())|| | |||||
| payOrder.getPayOrderStatus().equals(EnumPayStatus.PAY_STATUS_CLOSE.getCode())|| | |||||
| payOrder.getPayOrderStatus().equals(EnumPayStatus.PAY_STATUS_REVERSE.getCode())|| | |||||
| payOrder.getPayOrderStatus().equals(EnumPayStatus.PAY_STATUS_REFUND.getCode())) { | |||||
| return new ResultData(Result.SUCCESS, "支付状态更新成功", order); | |||||
| } | |||||
| } | |||||
| //查询微信订单状态并更新 | |||||
| WxCUser user = getUser(); | |||||
| WxAppinfo appInfo = getAppInfo(user.getAppId()); | |||||
| if (null == appInfo) { | |||||
| return new ResultData(ErrorCode.PAY_ORDER_ERROR, "当前用户appId["+user.getAppId()+"]找不到appInfo"); | |||||
| } | |||||
| WxPayAccount payAccount = wxPayAccountService.getById(appInfo.getPayId()); | |||||
| try { | |||||
| WxPayOrder wo = wxPayOrderService.handleWxOrderQuery(payOrder, order, appInfo, payAccount, IdWorker.get(),false); | |||||
| if (null != wo) { | |||||
| return new ResultData(Result.SUCCESS, "支付状态更新成功", order); | return new ResultData(Result.SUCCESS, "支付状态更新成功", order); | ||||
| } | } | ||||
| }catch(MallinkException e) { | |||||
| //已经同步了微信的支付状态,表示已经更新 | |||||
| return new ResultData(Result.SUCCESS, "支付状态更新成功", order); | |||||
| } | |||||
| return new ResultData(ErrorCode.PAY_ORDER_ERROR, "查询微信订单支付状态失败,请稍后!"); | |||||
| } | |||||
| return new ResultData(ErrorCode.PAY_ORDER_ERROR, "查询微信订单支付状态失败,请稍后!"); | |||||
| } else if (status.equals(EnumPayStatus.PAY_STATUS_FAIL.getCode())) { | } else if (status.equals(EnumPayStatus.PAY_STATUS_FAIL.getCode())) { | ||||
| // 有价券支付失败 | // 有价券支付失败 | ||||
| wxPayOrderService.handlePayOrderFail(payOrder, EnumPayStatus.PAY_STATUS_FAIL.getCode()); | wxPayOrderService.handlePayOrderFail(payOrder, EnumPayStatus.PAY_STATUS_FAIL.getCode()); | ||||
| @@ -33,9 +33,4 @@ public interface WxOrderGroupService { | |||||
| PageInfo<WxOrderGroupMarketing> queryOrderGroupMarketingList(WxOrderGroupMarketing marketing, Integer pageNum, Integer pageSize); | PageInfo<WxOrderGroupMarketing> queryOrderGroupMarketingList(WxOrderGroupMarketing marketing, Integer pageNum, Integer pageSize); | ||||
| /** | |||||
| * 支付成功之后,更新接口调用 | |||||
| */ | |||||
| void afterPaySuccessUpdate(WxOrder order); | |||||
| } | } | ||||
| @@ -7,6 +7,7 @@ import com.iformall.common.IdWorker; | |||||
| import com.iformall.common.ResultData; | import com.iformall.common.ResultData; | ||||
| import com.iformall.domain.po.WxAppinfo; | import com.iformall.domain.po.WxAppinfo; | ||||
| import com.iformall.domain.po.WxCUser; | import com.iformall.domain.po.WxCUser; | ||||
| import com.iformall.domain.po.WxCoupon; | |||||
| import com.iformall.domain.po.WxMerchantBUser; | import com.iformall.domain.po.WxMerchantBUser; | ||||
| import com.iformall.domain.po.WxOrder; | import com.iformall.domain.po.WxOrder; | ||||
| import com.iformall.domain.po.WxPayAccount; | import com.iformall.domain.po.WxPayAccount; | ||||
| @@ -144,6 +145,8 @@ public interface WxPayOrderService { | |||||
| * @param id | * @param id | ||||
| */ | */ | ||||
| void deleteById(Long id); | void deleteById(Long id); | ||||
| public boolean isOrderGroupCoupon(WxPayOrder record, WxCoupon wxCoupon); | |||||
| } | } | ||||
| @@ -65,57 +65,33 @@ public class WxOrderGroupServiceImpl implements WxOrderGroupService { | |||||
| @Autowired | @Autowired | ||||
| WxCouponChannelMapper wxCouponChannelMapper; | WxCouponChannelMapper wxCouponChannelMapper; | ||||
| @Override | |||||
| public void afterPaySuccessUpdate(WxOrder order) { | |||||
| // 参与拼团 | |||||
| WxOrderGroup wxOrderGroup = wxOrderGroupMapper.selectById(order.getOrderGroupId()); | |||||
| if (null == wxOrderGroup) { | |||||
| //错误,更新状态,定时任务会发起退款,回滚库存 | |||||
| order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_UNPAID.getCode()); | |||||
| wxOrderMapper.updateById(order); | |||||
| throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FAILD.getCode(),"WxOrderGroup is null."+order.getOrderGroupId()); | |||||
| } | |||||
| WxCoupon wxCoupon = wxCouponMapper.selectById(order.getProductId()); | |||||
| if (null == wxCoupon) { | |||||
| throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FAILD.getCode(),"WxCoupon is null. orderId:"+order.getId()); | |||||
| } | |||||
| if (wxOrderGroup.getStatus() == EnumOrderStatus.ORDER_STATUS_COOPERATING_COMPLETE.getCode()) { | |||||
| return; | |||||
| } | |||||
| int remainPeople = updateOrderGroup(wxOrderGroup,order,wxCoupon); | |||||
| if (remainPeople == 0) { | |||||
| actionAfterOrderGroupSuccess(order, order.getOrderGroupId()); | |||||
| } | |||||
| } | |||||
| private int updateOrderGroup(WxOrderGroup wxOrderGroup,WxOrder order, WxCoupon wxCoupon) { | private int updateOrderGroup(WxOrderGroup wxOrderGroup,WxOrder order, WxCoupon wxCoupon) { | ||||
| //锁住人数 | |||||
| long time = System.currentTimeMillis() + RedisLock.LONG_TIMEOUT; | |||||
| String timeStr = String.valueOf(time); | |||||
| boolean grouppeopleLock = redisLock.lock("grouppeopleLock_"+order.getOrderGroupId(), timeStr); | |||||
| if (!grouppeopleLock) { | |||||
| throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FAILD.getCode(),"参团锁定失败,请稍后再试。"); | |||||
| } | |||||
| //此处拼团数量应从订单总数查询 | |||||
| int ordercount = wxOrderService.countGroupOrder(order.getOrderGroupId(),true); | |||||
| Integer remainPeople = wxCoupon.getPressLimitNum()-ordercount; | |||||
| //Integer remainPeople = wxOrderGroup.getRemainPeople()-1; | |||||
| wxOrderGroup.setStatus(remainPeople <= 0 ? EnumOrderStatus.ORDER_STATUS_COOPERATING_COMPLETE.getCode() : wxOrderGroup.getStatus()); | |||||
| wxOrderGroup.setUpdateDate(new Date()); | |||||
| wxOrderGroup.setRemainPeople(remainPeople); | |||||
| logger.info("非首次拼团,更新拼团信息, 剩余人数-1"); | |||||
| int row = wxOrderGroupMapper.updateOrderGroup(wxOrderGroup); | |||||
| if (row != 1) { | |||||
| //错误,更新状态,定时任务会发起退款,回滚库存 | |||||
| order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_UNPAID.getCode()); | |||||
| wxOrderMapper.updateById(order); | |||||
| redisLock.unlock("grouppeopleLock_"+order.getOrderGroupId(), timeStr); | |||||
| throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FAILD.getCode(),"参团失败,将稍后退款."); | |||||
| }else { | |||||
| redisLock.unlock("grouppeopleLock_"+order.getOrderGroupId(), timeStr); | |||||
| } | |||||
| return remainPeople; | |||||
| //锁住人数 | |||||
| long time = System.currentTimeMillis() + RedisLock.LONG_TIMEOUT; | |||||
| String timeStr = String.valueOf(time); | |||||
| boolean grouppeopleLock = redisLock.lock("grouppeopleLock_"+order.getOrderGroupId(), timeStr); | |||||
| if (!grouppeopleLock) { | |||||
| throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FAILD.getCode(),"参团锁定失败,请稍后再试。"); | |||||
| } | |||||
| //此处拼团数量应从订单总数查询,支付成功的就算一个,没支付成功的不算 | |||||
| int ordercount = wxOrderService.countGroupOrder(order.getOrderGroupId(),true); | |||||
| Integer remainPeople = wxCoupon.getPressLimitNum()-ordercount-1; | |||||
| //Integer remainPeople = wxOrderGroup.getRemainPeople()-1; | |||||
| wxOrderGroup.setStatus(remainPeople <= 0 ? EnumOrderStatus.ORDER_STATUS_COOPERATING_COMPLETE.getCode() : wxOrderGroup.getStatus()); | |||||
| wxOrderGroup.setUpdateDate(new Date()); | |||||
| wxOrderGroup.setRemainPeople(remainPeople); | |||||
| logger.info("非首次拼团,更新拼团信息, 剩余人数-1"); | |||||
| int row = wxOrderGroupMapper.updateOrderGroup(wxOrderGroup); | |||||
| if (row != 1) { | |||||
| //错误,更新状态,定时任务会发起退款,回滚库存 | |||||
| order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_UNPAID.getCode()); | |||||
| wxOrderMapper.updateById(order); | |||||
| redisLock.unlock("grouppeopleLock_"+order.getOrderGroupId(), timeStr); | |||||
| throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FAILD.getCode(),"参团失败,将稍后退款."); | |||||
| }else { | |||||
| redisLock.unlock("grouppeopleLock_"+order.getOrderGroupId(), timeStr); | |||||
| } | |||||
| return remainPeople; | |||||
| } | } | ||||
| @Override | @Override | ||||
| @@ -182,6 +182,10 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { | |||||
| public WxPayOrder handleWxOrderQuery(WxPayOrder oldRecord,WxOrder order,WxAppinfo appInfo,WxPayAccount payAccount,IdWorker idworker,boolean repeatPay) { | public WxPayOrder handleWxOrderQuery(WxPayOrder oldRecord,WxOrder order,WxAppinfo appInfo,WxPayAccount payAccount,IdWorker idworker,boolean repeatPay) { | ||||
| Map<String, String> retMap = WxPayOrderServiceHelper.wxOrderPayStatusMap(oldRecord, order, appInfo, payAccount); | Map<String, String> retMap = WxPayOrderServiceHelper.wxOrderPayStatusMap(oldRecord, order, appInfo, payAccount); | ||||
| int wxpaystatus = WxPayOrderServiceHelper.getPayStatusFromMap(retMap, oldRecord.getPayOrderNo()); | int wxpaystatus = WxPayOrderServiceHelper.getPayStatusFromMap(retMap, oldRecord.getPayOrderNo()); | ||||
| //Map<String, String> retMap = new HashMap<String, String>(); | |||||
| //retMap.put("time_end","2020-6-18 10:48:20"); | |||||
| //retMap.put("transaction_id","asdasdasdasdasd"); | |||||
| //int wxpaystatus = EnumPayStatus.PAY_STATUS_SUCCESS.getCode(); | |||||
| if (EnumPayStatus.PAY_STATUS_SUCCESS.getCode()==wxpaystatus) { | if (EnumPayStatus.PAY_STATUS_SUCCESS.getCode()==wxpaystatus) { | ||||
| //直接调用不会触发事务,spring事务基于AOP代理 | //直接调用不会触发事务,spring事务基于AOP代理 | ||||
| WxPayOrderServiceImpl proxy = (WxPayOrderServiceImpl) AopContext.currentProxy(); | WxPayOrderServiceImpl proxy = (WxPayOrderServiceImpl) AopContext.currentProxy(); | ||||
| @@ -1407,7 +1411,8 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { | |||||
| } | } | ||||
| } | } | ||||
| private boolean isOrderGroupCoupon(WxPayOrder record, WxCoupon wxCoupon) { | |||||
| @Override | |||||
| public boolean isOrderGroupCoupon(WxPayOrder record, WxCoupon wxCoupon) { | |||||
| return wxCoupon.getType().equals(EnumCouponType.COUPON_GROUP.getCode()) && wxCoupon.getSalePrice().equals(record.getPayAmount()); | return wxCoupon.getType().equals(EnumCouponType.COUPON_GROUP.getCode()) && wxCoupon.getSalePrice().equals(record.getPayAmount()); | ||||
| } | } | ||||