stanley-king před 1 rokem
rodič
revize
4d007b8efe
3 změnil soubory, kde provedl 49 přidání a 47 odebrání
  1. 11 25
      helper/refill/RefillBase.php
  2. 3 1
      helper/refill/errcode.php
  3. 35 21
      rdispatcher/proxy.php

+ 11 - 25
helper/refill/RefillBase.php

@@ -476,11 +476,6 @@ class RefillBase
             return [errcode::MERCHANT_SHORT_MONEY, "余额不足支付订单",$last_orderid,false,0];
         }
 
-        $refill_state  = false;
-        $order_success = false;
-        $net_errno = '';
-        $neterr = false;
-
         foreach ($providers as $provider)
         {
             $channel_name = $provider->name();
@@ -506,12 +501,13 @@ class RefillBase
             $channel_amount = $ch_price * $order->quantity();
             [$order_success, $order_id, $order_sn] = $this->create_order($order, $goods_id, $minfo, $calc, $channel_name, $channel_amount, $mch_amount);
             $last_orderid = $order_id;
-            if(!$order_success) continue;
+            if(!$order_success) {
+                return [errcode::MERCHANT_REFILL_DBERROR, "充值失败", $last_orderid, false, 0];
+            }
 
             $start = microtime(true);
             $net_errno = "";
             $params = $order->channel_params($order_id, $order_sn, $goods_id, $ch_price);
-
             $card_no = $order->card_no();
             $card_type = $order->card_type();
             $spec = $order->spec();
@@ -546,32 +542,29 @@ class RefillBase
                     $mod_fetch_order->add($fetch_datas);
                 }
                 else {
-                    Log::record("Err refill_type = {$refill_type}",Log::ERR);
+                    Log::record("Err refill_type = $refill_type",Log::ERR);
                 }
 
                 $data = ['commit_time' => $commit_time, 'ch_trade_no' => $trade_no];
                 $mod_refill->partition(util::part_refill($order_time))->edit($order_id, $data);
-                $refill_state = true;
-
                 //如果对方没有回调能力,则启动主动查询.
                 if($provider->callback() === false) {
                     QueueClient::async_push("QueryAutoRefillState",['order_id' => $order_id,'query_times' => 0],3);
                 }
-                break;
+
+                return [true, '', $last_orderid, false, 0];
             }
             else
             {
                 $chfilters->add_channel($channel_name,false);
                 if(!empty($neterr) && util::need_check($net_errno)) {
-                    $mod_refill->partition(util::part_refill($order_time))->edit($order_id, ['commit_time' => time(),'neterr' => 1,'err_msg' => "neterr={$net_errno}"]);
+                    $mod_refill->partition(util::part_refill($order_time))->edit($order_id, ['commit_time' => time(),'neterr' => 1,'err_msg' => "neterr=$net_errno"]);
                     util::monitor_netchk($channel_name,false);
-                    break;
-                } else {
-                    $neterr = false;
-                    $net_errno = 0;
+                    return [errcode::MERCHANT_REFILL_NETERROR, "充值失败", $last_orderid, $neterr, $net_errno];
                 }
 
-                Log::record("channel:{$channel_name} err:{$errmsg}");
+                //可以再提单
+                Log::record("channel:$channel_name err:$errmsg");
                 $logic_vr_order = Logic("vr_order");
                 $order_info = Model('vr_order')->getOrderInfo(['order_id' => $order_id]);
                 $logic_vr_order->changeOrderStateCancel($order_info, '', "调用{$channel_name}接口失败",true,true);
@@ -583,14 +576,7 @@ class RefillBase
             }
         }
 
-        if ($refill_state) {
-            return [true, '', $last_orderid, false, 0];
-        } elseif ($order_success) {
-            return [errcode::MERCHANT_REFILL_ERROR, "充值失败", $last_orderid, $neterr, $net_errno];
-        } else {
-            //订单创建失败,不需要再重试了,可能已经是数据库等系统错误
-            return [errcode::MERCHANT_REFILL_ERROR, "充值失败", $last_orderid, false, 0];
-        }
+        return [errcode::MERCHANT_REFILL_CHLIMIT, "无可用通道", $last_orderid, false, 0];
     }
 
     private function create_order(order $order, $goods_id, $minfo, $calc, $ch_name, $ch_amount, $mch_amount)

+ 3 - 1
helper/refill/errcode.php

@@ -8,8 +8,10 @@ class errcode
 {
     const CANNOT_MATCH_PROVIDER = 202;
     const MERCHANT_SHORT_MONEY = 203;
-    const MERCHANT_REFILL_ERROR = 204;
+    const MERCHANT_REFILL_NETERROR = 204;
     const PROVIDER_OVERLOAD = 205;
     const MERCHANT_PRICE_UNSETTING = 206;
+    const MERCHANT_REFILL_CHLIMIT = 207;
+    const MERCHANT_REFILL_DBERROR = 208;
 
 }

+ 35 - 21
rdispatcher/proxy.php

@@ -1,6 +1,7 @@
 <?php
 declare(strict_types=0);
 
+use refill\PolicyUtil;
 use refill\util;
 
 require_once(BASE_ROOT_PATH . '/helper/model_helper.php');
@@ -197,32 +198,45 @@ class proxy
             return true;
         }
 
+        $reAdder = function($order,$order_id,$order_time,$mod_refill)
+        {
+            [$org_quality,$quality] = refill\RefillFactory::instance()->find_quality($order,true);
+            if(!PolicyUtil::mixed_quality($org_quality)) {
+                return true;
+            }
+
+            $order->set_quality($org_quality,$quality);
+            if ($quality > 0)
+            {
+                if($order_id > 0) {
+                    $mod_refill->partition(util::part_refill($order_time))->edit($order_id, ['is_retrying' => 1]);
+                }
+
+                $params = $order->queue_params();
+                if (!refill\util::push_add($params)) {
+                    $fError = true;
+                } else {
+                    $fError = false;
+                    Log::record("reAdder succ.", Log::DEBUG);
+                }
+            }
+            else {
+                $fError = true;
+            }
+
+            return $fError;
+        };
+
         [$errcode, $errmsg, $order_id, $neterr,$net_errno] = refill\RefillFactory::instance()->add($order);
         if($errcode !== true)
         {
-            if($errcode === refill\errcode::MERCHANT_REFILL_ERROR && $neterr && refill\util::need_check($net_errno)) {
+            //遇到网络错误情况,查询处理
+            if($errcode === refill\errcode::MERCHANT_REFILL_NETERROR && $neterr && refill\util::need_check($net_errno)) {
                 QueueClient::async_push("QueryOrderNeterr",['order_id' => $order_id],15);
                 $fError = false;
             }
-            elseif(($errcode === refill\errcode::MERCHANT_REFILL_ERROR && $neterr))
-            {
-                [$org_quality,$quality] = refill\RefillFactory::instance()->find_quality($order,true);
-                $order->set_quality($org_quality,$quality);
-
-                if ($quality > 0)
-                {
-                    $params['order_id'] = $order_id;
-                    if($order_id > 0) {
-                        $mod_refill->partition(util::part_refill($order_time))->edit($order_id, ['is_retrying' => 1]);
-                    }
-
-                    $params = $order->queue_params();
-                    if (!refill\util::push_add($params)) {
-                        $fError = true;
-                    } else {
-                        $fError = false;
-                    }
-                }
+            elseif (($errcode === refill\errcode::MERCHANT_REFILL_NETERROR && $neterr === false) || $errcode === refill\errcode::MERCHANT_REFILL_CHLIMIT) {
+                $fError = $reAdder($order, $order_id, $order_time, $mod_refill);
             }
             else {
                 $fError = true;
@@ -362,7 +376,7 @@ class proxy
         [$errcode, $errmsg, $order_id, $neterr,$net_errno] = refill\RefillFactory::instance()->add($order);
         if($errcode !== true)
         {
-            if ($errcode === refill\errcode::MERCHANT_REFILL_ERROR && $neterr && refill\util::need_check($net_errno)) {
+            if ($errcode === refill\errcode::MERCHANT_REFILL_NETERROR && $neterr && refill\util::need_check($net_errno)) {
                 return QueueClient::async_push("QueryOrderNeterr", ['order_id' => $order_id], 15);
             } else {
                 return $this->onEerror($order, $need_callback, $errmsg);