|
@@ -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;
|
|
|
+ }
|
|
|
}
|
|
|
|