safeLoad(); $projectRoot = dirname(__DIR__, 2); $manifestPath = $projectRoot . '/user-app/src/manifest.json'; $dsn = sprintf( 'mysql:host=%s;port=%s;dbname=%s;charset=%s', $_ENV['DB_HOST'] ?? '127.0.0.1', $_ENV['DB_PORT'] ?? '3306', $_ENV['DB_DATABASE'] ?? '', $_ENV['DB_CHARSET'] ?? 'utf8mb4' ); try { $pdo = new PDO( $dsn, $_ENV['DB_USERNAME'] ?? '', $_ENV['DB_PASSWORD'] ?? '', [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, ] ); $configRows = $pdo->query("SELECT config_group, config_key, config_value FROM system_configs")->fetchAll(); $configMap = []; foreach ($configRows as $row) { $configMap[$row['config_group'] . '.' . $row['config_key']] = (string)($row['config_value'] ?? ''); } $miniProgramAppId = trim($configMap['mini_program.app_id'] ?? ''); if ($miniProgramAppId === '') { throw new RuntimeException('后台系统配置 mini_program.app_id 为空,无法同步到 user-app manifest。'); } $manifestContent = @file_get_contents($manifestPath); if ($manifestContent === false) { throw new RuntimeException('无法读取 user-app/src/manifest.json。'); } $pattern = '/("mp-weixin"\s*:\s*\{.*?"appid"\s*:\s*")([^"]*)(")/s'; if (!preg_match($pattern, $manifestContent)) { throw new RuntimeException('未在 manifest.json 中找到 mp-weixin.appid 字段。'); } $updatedContent = preg_replace_callback( $pattern, static fn(array $matches): string => $matches[1] . $miniProgramAppId . $matches[3], $manifestContent, 1 ); if (!is_string($updatedContent) || $updatedContent === '') { throw new RuntimeException('同步 manifest.json 失败。'); } if (@file_put_contents($manifestPath, $updatedContent) === false) { throw new RuntimeException('写入 user-app/src/manifest.json 失败。'); } echo "SYNC_CLIENT_CONFIG_OK\n"; echo "mini_program.app_id => {$miniProgramAppId}\n"; } catch (Throwable $e) { fwrite(STDERR, "SYNC_CLIENT_CONFIG_FAIL: {$e->getMessage()}\n"); exit(1); }