Expliziten Return‑Flow umgesetzt: neue Return‑Route nimmt _ptxn, lädt die Transaktion und leitet anhand custom_data

auf success_url/cancel_url weiter. Gleichzeitig werden diese URLs jetzt in custom_data bei Add‑ons, Package‑Checkout
  und Gift‑Vouchern gespeichert, damit der Return‑Handler sie kennt.

  Details (relevant):
  - app/Http/Controllers/PaddleReturnController.php verarbeitet _ptxn, prüft Status, schützt vor Open‑Redirects.
  - routes/web.php neue Route paddle.return (öffentlich).
  - app/Services/Addons/EventAddonCheckoutService.php, app/Services/Paddle/PaddleCheckoutService.php, app/Services/
GiftVouchers/GiftVoucherCheckoutService.php speichern success_url/cancel_url in custom_data.
  - tests/Feature/PaddleReturnTest.php prüft Success/Cancel‑Redirects.
  - Tests aktualisiert: tests/Unit/PaddleCheckoutServiceTest.php.
  Wichtig für die Rückleitung:

  - Bitte in Paddle (Sandbox + Live) die Checkout‑Success/Cancel URL auf http://fotospiel-app.test/paddle/return
    setzen.
    Ohne diese Einstellung schickt Paddle den Nutzer nicht zu unserem Return‑Handler.
  Nebenwirkung: Add‑on‑Checkout gibt jetzt als checkout_id die Transaktions‑ID (txn_…) zurück (statt chk_…).
This commit is contained in:
Codex Agent
2025-12-29 18:20:52 +01:00
parent 5f521d055f
commit aaf418a917
7 changed files with 198 additions and 3 deletions

View File

@@ -66,7 +66,7 @@ class EventAddonCheckoutService
$increments = $this->catalog->resolveIncrements($addonKey);
$metadata = [
$metadata = array_filter([
'tenant_id' => (string) $tenant->id,
'event_id' => (string) $event->id,
'event_package_id' => (string) $event->eventPackage->id,
@@ -76,7 +76,9 @@ class EventAddonCheckoutService
'legal_version' => $this->resolveLegalVersion(),
'accepted_terms' => $acceptedTerms ? '1' : '0',
'accepted_waiver' => $acceptedWaiver ? '1' : '0',
];
'success_url' => $payload['success_url'] ?? null,
'cancel_url' => $payload['cancel_url'] ?? null,
], static fn ($value) => $value !== null && $value !== '');
$requestPayload = array_filter([
'customer_id' => $customerId,

View File

@@ -68,6 +68,8 @@ class GiftVoucherCheckoutService
'recipient_name' => $data['recipient_name'] ?? null,
'message' => $data['message'] ?? null,
'app_locale' => App::getLocale(),
'success_url' => $data['success_url'] ?? null,
'cancel_url' => $data['return_url'] ?? null,
]),
];

View File

@@ -24,7 +24,14 @@ class PaddleCheckoutService
$customData = $this->buildMetadata(
$tenant,
$package,
array_merge($options['metadata'] ?? [], $options['custom_data'] ?? [])
array_merge(
$options['metadata'] ?? [],
$options['custom_data'] ?? [],
array_filter([
'success_url' => $options['success_url'] ?? null,
'cancel_url' => $options['return_url'] ?? null,
], static fn ($value) => $value !== null && $value !== '')
)
);
$payload = [