initialize(); echo "=== 甘草配置检查 ===\n\n"; // 获取配置 $config = think\facade\Config::get('gancao_scm', []); echo "1. 检查配置是否存在:\n"; if (empty($config)) { echo " ❌ 配置为空,请检查 .env 文件\n"; exit(1); } else { echo " ✓ 配置已加载\n\n"; } echo "2. 检查各项配置:\n"; $requiredFields = [ 'enabled' => 'boolean', 'gateway_url' => 'string', 'gateway_ak' => 'string', 'gateway_sk' => 'string', 'biz_ak' => 'string', 'biz_sk' => 'string', 'callback_url' => 'string', 'express_type' => 'string', 'cradle_store' => 'string', 'df_id' => 'integer', ]; $hasError = false; foreach ($requiredFields as $field => $expectedType) { $value = $config[$field] ?? null; $actualType = gettype($value); echo " - {$field}: "; if ($value === null) { echo "❌ 未配置\n"; $hasError = true; continue; } // 检查类型 if ($actualType === 'array') { echo "❌ 错误!值是数组,应该是 {$expectedType}\n"; echo " 实际值: " . json_encode($value, JSON_UNESCAPED_UNICODE) . "\n"; $hasError = true; continue; } // 转换类型检查 $typeMatch = false; switch ($expectedType) { case 'string': $typeMatch = is_string($value) || is_numeric($value); break; case 'integer': $typeMatch = is_int($value) || is_numeric($value); break; case 'boolean': $typeMatch = is_bool($value) || in_array($value, [0, 1, '0', '1', 'true', 'false'], true); break; } if (!$typeMatch) { echo "⚠️ 类型不匹配(期望: {$expectedType}, 实际: {$actualType})\n"; echo " 值: " . var_export($value, true) . "\n"; } else { echo "✓ {$actualType}"; if ($expectedType === 'string' && strlen((string)$value) > 50) { echo " (长度: " . strlen((string)$value) . ", 前50字符: " . substr((string)$value, 0, 50) . "...)"; } else { echo " = " . var_export($value, true); } echo "\n"; } } echo "\n3. 检查可选配置:\n"; $optionalFields = [ 'default_is_decoct' => 'boolean', 'default_times_per_day' => 'integer', 'default_num_per_pack' => 'integer', 'default_dose_ml' => 'integer', 'herb_id_map' => 'array', ]; foreach ($optionalFields as $field => $expectedType) { $value = $config[$field] ?? null; $actualType = gettype($value); echo " - {$field}: "; if ($value === null) { echo "未配置(可选)\n"; continue; } if ($expectedType === 'array' && !is_array($value)) { echo "⚠️ 应该是数组,实际是 {$actualType}\n"; } elseif ($expectedType !== 'array' && is_array($value)) { echo "❌ 错误!值是数组,应该是 {$expectedType}\n"; $hasError = true; } else { echo "✓ {$actualType}\n"; } } echo "\n4. 测试 JSON 编码:\n"; // 模拟构建提交负载 $testPayload = [ 'token' => 'test_token_123', 'df_id' => (int)($config['df_id'] ?? 101), 'amount' => 7, 'express_type' => isset($config['express_type']) ? (string)$config['express_type'] : 'sf', 'callback_url' => isset($config['callback_url']) ? (string)$config['callback_url'] : '', 'cradle_store' => isset($config['cradle_store']) ? (string)$config['cradle_store'] : 'default', 'express_to' => [ 'name' => '测试患者', 'phone' => '13800138000', 'province' => '四川省', 'city' => '成都市', 'addr' => '测试地址123号', ], 'patient' => [ 'name' => '测试患者', 'age' => '30', 'sex' => 0, 'phone' => '13800138000', ], 'doctor' => [ 'name' => '测试医生', ], 'doct_advice' => [ 'taboo' => '无', 'usage_time' => '饭后半小时服用', 'usage_brief' => '遵医嘱', 'others' => '', 'notes_doctor' => '', ], 'm_list' => [ ['id' => 1, 'quantity' => 10.0, 'brief' => ''], ], ]; try { $json = json_encode($testPayload, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); if ($json === false) { echo " ❌ JSON 编码失败: " . json_last_error_msg() . "\n"; $hasError = true; } else { echo " ✓ JSON 编码成功\n"; echo " 负载大小: " . strlen($json) . " 字节\n"; // 检查是否包含 "Array" 字符串(可能是数组转字符串的迹象) if (strpos($json, '"Array"') !== false || strpos($json, 'Array') !== false) { echo " ⚠️ 警告:JSON 中包含 'Array' 字符串,可能存在数组转字符串问题\n"; $hasError = true; } } } catch (\Throwable $e) { echo " ❌ 异常: " . $e->getMessage() . "\n"; $hasError = true; } echo "\n"; if ($hasError) { echo "=== 检查结果: ❌ 发现错误 ===\n"; echo "\n请修复以上错误后重试。\n"; echo "\n常见问题:\n"; echo "1. 配置值被错误地设置为数组\n"; echo "2. .env 文件格式错误(例如:GANCAO_SCM_EXPRESS_TYPE=[\"sf\"] 应该是 GANCAO_SCM_EXPRESS_TYPE=sf)\n"; echo "3. 配置文件中有多余的引号或括号\n"; exit(1); } else { echo "=== 检查结果: ✓ 配置正常 ===\n"; exit(0); }