Parcourir la source

对可能影响提单是否成功的网络错误做了结合人工方式处理

stanley-king il y a 3 ans
Parent
commit
a6b082aaf7

+ 12 - 0
data/logic/queue.logic.php

@@ -1414,6 +1414,18 @@ class queueLogic
         }
     }
 
+    public function QueryOrderNeterr($params)
+    {
+        $order_id = intval($params['order_id']);
+        if($order_id <= 0) {
+            return callback(false, 'QueryOrderNeterr 参数order_id错误');
+        }
+        else {
+            refill\util::push_query_net($order_id);
+            return callback(true, '成功放入通知队列', ['order_id' => $order_id]);
+        }
+    }
+
     public function AysncAddDispatcher($params)
     {
         $method = $params['method'];

+ 63 - 8
helper/refill/RefillBase.php

@@ -283,10 +283,10 @@ class RefillBase
         {
             Log::record("canot find any providers",Log::DEBUG);
             if($overload) {
-                return [errcode::PROVIDER_OVERLOAD, "匹配不到合适的充值通道",$last_orderid,false];
+                return [errcode::PROVIDER_OVERLOAD, "匹配不到合适的充值通道",$last_orderid,false,0];
             }
             else {
-                return [errcode::CANNOT_MATCH_PROVIDER, "匹配不到合适的充值通道",$last_orderid,false];
+                return [errcode::CANNOT_MATCH_PROVIDER, "匹配不到合适的充值通道",$last_orderid,false,0];
             }
         }
 
@@ -301,13 +301,13 @@ class RefillBase
             $mch_amount = $mch_price * $quantity;
         }
         catch (Exception $ex) {
-            return [errcode::MERCHANT_PRICE_UNSETTING, "没有协商商品价格",$last_orderid,false];
+            return [errcode::MERCHANT_PRICE_UNSETTING, "没有协商商品价格",$last_orderid,false,0];
         }
 
         $available = $minfo->available_predeposit();
         if ($mch_amount > $available) {
             Log::record("下单时机构余额不足,可用余额为:{$available}", Log::DEBUG);
-            return [errcode::MERCHANT_SHORT_MONEY, "余额不足支付订单",$last_orderid,false];
+            return [errcode::MERCHANT_SHORT_MONEY, "余额不足支付订单",$last_orderid,false,0];
         }
 
         $refill_state = false;
@@ -435,7 +435,7 @@ class RefillBase
 
                 //如果对方没有回调能力,则启动主动查询.
                 if($provider->callback() === false) {
-                    QueueClient::async_push("QueryRefillState",['order_id' => $order_id],180);
+                    QueueClient::async_push("QueryRefillState",['order_id' => $order_id],60);
                 }
 
                 break;
@@ -443,7 +443,7 @@ class RefillBase
             else
             {
                 if($neterr && util::need_check($net_errno)) {
-                    //
+                    $mod_refill->edit($order_id, ['neterr' => 1,'err_msg' => "neterr={$net_errno}"]);
                     break;
                 }
 
@@ -579,7 +579,6 @@ class RefillBase
 
             [$state, $order_state] = $provider->query($refill_info);
             if(!$state) {
-//                QueueClient::async_push("QueryRefillState",['order_id' => $order_id],180);
                 return false;
             }
             elseif($order_state == ORDER_STATE_SUCCESS) {
@@ -589,13 +588,69 @@ class RefillBase
                 $this->proc_notify($order_id,false,true,$chname);
             }
             else {
-//                QueueClient::async_push("QueryRefillState",['order_id' => $order_id],180);
             }
         }
         
         return true;
     }
 
+    public function query_net($order_id)
+    {
+        $mod_order = Model('vr_order');
+        $order_info = $mod_order->getOrderInfo(['order_id' => $order_id]);
+
+        if(empty($order_info)) return false;
+
+        $mod_refill = Model('refill_order');
+        $refill_info = $mod_refill->getOrderInfo(['order_id' => $order_id,'inner_status' => 0]);
+        $chname = $refill_info['channel_name'];
+
+        try
+        {
+            $tran = new trans_wapper($mod_order,'query order state trans');
+            $order_info = $mod_order->getOrderInfo(['order_id' => $order_id],'*',true,true);
+            if($order_info['order_state'] == ORDER_STATE_PAY) {
+                $query_able = true;
+            }
+            else {
+                $query_able = false;
+            }
+            $tran->commit();
+        }
+        catch (Exception $ex) {
+            $tran->rollback();
+            Log::record($ex->getMessage(),Log::ERR);
+        }
+
+        if($query_able)
+        {
+            if(empty($chname)) return false;
+
+            $provider = $this->mPolicy->provider($chname);
+            if(empty($provider)) return false;
+
+            [$state, $order_state] = $provider->query($refill_info);
+            if(!$state) {
+                QueueClient::async_push("QueryOrderNeterr",['order_id' => $order_id],5);
+                return false;
+            }
+            elseif($order_state == ORDER_STATE_SUCCESS || $order_state == ORDER_STATE_CANCEL)
+            {
+                $logic_vr_order = Logic("vr_order");
+                $logic_vr_order->changeOrderStateSend($order_id);
+
+                $data = ['commit_time' => time()];
+                $mod_refill->edit($order_id, $data);
+                QueueClient::async_push("QueryRefillState",['order_id' => $order_id],1);
+            }
+            else {
+                QueueClient::async_push("QueryOrderNeterr",['order_id' => $order_id],5);
+            }
+        }
+
+        return true;
+    }
+
     public function manual_success($order_id)
     {
         $order_id = intval($order_id);

+ 10 - 0
helper/refill/util.php

@@ -260,6 +260,16 @@ class util
         }
     }
 
+    public static function push_query_net($order_id)
+    {
+        try {
+            $ret = queue\DispatcherClient::instance()->push('query_net', ['order_id' => $order_id]);
+            return $ret !== false;
+        } catch (Exception $ex) {
+            return false;
+        }
+    }
+
     public static function manual_success($order_id)
     {
         try {

+ 4 - 3
rdispatcher/processor.php

@@ -30,9 +30,7 @@ class processor extends queue\ILooper
             {
                 if ($method == 'add') {
                     $this->mProxy->add($params);
-                }
-                elseif ($method == 'notify')
-                {
+                } elseif ($method == 'notify') {
                     $channel = $params['channel'];
                     $input = $params['params'];
 
@@ -46,6 +44,9 @@ class processor extends queue\ILooper
                 } elseif ($method == 'query') {
                     $order_id = intval($params['order_id']);
                     $this->mProxy->query($order_id);
+                } elseif ($method == 'query_net') {
+                    $order_id = intval($params['order_id']);
+                    $this->mProxy->query_net($order_id);
                 } elseif ($method == 'manual_success') {
                     $order_id = intval($params['order_id']);
                     $this->mProxy->manual_success($order_id);

+ 10 - 2
rdispatcher/proxy.php

@@ -84,7 +84,7 @@ class proxy
             $fNotify = true;
             if($errcode === refill\errcode::MERCHANT_REFILL_ERROR && $neterr && util::need_check($net_errno)) {
                 $fNotify = false;
-                //检查状态
+                QueueClient::async_push("QueryOrderNeterr",['order_id' => $order_id],5);
             }
             elseif(($errcode === refill\errcode::MERCHANT_REFILL_ERROR && $neterr) || $errcode == refill\errcode::PROVIDER_OVERLOAD || $errcode == errcode::MERCHANT_PRICE_UNSETTING)
             {
@@ -149,6 +149,10 @@ class proxy
     {
         return refill\RefillFactory::instance()->query($order_id);
     }
+    public function query_net($order_id)
+    {
+        return refill\RefillFactory::instance()->query_net($order_id);
+    }
     public function manual_success($order_id)
     {
         refill\RefillFactory::instance()->manual_success($order_id);
@@ -191,7 +195,7 @@ class proxy
         refill\util::push_queue_order($mchid,$mch_order,ORDER_STATE_SEND);
         refill\util::incr_user_commit($mchid,$card_type,$amount,$org_quality);
 
-        [$errcode, $errmsg, $order_id, $neterr] = refill\RefillFactory::instance()->add($mchid, $buyer_id, $amount, $card_no,
+        [$errcode, $errmsg, $order_id, $neterr,$net_errno] = refill\RefillFactory::instance()->add($mchid, $buyer_id, $amount, $card_no,
             $mch_order, $idcard, $card_name, $notify_url, $org_quality,$org_quality,
             $order_time, $commit_times, $last_order_id,$card_type,$regin_no,$quantity,$third_params);
 
@@ -208,6 +212,10 @@ class proxy
                     $order_id = $order_info['order_id'];
                 }
             }
+            elseif($errcode === refill\errcode::MERCHANT_REFILL_ERROR && $neterr && util::need_check($net_errno)) {
+                QueueClient::async_push("QueryOrderNeterr",['order_id' => $order_id],5);
+                return;
+            }
             else {
                 $refill_order->edit($order_id, ['notify_time' => time(), 'notify_state' => 1,'is_retrying' => 0]);
             }