ImportPaymentProviderConfig.php 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. <?php
  2. namespace App\Console\Commands;
  3. use App\Services\Payment\PaymentProviderCatalog;
  4. use App\Services\Payment\PaymentProviderConfig;
  5. use Illuminate\Console\Command;
  6. use Illuminate\Support\Facades\Log;
  7. use Throwable;
  8. class ImportPaymentProviderConfig extends Command
  9. {
  10. protected $signature = 'payment:config-import-env
  11. {--company=* : 支付公司代码,可重复指定;省略则全部}
  12. {--write : 实际导入数据库;默认仅预览}';
  13. protected $description = '将当前生效的支付环境配置补入后台,保留已有后台值,不输出密钥明文';
  14. public function handle(PaymentProviderConfig $config): int
  15. {
  16. $codes = $this->option('company');
  17. if (array_diff($codes, PaymentProviderCatalog::codes()) !== []) {
  18. $this->error('支付公司代码无效,可选:' . implode(', ', PaymentProviderCatalog::codes()));
  19. return self::FAILURE;
  20. }
  21. $write = (bool)$this->option('write');
  22. $this->line('读取当前生效的 Laravel 配置及默认网关;若刚修改 .env,请先执行 php artisan config:cache。');
  23. try {
  24. $report = $config->importDefaults($codes, $write);
  25. } catch (Throwable $e) {
  26. Log::error('payment_provider_config_import_failed', ['exception' => $e]);
  27. $this->error('导入失败,请检查数据库迁移、数据库连接及 APP_KEY;详情见日志。');
  28. return self::FAILURE;
  29. }
  30. $this->table(['支付公司', $write ? '已导入字段' : '待导入字段', '保留后台字段', '未配置字段'],
  31. array_map(fn ($row) => [$row['payment_company'] . ' / ' . $row['label'],
  32. implode(', ', $row['imported']) ?: '-', implode(', ', $row['preserved']) ?: '-', implode(', ', $row['empty']) ?: '-'], $report));
  33. $count = array_sum(array_map(fn ($row) => count($row['imported']), $report));
  34. $this->info($write ? "已导入 {$count} 个字段;已有后台值保留,密钥加密存储。" : "预览:将导入 {$count} 个字段,未写入数据库;添加 --write 执行。");
  35. return self::SUCCESS;
  36. }
  37. }