feat(payments): implement standard webhooks validation system
Add comprehensive webhook validation and processing system with Polar.sh integration: - Create built-in Standard Webhooks package following official specification - Implement HMAC-SHA256 signature validation with base64 encoding - Add webhook factory for multi-provider support (Polar, Stripe, generic) - Replace custom Polar webhook validation with Standard Webhooks implementation - Add proper exception handling with custom WebhookVerificationException - Support sandbox mode bypass for development environments - Update Polar provider to use database-driven configuration - Enhance webhook test suite with proper Standard Webhooks format - Add PaymentProvider model HasFactory trait for testing - Implement timestamp tolerance checking (±5 minutes) for replay protection - Support multiple signature versions and proper header validation This provides a secure, reusable webhook validation system that can be extended to other payment providers while maintaining full compliance with Standard Webhooks specification. BREAKING CHANGE: Polar webhook validation now uses Standard Webhooks format with headers 'webhook-id', 'webhook-timestamp', 'webhook-signature' instead of previous Polar-specific headers.
This commit is contained in:
32
app/Services/Webhooks/WebhookFactory.php
Normal file
32
app/Services/Webhooks/WebhookFactory.php
Normal file
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services\Webhooks;
|
||||
|
||||
class WebhookFactory
|
||||
{
|
||||
/**
|
||||
* Create a Standard Webhooks validator for Polar
|
||||
*/
|
||||
public static function createPolar(string $secret): StandardWebhooks
|
||||
{
|
||||
// Polar uses raw secret, so we use fromRaw() method
|
||||
return StandardWebhooks::fromRaw($secret);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a Standard Webhooks validator for Stripe
|
||||
*/
|
||||
public static function createStripe(string $secret): StandardWebhooks
|
||||
{
|
||||
// Stripe typically uses whsec_ prefix
|
||||
return new StandardWebhooks($secret);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a Standard Webhooks validator for generic providers
|
||||
*/
|
||||
public static function create(string $secret, bool $isRaw = false): StandardWebhooks
|
||||
{
|
||||
return $isRaw ? StandardWebhooks::fromRaw($secret) : new StandardWebhooks($secret);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user