1. phases
Itinera API
  • ✈ Itinera API Documentation
  • Docs
    • legacy
      • Itinera — System Overview
      • Technology Stack & Architecture
      • Getting Started Guide
      • Infrastructure
      • Frontend Application
      • Architecture Overview
      • API Reference
      • Backend Services
      • Development Guidelines
    • phases
      • 01. Architecture Overview & Checkout Idempotency
      • Phase 2: Commerce & Checkout Engine
      • Phase 3: Webhooks & Asynchronous Fulfillment
      • Phase 4: Security Perimeter & Authentication
      • Phase 5: Database Schema & Entity Relationships
      • Phase 6: AI Quota & Telemetry Subsystems
      • Phase 7: API Route Matrix & FormRequests
      • Phase 8: Global Exception & Error Handling
      • Phase 9: Frontend Ecosystem & State Management
      • Phase 10: Design System & Component Library
      • Phase 11: Interactive GSAP Animations
      • Phase 12: Deployment & CI/CD Pipeline
      • Phase 13: Testing Strategies
      • Phase 14: Performance & Optimization
      • Phase 15: Developer Onboarding & Runbooks
      • 15-Phase Comprehensive Wiki & Documentation Plan
  • APIs
    • Auth
      • Register a new user
      • Log in a user
      • Log out user
      • Refresh JWT token
      • Forgot password request
      • Reset password verification
      • Get current user profile
      • Update user profile
      • Redirect to Google OAuth
      • Google OAuth Callback
      • Verify email via signed URL
    • Catalog
      • List all countries
      • Get country details
      • List all cities
      • List all regions
      • List all destinations
      • Get destination details
      • Get hotels by destination
      • List all hotels
      • Get hotel details
      • Get reviews for a hotel
      • List all flights
      • Get flight details
      • List all restaurants
      • Get restaurant details
      • List all attractions
      • Get current weather
      • Submit review for an entity
      • Delete review
      • Toggle favourite status for entity
      • List my submitted reviews
    • Bookings
      • Book a tour destination
    • V1 Aliases
      • V1 List all countries
      • V1 Get country details
      • V1 List all cities
      • V1 List all destinations
      • V1 Get destination details
      • V1 Get hotels by destination
      • V1 List all hotels
      • V1 Get hotel details
      • V1 Get reviews for a hotel
      • V1 List all flights
      • V1 Get flight details
      • V1 List all restaurants
      • V1 Get restaurant details
      • V1 List all attractions
      • V1 Get attraction details
      • V1 List all regions
      • V1 Get weather details
    • Trips
      • List user trips
      • Create a new trip
      • Get trip details
      • Update trip details
      • Delete a trip
      • Get creation metadata
      • Attach items to a trip
      • Update trip item
      • Detach items from a trip
      • Fork a trip
    • Conversations
      • List user conversations
      • Start a new conversation
      • Get conversation details
      • List messages in conversation
      • Send message to conversation
      • Mark conversation as read
    • Commerce Plans
      • List public plans
      • Get public plan details
    • Commerce Subscriptions
      • Subscribe to a plan
      • Upgrade active plan
      • Get active subscription info
      • Cancel active subscription
    • Commerce Checkout
      • Initiate Paymob payment checkout
    • Integrations
      • Paymob status webhook callback
      • Paymob redirect return callback
    • System Settings & Support
      • Submit public contact message
      • Subscribe to system newsletter
      • Get list of my reports
      • List all notifications
      • Mark single notification as read
      • List available surveys
      • Submit answers for survey
      • Get survey details
      • Update survey details
      • Delete survey response
    • AI Tools
      • Enhance itinerary details using AI
      • Request AI review of itinerary
      • Plan route using AI assistance
      • Get AI quota remaining details
      • Chat with AI Concierge assistant
      • Get AI Review progress by ID
    • Agency Integration
      • Request agency assignment
      • List agency active tasks
      • List agency managed trips
      • Get agency total earnings
      • Get agency profile details
      • Update agency profile details
    • Admin User Management
      • List users inside admin dashboard
      • Get user profile
      • Set user active status
      • Block user profile
    • Admin Catalog Moderation
      • Create new catalog category
      • Create new catalog destination
      • Create new hotel catalog record
      • Create new flight catalog record
      • Create new restaurant catalog record
      • Create new attraction catalog record
  • Schemas
    • User
    • ErrorResponse
    • Trip
    • Destination
    • Hotel
    • Flight
    • Restaurant
    • Attraction
    • Booking
    • Review
    • Agency
    • Survey
  1. phases

Phase 3: Webhooks & Asynchronous Fulfillment

This document details the non-blocking, asynchronous architecture used to finalize orders and provision digital goods (subscriptions, trip packages, and forks).
Because payment gateways operate over the open internet, our webhook system is designed with extreme paranoia: assuming every payload is potentially forged, duplicated, delayed, or concurrent.

1. Webhook Ingestion & Security (HMAC)#

When Paymob processes a payment, it fires a POST request to our /api/webhooks/paymob endpoint. This hits the PaymobWebhookController::handle method, which immediately delegates to the WebhookService.

The SEC-05 HMAC Guard#

Before parsing any payload data, the system strictly validates the HMAC SHA-512 signature provided in the query string.
If the application is running in production and the PAYMOB_HMAC environment variable is empty, the PaymobGateway throws a fatal exception. This fails-fast, preventing attackers from exploiting an empty-secret HMAC bypass.

2. Concurrency & Grace Period Guards#

Once the payload is cryptographically verified, the WebhookService applies three layers of defense before touching the database.
1.
Concurrency Lock: We acquire an atomic lock via Redis: Cache::lock("paymob_webhook_processing_{$merchantOrderId}", 60). If Paymob fires 5 identical webhooks simultaneously (network retries), 4 of them will hit the lock and gracefully return 200 OK without touching the DB.
2.
Double-Processing Guard: We check if $payment->status is already PAID or FAILED.
3.
The 24-Hour Grace Period (D5 Rule): An order is only valid for 24 hours. If a delayed "success" webhook arrives 48 hours later, we reject fulfillment to prevent granting entitlements on expired terms.

3. Webhook Processing Flowchart#

The following diagram maps the exact execution path inside the WebhookService.

4. Asynchronous Provisioning: FulfillOrderListener#

We strictly separate Order Status tracking (done in the Webhook Service) from Digital Goods Provisioning (done asynchronously in Event Listeners).
When the PaymentSucceeded event fires, the FulfillOrderListener takes over on the background queue. It iterates through the $order->items and determines the fulfillment strategy based on the product type.

Subscription Provisioning & Idempotency#

If the user purchased a Subscription Plan, the listener:
1.
Idempotency Check: Verifies if a subscription with the provider_ref matching the paymob_transaction_id already exists. If yes, it aborts (preventing double-upgrades).
2.
Overlap Cleanup: Updates any currently ACTIVE subscriptions for that user to CANCELLED.
3.
Activation: Creates the new Subscription record with the correct billing cycle.
4.
AI Quota Reset: Resets the user's ai_generations_count to 0 and extends the ai_reset_at date.

5. Architectural Principles Applied#

1.
Pessimistic Ingestion: Webhooks trust nothing. They verify cryptography, concurrency, state, and time before acting.
2.
Event-Driven Decoupling: The HTTP response to Paymob does not wait for email notifications to send or databases to provision logic. The Event bus cleanly breaks the execution thread.
3.
Idempotent Listeners: Because Laravel queue workers can experience "At Least Once" delivery, the FulfillOrderListener checks the database state before executing any mutations, guaranteeing safety on retries.
Modified at 2026-08-25 22:41:45
Previous
Phase 2: Commerce & Checkout Engine
Next
Phase 4: Security Perimeter & Authentication
Built with