stanley-king преди 1 година
родител
ревизия
64f440203d

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

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

+ 95 - 2
helper/refill/RefillBase.php

@@ -536,9 +536,8 @@ class RefillBase
 
                 //如果对方没有回调能力,则启动主动查询.
                 if($provider->callback() === false) {
-                    QueueClient::async_push("QueryRefillState",['order_id' => $order_id],60);
+                    QueueClient::async_push("QueryAutoRefillState",['order_id' => $order_id,'query_times' => 0],5);
                 }
-
                 break;
             }
             else
@@ -895,6 +894,100 @@ class RefillBase
         return $ret;
     }
 
+    public function query_auto($order_id,$query_times)
+    {
+        $query_handler = function ($order_id, $order_info, $state, $order_state, $chname,$order_time)
+        {
+            $mod_refill = Model('refill_order');
+            if ($order_info['order_state'] == ORDER_STATE_PAY) {
+                $query_able = true;
+            } else {
+                $query_able = false;
+            }
+            $vr_part = util::part_vr_order(intval($order_info['add_time']));
+
+            $can_try = false;
+            if($query_able)
+            {
+                if(!$state) {
+                    QueueClient::async_push("QueryOrderNeterr",['order_id' => $order_id],30);
+                    $neterr = true;
+                }
+                elseif($order_state == ORDER_STATE_SUCCESS || $order_state == ORDER_STATE_CANCEL)
+                {
+                    $neterr = false;
+                    $logic_vr_order = Logic("vr_order");
+                    $logic_vr_order->changeOrderStateSend($order_id, true, $vr_part);
+
+                    $data = ['commit_time' => time()];
+                    $mod_refill->partition(util::part_refill($order_time))->edit($order_id, $data);
+                    QueueClient::async_push("QueryRefillState", ['order_id' => $order_id], 1);
+                }
+                elseif ($order_state == ORDER_STATE_NOEXIST) {
+                    $neterr = false;
+                    $logic_vr_order = Logic("vr_order");
+                    $logic_vr_order->changeOrderStateSend($order_id, true, $vr_part);
+                    $can_try = true;
+                }
+                else {
+                    $neterr = true;
+                    QueueClient::async_push("QueryOrderNeterr",['order_id' => $order_id],30);
+                }
+
+                util::monitor_netchk($chname,$neterr);
+            }
+
+            return [true,$can_try];
+        };
+
+        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+        $mod_order = Model('vr_order');
+        $order_info = $mod_order->partition(util::part_notify())->getOrderInfo(['order_id' => $order_id]);
+        if (empty($order_info) || $order_info['order_state'] != ORDER_STATE_PAY) return false;
+
+        $mod_refill = Model('refill_order');
+        $refill_info = $mod_refill->partition(util::part_notify())->getOrderInfo(['order_id' => $order_id,'inner_status' => 0]);
+
+        $chname = $refill_info['channel_name'];
+        $provider = $this->mPolicy->provider($chname);
+        if(empty($provider)) return false;
+
+        $values = $provider->query($refill_info);
+        if (count($values) == 2) {
+            [$state, $order_state] = $values;
+            $official_sn = false;
+        } else {
+            [$state, $order_state, $official_sn] = $values;
+        }
+
+        try {
+            $can_try = false;
+            $tran = new trans_wapper($mod_order, 'query_net change order state trans');
+            $order_info = $mod_order->partition(util::part_notify())->getOrderInfo(['order_id' => $order_id], '*', true, true);
+            $order_time = intval($refill_info['order_time']);
+            [$ret, $can_try] = $query_handler($order_id, $order_info, $state, $order_state, $chname,$order_time);
+            $tran->commit();
+            $trans_succ = true;
+        }
+        catch (Exception $ex) {
+            Log::record("Error:" . $ex->getMessage(), Log::ERR);
+            $trans_succ = false;
+            $tran->rollback();
+            $ret = false;
+        }
+
+        if($can_try)
+        {
+            if($trans_succ) {
+                $this->proc_notify($order_id, false, true, $chname, $official_sn);
+            } else {
+                QueueClient::async_push("QueryOrderNeterr",['order_id' => $order_id],30);
+            }
+        }
+
+        return $ret;
+    }
+
     public function manual_success($order_id)
     {
         $order_id = intval($order_id);

+ 29 - 19
helper/refill/api/xyz/by_online/RefillPhone.php

@@ -189,7 +189,6 @@ class RefillPhone extends refill\IRefillPhone
         $params['sign'] = $sign;
 
         $charge_id = $refill_info['official_sn'];
-
         $resp = http_request(config::QUERY_URL, $params);
         if (empty($resp)) {
             return [false, ''];
@@ -198,34 +197,45 @@ class RefillPhone extends refill\IRefillPhone
         {
             Log::record($resp,Log::DEBUG);
             $resp = json_decode($resp, true);
+
             if (empty($resp)) {
                 return [false, ''];
             }
-            else
+            elseif($resp['code'] === 1000)
             {
-                ksort($resp);
-                $response = new response($resp['data']);
-                $record = $response->find_record($charge_id);
-                if($record !== false)
+                if(empty($resp['data'])) {
+                    //todo not
+                }
+                else
                 {
-                    if ($record->canceled()) {
-                        $order_state = ORDER_STATE_CANCEL;
-                    } elseif ($record->successed()) {
-                        $order_state = ORDER_STATE_SUCCESS;
-                    } else {
-                        $order_state = ORDER_STATE_SEND;
+                    ksort($resp);
+                    $response = new response($resp['data']);
+                    $record = $response->find_record($charge_id);
+                    if($record !== false)
+                    {
+                        if ($record->canceled()) {
+                            $order_state = ORDER_STATE_CANCEL;
+                        } elseif ($record->successed()) {
+                            $order_state = ORDER_STATE_SUCCESS;
+                            $trace_no = $record->trade_id(); //替换成上游订单号
+                        } else {
+                            $order_state = ORDER_STATE_SEND;
+                        }
+
+                        return [true, $order_state];
                     }
 
-                    return [true, $order_state];
-                }
+                    $resp = $resp['data']['result'];
+                    if(isset($resp['X_NODENAME'])) {
+                        $resp['X_NODENAME'] = '';
+                    }
 
-                $resp = $resp['data']['result'];
-                if(isset($resp['X_NODENAME'])) {
-                    $resp['X_NODENAME'] = '';
+                    $resp = json_encode($resp);
+                    return [true, $resp];
                 }
+            }
+            else {
 
-                $resp = json_encode($resp);
-                return [true, $resp];
             }
         }
     }

+ 2 - 1
helper/refill/api/xyz/by_online/hnyd.php

@@ -44,7 +44,8 @@ class record
 
     public function successed()
     {
-        if(empty($this->charge_id()) or empty($this->trade_id()) or $this->fee() <= 0) {
+        $charge_time = $this->charge_time();
+        if(empty($this->charge_id()) or empty($this->trade_id()) or $this->fee() <= 0 or $charge_time=== false or $charge_time <= 0) {
             return false;
         } else {
             return true;

+ 11 - 0
helper/refill/util.php

@@ -322,6 +322,17 @@ class util
             return false;
         }
     }
+    public static function push_auto_query($order_id,$query_times)
+    {
+        try
+        {
+            $ret = self::push_queue('query_auto', ['order_id' => $order_id,'query_times' => $query_times]);
+            return $ret !== false;
+        }
+        catch (Exception $ex) {
+            return false;
+        }
+    }
 
     public static function push_query_net($order_id)
     {

+ 4 - 0
rdispatcher/processor.php

@@ -45,6 +45,10 @@ class processor extends queue\ILooper
                 } elseif ($method == 'query') {
                     $order_id = intval($params['order_id']);
                     $this->mProxy->query($order_id);
+                } elseif ($method == 'query_auto') {
+                    $order_id = intval($params['order_id']);
+                    $query_times = intval($params['query_times']);
+                    $this->mProxy->query_auto($order_id,$query_times);
                 } elseif ($method == 'query_net') {
                     $order_id = intval($params['order_id']);
                     $this->mProxy->query_net($order_id);

+ 5 - 0
rdispatcher/proxy.php

@@ -293,6 +293,11 @@ class proxy
     {
         return refill\RefillFactory::instance()->query($order_id);
     }
+
+    public function query_auto($order_id,$query_times)
+    {
+        return refill\RefillFactory::instance()->query_auto($order_id,$query_times);
+    }
     public function query_net($order_id)
     {
         return refill\RefillFactory::instance()->query_net($order_id);

+ 2 - 2
test/TestRefund.php

@@ -84,12 +84,12 @@ class TestRefund extends TestCase
         $file = fopen(BASE_DATA_PATH . "/log/{$order_sn}.log",'a+');
 
 //        [$succ_add, $msg, $nerr] = $provider->add(18810246909, 4, 1, ['regin_no' => 1, 'order_sn' => $order_sn]);
-//        [$succ_add, $msg, $nerr] = $provider->add(13911129867, 4, 1, ['regin_no' => 1, 'order_sn' => $order_sn]);
+        [$succ_add, $msg, $nerr] = $provider->add(13911129867, 4, 1, ['regin_no' => 1, 'order_sn' => $order_sn]);
 //        [$succ_add, $msg, $nerr] = $provider->add(13925782928, 4, 1, ['regin_no' => 1, 'order_sn' => $order_sn]);
 //        [$succ_add, $msg, $nerr] = $provider->add(15120035568, 4, 1, ['regin_no' => 1, 'order_sn' => $order_sn]);
 //        [$succ_add, $msg, $nerr] = $provider->add(17801048874, 4, 1, ['regin_no' => 1, 'order_sn' => $order_sn]);
 //        [$succ_add, $msg, $nerr] = $provider->add(15951343795, 4, 1, ['regin_no' => 1, 'order_sn' => $order_sn]);
-        [$succ_add, $msg, $nerr] = $provider->add(15064807655, 4, 1, ['regin_no' => 1, 'order_sn' => $order_sn]);
+//        [$succ_add, $msg, $nerr] = $provider->add(15064807655, 4, 1, ['regin_no' => 1, 'order_sn' => $order_sn]);
         $last_tag = '';
         $count = 0;
         while ($succ_add)