PaymentManager.php 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. <?php
  2. namespace App\Utils\Payments;
  3. use App\Utils\Library\Templates\Gateway;
  4. class PaymentManager
  5. {
  6. public static function getSettingsFormData(): array
  7. {
  8. return cache()->rememberForever('payment_forms', function () {
  9. $formData = [];
  10. foreach (self::discover() as $key => $gateway) {
  11. if (isset($gateway['metadata']['settings'])) {
  12. $formData[$key]['settings'] = $gateway['metadata']['settings'];
  13. if (isset($gateway['metadata']['button'])) {
  14. $formData[$key]['button'] = $gateway['metadata']['button'];
  15. }
  16. }
  17. }
  18. return $formData;
  19. });
  20. }
  21. public static function discover(): array
  22. {
  23. return cache()->rememberForever('discovered_payments', function () {
  24. $gateways = [];
  25. foreach (glob(app_path('Utils/Payments/*.php')) as $file) {
  26. $className = 'App\\Utils\\Payments\\'.basename($file, '.php');
  27. if (class_exists($className)) {
  28. $interfaces = class_implements($className);
  29. if ($interfaces && in_array(Gateway::class, $interfaces, true)) {
  30. $metadata = $className::metadata();
  31. $gateways[$metadata['key']] = [
  32. 'class' => $className,
  33. 'metadata' => $metadata,
  34. ];
  35. }
  36. }
  37. }
  38. return $gateways;
  39. });
  40. }
  41. public static function getAvailable(): array
  42. {
  43. return cache()->rememberForever('available_payments', function () {
  44. foreach (self::discover() as $key => $gateway) {
  45. if (isset($gateway['metadata']['settings'])) {
  46. $allConfigsExist = true;
  47. foreach ($gateway['metadata']['settings'] as $setting => $config) {
  48. if (! sysConfig($setting)) {
  49. $allConfigsExist = false;
  50. break;
  51. }
  52. }
  53. if ($allConfigsExist) {
  54. $available[] = $key;
  55. }
  56. }
  57. }
  58. return $available ?? [];
  59. });
  60. }
  61. public static function getLabels(bool $history = false): array
  62. {
  63. return cache()->rememberForever('payment_labels'.app()->getLocale(), function () use ($history) {
  64. if ($history) {
  65. $labels = [
  66. 'bitpayx' => trans('admin.system.payment.channel.bitpayx'),
  67. 'youzan' => trans('admin.system.payment.channel.youzan'),
  68. ];
  69. }
  70. foreach (self::discover() as $key => $gateway) {
  71. $labels[$key] = trans("admin.system.payment.channel.$key");
  72. }
  73. return $labels ?? [];
  74. });
  75. }
  76. public static function getPaymentsByMethod(string $method): array
  77. {
  78. return cache()->rememberForever("{$method}_payments", function () use ($method) {
  79. foreach (self::discover() as $key => $gateway) {
  80. if (isset($gateway['metadata']['method']) && in_array($method, $gateway['metadata']['method'], true)) {
  81. $lists[trans("admin.system.payment.channel.$key")] = $key;
  82. }
  83. }
  84. return $lists ?? [];
  85. });
  86. }
  87. }