Add PayPal webhook handling

This commit is contained in:
Codex Agent
2026-02-04 14:23:07 +01:00
parent 66c7131d79
commit 5c78ac00dd
12 changed files with 676 additions and 7 deletions

View File

@@ -31,7 +31,7 @@ class CouponRedemptionService
return;
}
$transactionId = Arr::get($payload, 'id') ?? $session->lemonsqueezy_order_id;
$transactionId = $this->resolveTransactionId($session, $payload);
$context = $this->resolveRequestContext($session);
$fraudSnapshot = $this->buildFraudSnapshot($context);
@@ -48,6 +48,7 @@ class CouponRedemptionService
'metadata' => array_filter([
'session_snapshot' => $session->coupon_snapshot,
'payload' => $payload,
'provider' => $session->provider,
'fraud' => $fraudSnapshot,
]),
'redeemed_at' => now(),
@@ -74,6 +75,7 @@ class CouponRedemptionService
$context = $this->resolveRequestContext($session);
$fraudSnapshot = $this->buildFraudSnapshot($context);
$transactionId = $this->resolveTransactionId($session);
CouponRedemption::query()->updateOrCreate(
[
@@ -84,13 +86,14 @@ class CouponRedemptionService
'tenant_id' => $session->tenant_id,
'user_id' => $session->user_id,
'package_id' => $session->package_id,
'lemonsqueezy_order_id' => $session->lemonsqueezy_order_id,
'lemonsqueezy_order_id' => $transactionId,
'status' => CouponRedemption::STATUS_FAILED,
'failure_reason' => $reason,
'amount_discounted' => $session->amount_discount,
'currency' => $session->currency ?? 'EUR',
'metadata' => array_filter([
'session_snapshot' => $session->coupon_snapshot,
'provider' => $session->provider,
'fraud' => $fraudSnapshot,
]),
]),
@@ -109,6 +112,24 @@ class CouponRedemptionService
], static fn ($value) => $value !== null && $value !== '');
}
/**
* @param array<string, mixed> $payload
*/
private function resolveTransactionId(CheckoutSession $session, array $payload = []): ?string
{
if ($session->provider === CheckoutSession::PROVIDER_PAYPAL) {
$paypalId = $session->paypal_capture_id
?? $session->paypal_order_id
?? Arr::get($payload, 'id');
return is_string($paypalId) && $paypalId !== '' ? $paypalId : null;
}
$lemonsqueezyId = Arr::get($payload, 'id') ?? $session->lemonsqueezy_order_id;
return is_string($lemonsqueezyId) && $lemonsqueezyId !== '' ? $lemonsqueezyId : null;
}
/**
* @param array{ip_address?: string|null, device_id?: string|null, user_agent?: string|null} $context
* @return array<string, mixed>|null