lizhen hai 14 horas
pai
achega
e9ecf6e8bc
Modificáronse 2 ficheiros con 136 adicións e 10 borrados
  1. 59 3
      addons/exam/controller/Paper.php
  2. 77 7
      application/command/IcbcQueue.php

+ 59 - 3
addons/exam/controller/Paper.php

@@ -394,7 +394,7 @@ class Paper extends Base
             $response = $client->execute($request, $data['msg_id'], '');
             
             // 记录原始响应(调试用)
-            \think\Log::record('积分维护接口原始响应: ' . $response, 'info');
+            \think\Log::record('积分维护接口原始响应长度: ' . strlen($response), 'info');
             
             // 检查响应是否为空
             if (empty($response)) {
@@ -407,15 +407,26 @@ class Paper extends Base
                 return $resultData;
             }
             
+            // 清理响应内容:提取 JSON 部分
+            // 工行接口可能返回调试信息,需要清理
+            $clean_response = $this->cleanResponse($response);
+            
+            // 如果清理后的响应与原始不同,记录
+            if ($clean_response !== $response) {
+                \think\Log::record('积分维护接口响应包含非JSON内容,已清理', 'info');
+            }
+            
             // 解析响应
-            $result = json_decode($response, true);
+            $result = json_decode($clean_response, true);
             
             // 检查JSON解析是否成功
             if (json_last_error() !== JSON_ERROR_NONE) {
+                \think\Log::record('积分维护接口JSON解析失败: ' . json_last_error_msg(), 'error');
                 $resultData = [
                     'return_code' => '-2',
                     'return_msg' => 'JSON解析失败: ' . json_last_error_msg(),
-                    'raw_response' => $response
+                    'raw_response' => $response,
+                    'clean_response' => $clean_response
                 ];
                 $this->writeIcbcLog(false, $resultData, $biz_content);
                 return $resultData;
@@ -623,6 +634,51 @@ class Paper extends Base
         file_put_contents($filepath, $log_text, FILE_APPEND);
     }
 
+    /**
+     * 清理响应内容,提取纯JSON
+     * @param string $response 原始响应
+     * @return string 清理后的JSON字符串
+     */
+    private function cleanResponse($response)
+    {
+        // 1. 去除首尾空白
+        $response = trim($response);
+        
+        // 2. 查找第一个 { 或 [(JSON开始)
+        $json_start = -1;
+        $first_brace = strpos($response, '{');
+        $first_bracket = strpos($response, '[');
+        
+        if ($first_brace !== false && $first_bracket !== false) {
+            $json_start = min($first_brace, $first_bracket);
+        } elseif ($first_brace !== false) {
+            $json_start = $first_brace;
+        } elseif ($first_bracket !== false) {
+            $json_start = $first_bracket;
+        }
+        
+        // 3. 查找最后一个 } 或 ](JSON结束)
+        $json_end = -1;
+        $last_brace = strrpos($response, '}');
+        $last_bracket = strrpos($response, ']');
+        
+        if ($last_brace !== false && $last_bracket !== false) {
+            $json_end = max($last_brace, $last_bracket);
+        } elseif ($last_brace !== false) {
+            $json_end = $last_brace;
+        } elseif ($last_bracket !== false) {
+            $json_end = $last_bracket;
+        }
+        
+        // 4. 提取JSON部分
+        if ($json_start !== -1 && $json_end !== -1 && $json_end > $json_start) {
+            return substr($response, $json_start, $json_end - $json_start + 1);
+        }
+        
+        // 5. 如果没找到JSON结构,返回原始内容
+        return $response;
+    }
+
     /*
      * 查看错题
      * Robin

+ 77 - 7
application/command/IcbcQueue.php

@@ -48,7 +48,7 @@ class IcbcQueue extends Command
                 $output->writeln("处理任务 ID: {$task['id']}, 手机号: {$task['mobile_phone']}, 积分: {$task['integral_value']}");
                 
                 // 调用工行接口
-                $result = $this->callIcbcApi($task);
+                $result = $this->callIcbcApi($task, $output);
                 
                 // 先检查返回值是否为数组
                 if (!is_array($result)) {
@@ -117,7 +117,7 @@ class IcbcQueue extends Command
     /**
      * 调用工行接口
      */
-    private function callIcbcApi($task)
+    private function callIcbcApi($task, $output)
     {
         include_once EXTEND_PATH . 'icbc/DefaultIcbcClient.php';
         
@@ -172,19 +172,44 @@ class IcbcQueue extends Command
             // 发送请求
             $response = $client->execute($request, $data['msg_id'], '');
             
-            // 解析响应
+            // 记录原始响应(用于调试)
+            $output->writeln("  原始响应长度: " . strlen($response));
+            
+            // 检查响应
             if (empty($response)) {
-                return ['return_code' => '-1', 'return_msg' => '接口无响应'];
+                return [
+                    'return_code' => '-1', 
+                    'return_msg' => '接口无响应',
+                    'raw_response' => $response
+                ];
+            }
+            
+            // 清理响应内容:提取 JSON 部分
+            // 工行接口可能返回调试信息,需要清理
+            $clean_response = $this->cleanResponse($response);
+            
+            // 如果清理后的响应与原始不同,记录
+            if ($clean_response !== $response) {
+                $output->writeln("  ⚠ 响应包含非JSON内容,已清理");
             }
             
-            $result = json_decode($response, true);
+            // 解析响应
+            $result = json_decode($clean_response, true);
             
             if (json_last_error() !== JSON_ERROR_NONE) {
-                return ['return_code' => '-2', 'return_msg' => 'JSON解析失败'];
+                $output->writeln("  ✗ JSON解析失败: " . json_last_error_msg());
+                return [
+                    'return_code' => '-2', 
+                    'return_msg' => 'JSON解析失败: ' . json_last_error_msg(),
+                    'raw_response' => $response,
+                    'clean_response' => $clean_response
+                ];
             }
             
             // 写入日志
-            $this->writeLog($result['return_code'] == 0, $result, $biz_content);
+            if (isset($result['return_code'])) {
+                $this->writeLog($result['return_code'] == 0, $result, $biz_content);
+            }
             
             return $result;
             
@@ -216,5 +241,50 @@ class IcbcQueue extends Command
         $log_text = "\n" . json_encode($log_content, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT) . "\n";
         file_put_contents($filepath, $log_text, FILE_APPEND);
     }
+
+    /**
+     * 清理响应内容,提取纯JSON
+     * @param string $response 原始响应
+     * @return string 清理后的JSON字符串
+     */
+    private function cleanResponse($response)
+    {
+        // 1. 去除首尾空白
+        $response = trim($response);
+        
+        // 2. 查找第一个 { 或 [(JSON开始)
+        $json_start = -1;
+        $first_brace = strpos($response, '{');
+        $first_bracket = strpos($response, '[');
+        
+        if ($first_brace !== false && $first_bracket !== false) {
+            $json_start = min($first_brace, $first_bracket);
+        } elseif ($first_brace !== false) {
+            $json_start = $first_brace;
+        } elseif ($first_bracket !== false) {
+            $json_start = $first_bracket;
+        }
+        
+        // 3. 查找最后一个 } 或 ](JSON结束)
+        $json_end = -1;
+        $last_brace = strrpos($response, '}');
+        $last_bracket = strrpos($response, ']');
+        
+        if ($last_brace !== false && $last_bracket !== false) {
+            $json_end = max($last_brace, $last_bracket);
+        } elseif ($last_brace !== false) {
+            $json_end = $last_brace;
+        } elseif ($last_bracket !== false) {
+            $json_end = $last_bracket;
+        }
+        
+        // 4. 提取JSON部分
+        if ($json_start !== -1 && $json_end !== -1 && $json_end > $json_start) {
+            return substr($response, $json_start, $json_end - $json_start + 1);
+        }
+        
+        // 5. 如果没找到JSON结构,返回原始内容
+        return $response;
+    }
 }