From 6acf6357094588946b5528f1ef1ed84a0f1037fd Mon Sep 17 00:00:00 2001 From: huliguo <2023611923@qq.com> Date: 星期五, 13 六月 2025 19:45:27 +0800 Subject: [PATCH] 小程序收付款 --- ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java | 207 ++++++++++++++++++++++++++++++++++++++------------- 1 files changed, 154 insertions(+), 53 deletions(-) diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java index f632abb..948d8fa 100644 --- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java +++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java @@ -33,6 +33,11 @@ import com.ruoyi.order.util.payment.PaymentUtil; import com.ruoyi.order.util.payment.model.*; +import com.ruoyi.order.util.payment.wechat.PayMoneyUtil; +import com.ruoyi.order.util.payment.wx.WechatPayConfig; +import com.ruoyi.order.util.payment.wx.WechatPayService; +import com.ruoyi.order.util.payment.wx.vo.PayResult; +import com.ruoyi.order.util.payment.wx.vo.RefundCallbackResult; import com.ruoyi.order.vo.*; import com.ruoyi.other.api.domain.*; import com.ruoyi.other.api.feignClient.*; @@ -52,6 +57,8 @@ import org.springframework.util.CollectionUtils; import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; import java.math.RoundingMode; @@ -122,6 +129,13 @@ private RegionClient regionClient; @Resource private ApplicationEventPublisher applicationEventPublisher; + + + @Resource + private PayMoneyUtil payMoneyUtil; + + @Resource + private WechatPayService wechatPayService; @Override @@ -433,10 +447,16 @@ BigDecimal paymentAmount = order.getPaymentAmount(); if (BigDecimal.ZERO.compareTo(order.getPaymentAmount()) < 0) {//支付的金额是否大于0 //微信退款 - RefundResult refund = PaymentUtil.refund(order.getOrderNumber(), "R" + order.getOrderNumber(), paymentAmount.doubleValue(), "/order/order/refundPayMoneyCallback"); - if (!"100".equals(refund.getRa_Status())) { - return R.fail(refund.getRc_CodeMsg());//退款失败 + Map<String,String> map = wechatPayService.refund(order.getOrderNumber(), order.getOrderNumber(), order.getPaymentAmount().toString(), order.getPaymentAmount().toString(), "退款", "/order/order/refundPayMoneyCallback"); + +// RefundResult refund = PaymentUtil.refund(order.getOrderNumber(), "R" + order.getOrderNumber(), paymentAmount.doubleValue(), "/order/order/refundPayMoneyCallback"); + if (!"SUCCESS".equals(map.get("return_code"))) { + return R.fail(map.get("return_msg"));//退款失败 } + //这里申请成功后先返回,等待微信退款成功再返回积分这些 + order.setRefundStatus(1); + this.updateById(order); + return R.ok(); } //退款成功再回退积分 AppUser appUser = appUserClient.getAppUserById(order.getAppUserId()); @@ -516,16 +536,90 @@ * @return */ @Override - public R refundPayMoneyCallback(RefundCallbackResult refundCallbackResult) { - String code = refundCallbackResult.getR3_RefundOrderNo().substring(1); - Order order = this.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNumber, code)); - if (null == order || order.getPayStatus() == 1 || order.getOrderStatus() == 6) { + public R refundPayMoneyCallback(String xmlData) { + + RefundCallbackResult result = wechatPayService.processRefundCallback(xmlData); + if (!result.isSuccess()) { + return R.fail(result.getMsg()); + } + + Order order = this.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNumber, result.getOrderNo())); + if (null == order || order.getPayStatus() == 1 || order.getRefundStatus() == 2) { return R.ok(); } - order.setRefundCode(refundCallbackResult.getR5_RefundTrxNo()); +// order.setRefundCode(refundCallbackResult.getR5_RefundTrxNo()); + order.setRefundCode(result.getRefundNo()); order.setRefundStatus(2); order.setRefundTime(LocalDateTime.now()); this.updateById(order); + + //退款成功再回退积分 + AppUser appUser = appUserClient.getAppUserById(order.getAppUserId()); + if (order.getPoint()>0) { + if(null==appUser.getCancelPoint()){ + appUser.setCancelPoint(0); + } + //返回订单抵扣积分 + Integer historicalPoint = appUser.getAvailablePoint(); + Integer availablePoint = appUser.getAvailablePoint() + order.getPoint();//可用积分 + Integer cancelPoint = appUser.getCancelPoint() + order.getPoint();//取消订单积分 + + appUser.setAvailablePoint(availablePoint); + appUser.setCancelPoint(cancelPoint); + appUser.setTotalPoint(appUser.getTotalPoint() + order.getPoint()); + appUserClient.editAppUserById(appUser); + //构建积分流水 + UserPoint userPoint = new UserPoint(); + userPoint.setType(16);//取消订单 + userPoint.setHistoricalPoint(historicalPoint); + userPoint.setVariablePoint(order.getPoint()); + userPoint.setBalance(availablePoint); + userPoint.setCreateTime(LocalDateTime.now()); + userPoint.setAppUserId(order.getAppUserId()); + userPoint.setObjectId(order.getId()); + userPointClient.saveUserPoint(userPoint); + } + + order.setRefundStatus(2); + order.setRefundTime(LocalDateTime.now()); + + //商品销售数量 + OrderGood orderGood = orderGoodService.getOne(new LambdaQueryWrapper<OrderGood>().eq(OrderGood::getOrderId, order.getId())); + goodsClient.editGoodsNum(orderGood.getGoodsId(), -1); + //获取商品json + Goods good = JSON.parseObject(orderGood.getGoodJson(), Goods.class); + GoodsSeckill goodsSeckill = JSON.parseObject(orderGood.getSeckillJson(), GoodsSeckill.class); + + //门店减少冻结资金 即减少余额, 冻结资金=余额-可用资金 + Shop shop = shopClient.getShopById(order.getShopId()).getData(); + + BigDecimal historicalBalance=shop.getBalance();//历史余额 + BigDecimal variableAmount=BigDecimal.ZERO;//变动金额 + if (null != goodsSeckill) { + variableAmount=goodsSeckill.getSellingPrice(); + }else { + variableAmount=good.getSellingPrice(); + } + + BigDecimal balance=shop.getBalance().subtract(variableAmount);//变动后余额 + + shop.setBalance(balance); + shopClient.updateShop(shop); + + //门店余额流水记录 + ShopBalanceStatement shopBalanceStatement = new ShopBalanceStatement(); + shopBalanceStatement.setShopId(shop.getId()); + shopBalanceStatement.setShopName(shop.getName()); + shopBalanceStatement.setShopManagerName(shop.getShopManager()); + shopBalanceStatement.setPhone(shop.getPhone()); + shopBalanceStatement.setType(6);//变更类型,订单退款 + shopBalanceStatement.setHistoricalBalance(historicalBalance); + shopBalanceStatement.setVariableAmount(variableAmount); + shopBalanceStatement.setCreateTime(LocalDateTime.now()); + shopBalanceStatement.setBalance(balance); + shopBalanceStatement.setCreateUserId(appUser.getId()); + shopBalanceStatement.setObjectId(order.getId()); + shopBalanceStatementClient.saveShopBalanceStatement(shopBalanceStatement); return R.ok(); } @@ -913,49 +1007,54 @@ if ( BigDecimal.ZERO.compareTo(paymentMoney) < 0){ //调起微信支付 String goodsNames = goods.getName(); - UniPayResult uniPayResult = PaymentUtil.uniPay(order.getOrderNumber(), paymentMoney.doubleValue(), "购买单品商品", - goodsNames, "", "/order/order/orderPaymentCallback", appUser.getWxOpenid(), null); - if(null == uniPayResult || !"100".equals(uniPayResult.getRa_Code())){ - //支付失败,积分回退 ,删除订单 - //检查是否先有过积分抵扣了,是的话要返回订单已抵扣的积分,以及用户积分流水的删除 - if (order.getPoint()>0) { - //返回订单抵扣积分 - AppUser appUser2 = appUserClient.getAppUserById(order.getAppUserId()); - Integer availablePoint = appUser2.getAvailablePoint();//可用积分 - Integer variablePoint = order.getPoint();//变动积分 - Integer balance = appUser2.getAvailablePoint() + order.getPoint();//变动后积分 - Integer cancelPoint = appUser2.getCancelPoint() + order.getPoint();//取消订单积分 - appUser2.setAvailablePoint(availablePoint); - appUser2.setCancelPoint(cancelPoint); - appUser2.setTotalPoint(appUser2.getTotalPoint() + order.getPoint()); + try { + R r = wechatPayService.unifiedOrder(order.getId().toString(), order.getOrderNumber(), paymentMoney.toString(), "购买单品商品",appUser.getWxOpenid(),"/order/order/orderPaymentCallback"); + if (null == r || 200 != r.getCode()){ + //支付失败,积分回退 ,删除订单 + //检查是否先有过积分抵扣了,是的话要返回订单已抵扣的积分,以及用户积分流水的删除 + if (order.getPoint()>0) { + //返回订单抵扣积分 + AppUser appUser2 = appUserClient.getAppUserById(order.getAppUserId()); + Integer availablePoint = appUser2.getAvailablePoint();//可用积分 + Integer variablePoint = order.getPoint();//变动积分 + Integer balance = appUser2.getAvailablePoint() + order.getPoint();//变动后积分 + Integer cancelPoint = appUser2.getCancelPoint() + order.getPoint();//取消订单积分 + appUser2.setAvailablePoint(availablePoint); + appUser2.setCancelPoint(cancelPoint); + appUser2.setTotalPoint(appUser2.getTotalPoint() + order.getPoint()); - //构建积分流水记录 - UserPoint userPoint = new UserPoint(); - userPoint.setType(16);//取消订单 - userPoint.setHistoricalPoint(availablePoint); - userPoint.setVariablePoint(variablePoint); - userPoint.setBalance(balance); - userPoint.setCreateTime(LocalDateTime.now()); - userPoint.setAppUserId(appUser2.getId()); - userPoint.setObjectId(order.getId()); - userPointClient.saveUserPoint(userPoint); + //构建积分流水记录 + UserPoint userPoint = new UserPoint(); + userPoint.setType(16);//取消订单 + userPoint.setHistoricalPoint(availablePoint); + userPoint.setVariablePoint(variablePoint); + userPoint.setBalance(balance); + userPoint.setCreateTime(LocalDateTime.now()); + userPoint.setAppUserId(appUser2.getId()); + userPoint.setObjectId(order.getId()); + userPointClient.saveUserPoint(userPoint); - appUserClient.editAppUserById(appUser2); + appUserClient.editAppUserById(appUser2); + + } //删除订单 order.setDelFlag(1); orderMapper.updateById(order); + //返回报错信息 + return R.fail(null == r ? "支付失败" : r.getMsg()); } - //返回报错信息 - return R.fail(null == uniPayResult ? "支付失败" : uniPayResult.getRb_CodeMsg()); + /*if(null == uniPayResult || !"100".equals(uniPayResult.getRa_Code())){ + + }*/ + //将支付数据添加到redis队列中,便于定时任务去校验是否完成支付,没有完成支付支付,15分钟后关闭订单。 + long second = LocalDateTime.now().plusMinutes(15).toEpochSecond(ZoneOffset.UTC); + redisTemplate.opsForZSet().add("OrderPayment", order.getId(), second); + return r; + }catch (Exception e){ + e.printStackTrace(); } - String rc_result = uniPayResult.getRc_Result(); - JSONObject jsonObject = JSON.parseObject(rc_result); - jsonObject.put("orderId", order.getId().toString()); - //将支付数据添加到redis队列中,便于定时任务去校验是否完成支付,没有完成支付支付,15分钟后关闭订单。 - long second = LocalDateTime.now().plusMinutes(15).toEpochSecond(ZoneOffset.UTC); - redisTemplate.opsForZSet().add("OrderPayment", order.getOrderNumber(), second); - return R.ok(jsonObject.toJSONString()); + } @@ -993,15 +1092,18 @@ shopBalanceStatement.setCreateUserId(appUser.getId()); shopBalanceStatement.setObjectId(order.getId()); shopBalanceStatementClient.saveShopBalanceStatement(shopBalanceStatement); - return R.ok(order.getId().toString()); + Map<String, String> payParams = new HashMap<>(); + payParams.put("payMethod","3");//给前端标识 3-不需要调微信支付 + payParams.put("orderId",order.getId().toString()); + return R.ok(JSON.toJSONString(payParams)); } /** - * 订单支付回调通知 + * 订单支付回调 处理业务逻辑 */ @Override - public R orderPaymentCallback(UniPayCallbackResult uniPayCallbackResult) { - Order order = orderMapper.selectOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNumber, uniPayCallbackResult.getR2_OrderNo())); + public R orderPaymentCallback(PayResult payResult) { + Order order = orderMapper.selectOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNumber, payResult.getOrderNumber())); if(null == order || order.getPayStatus() == 2){ return R.ok(); } @@ -1017,7 +1119,7 @@ order.setPayStatus(2); //待使用 order.setOrderStatus(3); - String r7TrxNo = uniPayCallbackResult.getR9_BankTrxNo(); + String r7TrxNo = payResult.getTransactionId(); order.setSerialNumber(r7TrxNo); orderMapper.updateById(order); @@ -1068,18 +1170,17 @@ long second = LocalDateTime.now().toEpochSecond(ZoneOffset.UTC); Set<String> orderPayment = redisTemplate.opsForZSet().rangeByScore("OrderPayment", 0, second); if(orderPayment.size() > 0){ - List<Order> list = orderMapper.selectList(new LambdaQueryWrapper<Order>().in(Order::getOrderNumber, orderPayment)); + List<Order> list = orderMapper.selectList(new LambdaQueryWrapper<Order>().in(Order::getId, orderPayment)); for (Order order : list) { if(null == order || order.getPayStatus() != 1){ redisTemplate.opsForZSet().remove("OrderPayment", order.getOrderNumber()); continue; } //开始执行关闭订单操作 - CloseOrderResult closeOrderResult = PaymentUtil.closeOrder(order.getOrderNumber()); - if((null == closeOrderResult || !closeOrderResult.getRa_Status().equals("100")) && - Arrays.asList("0", "4", "101", "10080000", "10080002", "10083004", "10083005").contains(closeOrderResult.getRb_Code())){ + Map<String, String> map = wechatPayService.closeOrder(order.getOrderNumber()); + if((null == map || !map.get("return_code").equals("SUCCESS"))){ redisTemplate.opsForZSet().add("OrderPayment", order.getOrderNumber(), 0); - log.error("关闭订单失败:{}---->{}", order.getOrderNumber(), JSON.toJSONString(closeOrderResult)); + log.error("关闭订单失败:{}---->{}", order.getOrderNumber(), map.get("return_msg")); } redisTemplate.opsForZSet().remove("OrderPayment", order.getOrderNumber()); //关闭订单后,检查是否先有过积分抵扣了,是的话要返回订单已抵扣的积分,以及用户积分流水的删除, 删除订单 -- Gitblit v1.7.1