瀏覽代碼

Merge branch 'rtest' into ralb

stanley-king 3 年之前
父節點
當前提交
a9915b2c46

+ 58 - 14
helper/mtopcard/mtopcard.php

@@ -3,6 +3,7 @@
 namespace mtopcard;
 
 use Log;
+use PHPUnit\SebastianBergmann\Type\UnknownType;
 
 #用户卡的类型
 const UnknownCard = 0;
@@ -235,13 +236,13 @@ function valid_phone($card_no)
 {
     $type_checker = function ($channel)
     {
-        if($channel == '中国联通') {
+        if($channel == '联通') {
             return ChinaUnicomCard;
         }
-        elseif($channel == '中国电信') {
+        elseif($channel == '电信') {
             return ChinaTelecomCard;
         }
-        elseif($channel == '中国移动') {
+        elseif($channel == '移动') {
             return ChinaMobileCard;
         }
         else {
@@ -284,7 +285,7 @@ function valid_phone($card_no)
         }
     };
 
-    $ali = function ($card_no, &$validate, &$card_type, &$region_no) use ($validate_checker, $type_checker, $regin_checker): bool
+    $ali = function ($card_no, &$validate, &$region_no) use ($validate_checker, $regin_checker): bool
     {
         $url = 'https://mobileempty.shumaidata.com/mobileempty';
         $params['mobile'] = $card_no;
@@ -301,7 +302,6 @@ function valid_phone($card_no)
         {
             $data = $resp['data'];
             $validate = $validate_checker(intval($data['status']));
-            $card_type = $type_checker($data['channel']);
             $region_no = $regin_checker($data['area']);
             return true;
         } else {
@@ -310,7 +310,7 @@ function valid_phone($card_no)
         }
     };
 
-    $tianyan = function ($card_no, &$validate, &$card_type, &$region_no) use ($validate_checker, $type_checker, $regin_checker): bool
+    $tianyan = function ($card_no, &$validate, &$region_no) use ($validate_checker, $regin_checker): bool
     {
         $url = 'https://api.shumaidata.com/v4/mobile_empty/check';
         $appid = '2Xfa6IFIPv0sVUjy';
@@ -334,7 +334,6 @@ function valid_phone($card_no)
         {
             $data = $resp['data'];
             $validate = $validate_checker(intval($data['status']));
-            $card_type = $type_checker($data['channel']);
             $region_no = $regin_checker($data['area']);
             return true;
         } else {
@@ -343,24 +342,69 @@ function valid_phone($card_no)
         }
     };
 
+    $tianyan_cardtyper = function ($card_no) use ($type_checker)
+    {
+        $url = 'https://api.shumaidata.com/v4/mobile-transfer/query';
+        $appid = '2Xfa6IFIPv0sVUjy';
+        $appSecurity = '2Xfa6IFIPv0sVUjynOddsfh6KXfbyJ84';
+        $cur = microtime (true);
+
+        $data['appid'] = $appid;
+        $data['timestamp'] = intval($cur * 1000);
+        $content = "{$appid}&{$data['timestamp']}&{$appSecurity}";
+        $data['sign'] = md5($content);
+        $data['mobile'] = $card_no;
+
+        $net_err = 0;
+        $resp = http_request($url, $data, 'GET',false, [],$net_err);
+        if ($resp == false) return false;
+
+        $resp = json_decode($resp, true);
+        if ($resp == false) return false;
+
+        if ($resp['code'] == 200)
+        {
+            $data = $resp['data'];
+            $ispType = $data['ispType'];
+            $newIspType = $data['newIspType'];
+            Log::record("tianyan_transfer phone:{$card_no} ispType:{$ispType} newIspType:{$newIspType}", Log::DEBUG);
+
+            $card_type = $type_checker($newIspType);
+            $isTransfer = $ispType != $newIspType;
+
+            return [true,$card_type,$isTransfer];
+        } else {
+            Log::record("tianyan_transfer phone:{$card_no} return msg:{$resp['msg']}", Log::DEBUG);
+            return [false,UnknownCard,false];
+        }
+    };
+
     $validate = true;
     $card_type = card_type($card_no,$region_no);
     $region_no = -1;
 
     if($card_type == PetroChinaCard || $card_type == SinopecCard) {
-        return [$validate,$card_type,$region_no];
+        return [$validate,$card_type,$region_no,false];
+    }
+
+    [$succ,$_card_type,$_isTransfer] = $tianyan_cardtyper($card_no);
+    if($succ) {
+        $card_type = $_card_type;
+        $isTransfer = $_isTransfer;
+    }
+    else {
+        $isTransfer = false;
     }
 
-    $ret = $tianyan($card_no,$validate,$card_type,$region_no);
+    $ret = $tianyan($card_no,$validate,$region_no);
     if($ret) {
-        return [$validate,$card_type,$region_no];
+        return [$validate,$card_type,$region_no,$isTransfer];
     }
 
-    $ret = $ali($card_no,$validate,$card_type,$region_no);
+    $ret = $ali($card_no,$validate,$region_no);
     if($ret) {
-        return [$validate,$card_type,$region_no];
+        return [$validate,$card_type,$region_no,$isTransfer];
     }
 
-    $card_type = card_type($card_no,$region_no);
-    return [$validate,$card_type,$region_no];
+    return [true,$card_type,-1,false];
 }

+ 7 - 3
helper/refill/RefillBase.php

@@ -46,8 +46,8 @@ class RefillBase
         $this->mPolicy->load();
     }
 
-    public function find_quality($mchid,$spec,$card_type,$org_quality,$times,$period,$pcode = '',$regin_no = -1): array {
-        return $this->mPolicy->find_quality($mchid,$spec,$card_type,$org_quality,$times,$period,$pcode,$regin_no);
+    public function find_quality($mchid,$spec,$card_type,$org_quality,$cur_quality,$times,$period,$pcode = '',$regin_no = -1): array {
+        return $this->mPolicy->find_quality($mchid,$spec,$card_type,$org_quality,$cur_quality,$times,$period,$pcode,$regin_no);
     }
 
     public function notify($chname, $input)
@@ -169,16 +169,19 @@ class RefillBase
         $spec  = intval($refill_info['refill_amount']);
         $card_type = intval($refill_info['card_type']);
         $org_quality = intval($refill_info['org_quality']);
+        $cur_quality = intval($refill_info['quality']); //从数据库中读取的字段。
+
         $used_time = time() - intval($refill_info['order_time']);
         $commit_times = intval($refill_info['commit_times']);
         $regin_no = $refill_info['regin_no'];
 
+
         //三方充值,不做重试
         if($card_type == mtopcard\ThirdRefillCard) {
             return [false,null];
         }
 
-        [$org_quality,$quality] = $this->find_quality($mchid,$spec,$card_type,$org_quality,$commit_times,$used_time,"",$regin_no);
+        [$org_quality,$quality] = $this->find_quality($mchid,$spec,$card_type,$org_quality,$cur_quality,$commit_times,$used_time,"",$regin_no);
         if($quality <= 0) return [false,null];
 
         $params = [ 'mchid' => $refill_info['mchid'],
@@ -188,6 +191,7 @@ class RefillBase
             'card_type' => $refill_info['card_type'],
             'regin_no' => $refill_info['regin_no'],
             'org_quality' => $org_quality,
+            'quality' => $cur_quality,
             'mch_order' =>  $refill_info['mch_order'],
             'notify_url' => $refill_info['notify_url'],
             'idcard' => $refill_info['idcard'] ?? '',

+ 1 - 1
helper/refill/policy/IPolicy.php

@@ -7,7 +7,7 @@ namespace refill;
 interface IPolicy
 {
     //[orgian_quality,current_quality]
-    public function find_quality($mchid, $spec, $card_type, $quality, $times, $used_time, $pcode, $regin_no): array;
+    public function find_quality($mchid, $spec, $card_type, $org_quality,$cur_quality, $times, $used_time, $pcode, $regin_no): array;
 
     public function find_providers(int $mchid, int $spec, int $card_type, int $org_quality, int $quality, $regin_no, $pcode, $order_time, $commit_times): array;
 

+ 2 - 2
helper/refill/policy/lingzh/policy.php

@@ -125,7 +125,7 @@ class policy extends ProviderManager implements IPolicy
         return count($providers);
     }
 
-    public function find_quality($mchid,$spec,$card_type,$org_quality,$times,$used_time,$pcode,$regin_no): array
+    public function find_quality($mchid,$spec,$card_type,$org_quality,$cur_quality,$times,$used_time,$pcode,$regin_no): array
     {
         if($card_type == mtopcard\SinopecCard || $card_type == mtopcard\PetroChinaCard) {
             $caller = new times_caller($mchid,$spec,$card_type,-1,$this);
@@ -133,7 +133,7 @@ class policy extends ProviderManager implements IPolicy
             $caller = null;
         }
 
-        [$org_quality,$qualities] = $this->mQuality->find_quality($mchid,$card_type,$org_quality,$times,$used_time,$caller);
+        [$org_quality,$qualities] = $this->mQuality->find_quality($mchid,$card_type,$org_quality,$cur_quality,$times,$used_time,$caller);
         if(empty($qualities)) {
             return [$org_quality,0];
         }

+ 28 - 24
helper/refill/policy/quaility.php

@@ -8,7 +8,6 @@ use mtopcard;
 class Quality
 {
     const LowestQuality  = 1;
-
     const Normal = 1;
     const Quick = 2;
     const CardKey = 3;
@@ -18,16 +17,12 @@ class Quality
     const SlowTwo = 7;
     const SlowFortyEight = 8;
     const SlowSeventyTwo = 9;
-
     const HighestQuality = 9;
 
-
     const SlowNormal  = 11;  // 7 -> 1
     const ThirdNormal  = 12; // 4 -> 1
-
     const DefSuccess = 13;   // 4 -> 3 -> 1 -> 2
     const NormalQuick = 14;
-
     const SlowSixNormal = 15;
 
     const OilWithoutSN = 1;
@@ -61,13 +56,13 @@ class Quality
         $this->mTryAdjuster->load();
     }
 
-    public function find_quality($mchid, $card_type, $quality, $times, $used_time, $caller): array
+    public function find_quality($mchid, $card_type, $org_quality, $cur_quality, $times, $used_time, $caller): array
     {
         if($card_type == mtopcard\ChinaMobileCard || $card_type == mtopcard\ChinaUnicomCard || $card_type == mtopcard\ChinaTelecomCard) {
-            return $this->mobile_quality($mchid, $quality, $times, $used_time);
+            return $this->mobile_quality($mchid, $org_quality, $cur_quality, $times, $used_time);
         }
         elseif($card_type == mtopcard\PetroChinaCard || $card_type == mtopcard\SinopecCard) {
-            return $this->oil_quality($mchid, $quality, $times,$used_time,$caller);
+            return $this->oil_quality($mchid, $org_quality, $times,$used_time,$caller);
         }
         else {
             return [0, []];
@@ -136,31 +131,30 @@ class Quality
     }
 
 
-    private function mobile_quality($mchid,$quality,$times,$used_time): array
+    private function mobile_quality($mchid, $org_quality, $cur_quality, $times, $used_time): array
     {
-        if($quality == 0)
+        if($org_quality == 0)
         {
             [$success,$setting_quality,$time_out] = $this->mMchPhonectl->getCtls($mchid);
             if($success)
             {
                 if(array_key_exists($setting_quality,$this->mQualities)) {
-                    $org = $setting_quality;
+                    $org_quality = $setting_quality;
                     $qualities = $this->mQualities[$setting_quality];
                 }
                 else {
-                    $org = $setting_quality;
+                    $org_quality = $setting_quality;
                     $qualities = [$setting_quality];
                 }
             }
             else {
-                $org = self::Normal; //如果没设置质量,默认为普通
-                $qualities = $this->mQualities[$org];
-                $time_out = $this->mSpeeds[$org]['retry_timeout'];
+                $org_quality = self::Normal; //如果没设置质量,默认为普通
+                $qualities = $this->mQualities[$org_quality];
+                $time_out = $this->mSpeeds[$org_quality]['retry_timeout'];
             }
         }
-        elseif(array_key_exists($quality,$this->mQualities)) {
-            $org = $quality;
-            $qualities = $this->mQualities[$quality];
+        elseif(array_key_exists($org_quality,$this->mQualities)) {
+            $qualities = $this->mQualities[$org_quality];
             [$success, $setting_quality, $time_out] = $this->mMchPhonectl->getCtls($mchid);
         }
         else {
@@ -169,17 +163,18 @@ class Quality
         }
 
         if($time_out <= 0) {
-            $time_out = $this->mSpeeds[$org]['retry_timeout'];
+            $time_out = $this->mSpeeds[$org_quality]['retry_timeout'];
         }
 
-        $max_times = $this->mSpeeds[$org]['retry_times'];
-        $qualities = $this->calc_phone_quality($qualities,$times,$used_time,$time_out,$max_times,$mchid);
+        $max_times = $this->mSpeeds[$org_quality]['retry_times'];
+        $fMixed = PolicyUtil::mixed_quality($org_quality);
+        $qualities = $this->calc_phone_quality($qualities,$fMixed,$cur_quality,$times,$used_time,$time_out,$max_times,$mchid);
 
-        return [$org,$qualities];
+        return [$org_quality,$qualities];
     }
 
     //通过每种类型通道耗时,倒推当前可用通道,并优先走推荐通道.
-    private function calc_phone_quality($qualities, $times, $used_time, $time_out, $max_times,$mchid)
+    private function calc_phone_quality($qualities,$fMixed, $cur_quality, $times, $used_time, $time_out, $max_times, $mchid)
     {
         $left_time = $time_out - $used_time;
         if($left_time <= 0 || $max_times <= $times) return [];
@@ -200,9 +195,15 @@ class Quality
             return $result;
         };
 
-        $timeout_checker = function ($qualities, $left_time)
+        $timeout_checker = function ($qualities, $left_time) use($fMixed,$cur_quality)
         {
             $qualities = array_reverse($qualities);
+            if ($fMixed) {
+                $fLasted = $cur_quality != $qualities[0];
+            } else {
+                $fLasted = false;
+            }
+
             $result = [];
             foreach ($qualities as $quality)
             {
@@ -215,6 +216,9 @@ class Quality
                 }
             }
 
+            if(empty($result) && $fLasted) {
+                $result[] = $qualities[0];
+            }
             $result = array_reverse($result);
             return $result;
         };

+ 2 - 2
helper/refill/policy/xyz/policy.php

@@ -161,7 +161,7 @@ class policy extends ProviderManager implements IPolicy
         return count($providers);
     }
 
-    public function find_quality($mchid,$spec,$card_type,$org_quality,$times,$used_time,$pcode,$regin_no): array
+    public function find_quality($mchid,$spec,$card_type,$org_quality,$cur_quality,$times,$used_time,$pcode,$regin_no): array
     {
         if($card_type == mtopcard\SinopecCard || $card_type == mtopcard\PetroChinaCard) {
             $caller = new times_caller($mchid,$spec,$card_type,-1,$this);
@@ -169,7 +169,7 @@ class policy extends ProviderManager implements IPolicy
             $caller = null;
         }
 
-        [$org_quality,$qualities] = $this->mQuality->find_quality($mchid,$card_type,$org_quality,$times,$used_time,$caller);
+        [$org_quality,$qualities] = $this->mQuality->find_quality($mchid,$card_type,$org_quality,$cur_quality,$times,$used_time,$caller);
         if(empty($qualities)) {
             return [$org_quality,0];
         }

+ 9 - 5
rdispatcher/proxy.php

@@ -31,6 +31,8 @@ class proxy
         $last_order_id = $params['order_id'] ?? 0;
 
         $org_quality = intval($params['org_quality']) ?? 0;
+        $cur_quality = intval($params['quality']) ?? 0;
+
         $card_type   = intval($params['card_type']) ?? 0;
         $regin_no   = intval($params['regin_no']) ?? -1;
         $quantity = 1;
@@ -42,7 +44,7 @@ class proxy
         if($card_type == 0)
         {
             $first_comit = true;
-            [$validate,$card_type,$region] = mtopcard\valid_phone($card_no);
+            [$validate,$card_type,$region,$isTransfer] = mtopcard\valid_phone($card_no);
             $params['card_type'] = $card_type;
             $params['regin_no'] = $region;
             $regin_no = $region;
@@ -50,7 +52,7 @@ class proxy
             $validate = true;
         }
 
-        [$org_quality,$quality] = refill\RefillFactory::instance()->find_quality($mchid,$amount,$card_type,$org_quality,$commit_times,time() - $order_time,'',$regin_no);
+        [$org_quality,$quality] = refill\RefillFactory::instance()->find_quality($mchid,$amount,$card_type,$org_quality,$cur_quality,$commit_times,time() - $order_time,'',$regin_no);
         if($first_comit) {
             refill\util::incr_user_commit($mchid,$card_type,$amount,$org_quality);
         }
@@ -82,7 +84,7 @@ class proxy
             }
             elseif(($errcode === refill\errcode::MERCHANT_REFILL_ERROR && $neterr) || $errcode == refill\errcode::PROVIDER_OVERLOAD || $errcode == errcode::MERCHANT_PRICE_UNSETTING)
             {
-                [$org_quality,$quality] = refill\RefillFactory::instance()->find_quality($mchid,$amount,$card_type,$org_quality,$commit_times,time() - $order_time,'',$regin_no);
+                [$org_quality,$quality] = refill\RefillFactory::instance()->find_quality($mchid,$amount,$card_type,$org_quality,$cur_quality,$commit_times,time() - $order_time,'',$regin_no);
                 if ($quality > 0)
                 {
                     $fNotify = false;
@@ -137,6 +139,8 @@ class proxy
         $last_order_id = $params['order_id'] ?? 0;
 
         $org_quality = intval($params['org_quality']) ?? 0;
+        $cur_quality = intval($params['quality']) ?? 0;
+
         $card_type   = intval($params['card_type']) ?? 0;
         $regin_no   = intval($params['regin_no']) ?? -1;
         $quantity = 1;
@@ -148,7 +152,7 @@ class proxy
         if($card_type == 0)
         {
             $first_comit = true;
-            [$validate,$card_type,$region] = mtopcard\valid_phone($card_no);
+            [$validate,$card_type,$region,$isTransfer] = mtopcard\valid_phone($card_no);
             $params['card_type'] = $card_type;
             $params['regin_no'] = $region;
             $regin_no = $region;
@@ -156,7 +160,7 @@ class proxy
             $validate = true;
         }
 
-        [$org_quality,$quality] = refill\RefillFactory::instance()->find_quality($mchid,$amount,$card_type,$org_quality,$commit_times,time() - $order_time,'',$regin_no);
+        [$org_quality,$quality] = refill\RefillFactory::instance()->find_quality($mchid,$amount,$card_type,$org_quality,$cur_quality,$commit_times,time() - $order_time,'',$regin_no);
         if($first_comit) {
             refill\util::incr_user_commit($mchid,$card_type,$amount,$org_quality);
         }

+ 2 - 2
test/TestCardNo.php

@@ -34,14 +34,14 @@ class TestCardNo extends TestCase
         $count = count($phones);
 
         foreach ($phones as $phone) {
-            [$validate,$card_type,$region_no] = mtopcard\valid_phone($phone);
+            [$validate,$card_type,$region_no,$isTransfer] = mtopcard\valid_phone($phone);
             Log::record("validate={$validate} card_type={$card_type} region_no={$region_no}",Log::DEBUG);
         }
     }
 
     public function testTianYanValidPhone()
     {
-        [$validate,$card_type,$region_no] = mtopcard\valid_phone('13911129867');
+        [$validate,$card_type,$region_no,$isTransfer] = mtopcard\valid_phone('15120035568');
         Log::record("validate={$validate} card_type={$card_type} region_no={$region_no}",Log::DEBUG);
     }