value)) ?? self::Live; } public static function set(self $mode): void { Settings::set(self::SETTING, $mode->value); } /** * Zu welchem Modus ein Stripe-Schlüssel gehört — am Präfix, ohne Netzverkehr. * * Stripe beschriftet den Schlüssel nicht; das Präfix ist das Einzige, was * bei beiden Schlüsselarten (`sk_`, und der eingeschränkte `rk_`) wahr ist. * Das reicht, und es muss reichen: die Bereitschaftsseite darf beim * Seitenaufruf nichts erreichen, und die Migration läuft, bevor irgendein * Dienst antwortet. * * `null` heißt „nicht entscheidbar", nicht „live". Wer daraus eine * Vorgabe braucht, sagt sie an seiner Stelle selbst — die Migration setzt * `?? Live` (der Zustand vor ihr, also Fortsetzung statt neuer Behauptung), * die Bereitschaftsprüfung meldet dagegen NUR einen Widerspruch, den sie * beweisen kann. * * Diese eine Stelle, weil dieselbe Frage vorher an drei Orten unabhängig * beantwortet wurde: in der Migration, in StripeCheck und — gar nicht — auf * der Bereitschaftsseite. Drei Formulierungen einer Frage sind der Weg, auf * dem sie auseinanderlaufen. */ public static function ofStripeKey(?string $secret): ?self { $secret = trim((string) $secret); return match (true) { str_starts_with($secret, 'sk_test_'), str_starts_with($secret, 'rk_test_') => self::Test, str_starts_with($secret, 'sk_live_'), str_starts_with($secret, 'rk_live_') => self::Live, default => null, }; } public function isTest(): bool { return $this === self::Test; } }