41 lines
1.8 KiB
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');
|
|
}
|
|
}
|