CluPilotCloud/app/Support/StripeWebhookSecret.php

41 lines
1.8 KiB
PHP

<?php
namespace App\Support;
use App\Services\Secrets\SecretVault;
/**
* Der Signaturschlüssel des aktiven Betriebsmodus.
*
* Liegt im Tresor, mit den zwei Plätzen, die der Tresor für Test und Live
* ohnehin führt — und fällt auf die `.env` zurück, je Modus auf die eigene
* Zeile (STRIPE_WEBHOOK_SECRET_TEST bzw. STRIPE_WEBHOOK_SECRET), damit eine
* bestehende Installation sich durch den Umzug nicht ändert.
*
* Vorher standen beide Werte AUSSCHLIESSLICH in der Serverdatei, begründet
* damit, dass dieser Wert bei jedem eingehenden Zahlungsereignis gelesen wird
* und ein Datenbankproblem die Signaturprüfung still fehlschlagen ließe. Diese
* Begründung hat nicht gehalten: `stripe.secret` — der Schlüssel, mit dem das
* Geld eingezogen wird — liegt seit jeher in derselben Tabelle und wird bei
* jeder Buchung gelesen, und die AUSWAHL hier fragte die Datenbank sowieso
* schon. Bezahlt hat es der Betreiber: ein Wert in der Konsole, zwei in einer
* Datei, und eine Bereitschaftsprüfung, die das als blockierend meldete.
*
* Die Richtung des Ausfalls bleibt die sichere: `Settings::get()` liefert bei
* unerreichbarer Tabelle seinen Vorgabewert `live`, also wird der
* Live-Schlüssel benutzt. Ein echtes Zahlungsereignis wird weiter korrekt
* geprüft, ein Testereignis scheitert laut. Andersherum wäre es die gefährliche
* Richtung.
*
* Eigene Klasse statt einer privaten Methode auf dem Controller: die Auswahl
* selbst ist der Prüfgegenstand (siehe StripeWebhookSecretByModeTest), und ein
* Test soll dafür nicht per Reflection ins Controller-Innere greifen müssen.
*/
final class StripeWebhookSecret
{
public static function current(): string
{
return (string) app(SecretVault::class)->get('stripe.webhook_secret');
}
}