Sfoglia il codice sorgente

fix(order): 支持红包全额抵扣订单支付

- 允许已使用红包且实付为零的订单通过支付前校验,继续拦截负数及无红包零元订单
- 补充余额支付订单编号校验并按支付与通知场景限制查询字段

API: 调整商城余额支付及订单支付前校验对红包全额抵扣场景的处理
shizhongqi 2 giorni fa
parent
commit
f096c8b179

+ 8 - 4
app-mall/controllers/OrderController.php

@@ -1581,14 +1581,17 @@ class OrderController extends BaseController
     //余额支付 ssh 20250410
     //余额支付 ssh 20250410
     public function actionBalancePay()
     public function actionBalancePay()
     {
     {
-        $post = Yii::$app->request->post();
-        $orderSn = $post['orderSn'] ?? '';
+        $orderSn = Yii::$app->request->post('orderSn');
+        if (empty($orderSn)) {
+            util::fail('订单编号缺失');
+        }
         //避免重复提交
         //避免重复提交
         util::checkRepeatCommit($orderSn, 5);
         util::checkRepeatCommit($orderSn, 5);
         $connection = Yii::$app->db;
         $connection = Yii::$app->db;
         $transaction = $connection->beginTransaction();
         $transaction = $connection->beginTransaction();
         try {
         try {
-            $order = OrderClass::getByCondition(['orderSn' => $orderSn], true);
+            $fields = 'id,orderSn,shopId,sjId,mainId,customId,hdId,customName,shopAdminId,shopAdminName,status,payStatus,deadline,actPrice,realPrice,mainPay,cash,remainDebtPrice,onlinePay,fromType,sendType,showAddress,packingFee,groupBuyId,thirdNo,hbId,hbAmount';
+            $order = OrderClass::getByCondition(['orderSn' => $orderSn], true, null, $fields);
             if (empty($order)) {
             if (empty($order)) {
                 util::fail('没有找到订单');
                 util::fail('没有找到订单');
             }
             }
@@ -1609,7 +1612,8 @@ class OrderController extends BaseController
                 Yii::$app->redis->executeCommand('SETEX', [$cacheKey, 864000, 'has']);
                 Yii::$app->redis->executeCommand('SETEX', [$cacheKey, 864000, 'has']);
 
 
                 //打印小票和语音播报
                 //打印小票和语音播报
-                $order = \bizHd\order\classes\OrderClass::getByCondition(['orderSn' => $orderSn], true);
+                $fields = 'id,orderSn,shopId,mainId,customId,needPrint,payStatus,printNum,fromType,sendType,actPrice,addTime,sendNum,customName,customMobile,shopAdminName,bookName,bookMobile,receiveUserName,receiveMobile,fullAddress,showAddress,reachDate,reachPeriod,anonymity,cardInfo,remark,goodsPrice,sendCost,serviceFee,labourCost,prePrice,orderPrice,discountAmount,realPrice,refundPrice,debt,remainDebtPrice,thirdSn,goodsNum';
+                $order = \bizHd\order\classes\OrderClass::getByCondition(['orderSn' => $orderSn], true, null, $fields);
                 if (!empty($order)) {
                 if (!empty($order)) {
                     \bizHd\order\classes\OrderClass::onlinePrint($order);
                     \bizHd\order\classes\OrderClass::onlinePrint($order);
 
 

+ 13 - 1
biz-hd/order/services/OrderService.php

@@ -8,6 +8,7 @@ use biz\sj\services\SjCapitalService;
 use biz\sj\services\MerchantService;
 use biz\sj\services\MerchantService;
 use bizHd\custom\classes\CustomClass;
 use bizHd\custom\classes\CustomClass;
 use bizHd\goods\classes\GoodsClass;
 use bizHd\goods\classes\GoodsClass;
+use bizHd\hb\classes\HbClass;
 use bizHd\order\classes\OrderClass;
 use bizHd\order\classes\OrderClass;
 use bizHd\order\classes\OrderGoodsClass;
 use bizHd\order\classes\OrderGoodsClass;
 use bizHd\order\classes\OrderItemClass;
 use bizHd\order\classes\OrderItemClass;
@@ -419,7 +420,18 @@ class OrderService extends BaseService
             util::fail('订单已过期');
             util::fail('订单已过期');
         }
         }
         if (ceil($order['actPrice']) <= 0) {
         if (ceil($order['actPrice']) <= 0) {
-            util::fail('订单金额有问题');
+            $hbId = isset($order['hbId']) ? intval($order['hbId']) : 0;
+            if ($hbId <= 0) {
+                $orderId = isset($order['id']) ? intval($order['id']) : 0;
+                if ($orderId > 0) {
+                    $usedHb = HbClass::getByCondition(['orderId' => $orderId, 'status' => 1]);
+                    $hbId = intval($usedHb['id'] ?? 0);
+                }
+            }
+            // 红包全额抵扣后实付可以为 0;无红包的 0 元或负数仍视为金额异常
+            if ($hbId <= 0 || bccomp((string)$order['actPrice'], '0', 2) < 0) {
+                util::fail('订单金额有问题');
+            }
         }
         }
         if ($order['payStatus'] == 1) {
         if ($order['payStatus'] == 1) {
             util::fail('您已经付过了');
             util::fail('您已经付过了');

+ 6 - 1
biz-mall/order/services/OrderService.php

@@ -13,6 +13,7 @@ use bizMall\order\classes\OrderItemClass;
 use bizMall\promote\services\CouponService;
 use bizMall\promote\services\CouponService;
 use bizMall\shop\classes\ShopClass;
 use bizMall\shop\classes\ShopClass;
 use bizMall\user\classes\UserAssetClass;
 use bizMall\user\classes\UserAssetClass;
+use bizHd\hb\classes\HbClass;
 use common\components\dict;
 use common\components\dict;
 use common\components\delivery\platform\fengniao\OrderStatusUtil;
 use common\components\delivery\platform\fengniao\OrderStatusUtil;
 use common\components\imgUtil;
 use common\components\imgUtil;
@@ -299,7 +300,11 @@ class OrderService extends BaseService
             util::fail('订单已过期');
             util::fail('订单已过期');
         }
         }
         if (ceil($order['actPrice']) <= 0) {
         if (ceil($order['actPrice']) <= 0) {
-            util::fail('订单金额有问题');
+            $hbId = isset($order['hbId']) ? intval($order['hbId']) : 0;
+            // 红包全额抵扣后实付可以为 0;无红包的 0 元或负数仍视为金额异常
+            if ($hbId <= 0 || bccomp((string)$order['actPrice'], '0', 2) < 0) {
+                util::fail('订单金额有问题');
+            }
         }
         }
         if ($order['payStatus'] == 1) {
         if ($order['payStatus'] == 1) {
             util::fail('您已经付过了');
             util::fail('您已经付过了');