1. Go to this page and download the library: Download hotmeteor/receiver library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
'postmark' => [
'token' => env('POSTMARK_TOKEN'),
'webhook' => [
// One or more of: 'auth', 'headers', 'ips'
'verification_types' => ['headers', 'ips'],
// Header name => expected value pairs (used with 'headers')
'headers' => [
'X-Custom-Header' => env('POSTMARK_WEBHOOK_HEADER'),
],
// Allowed source IPs (used with 'ips')
// https://postmarkapp.com/support/article/800-ips-for-firewalls#webhooks
'ips' => [
'3.134.147.250',
'50.31.156.6',
'50.31.156.77',
'18.217.206.57',
],
],
],
namespace App\Http\Controllers\Webhooks;
use Illuminate\Http\Request;
use Receiver\Facades\Receiver;
class StripeWebhookController extends Controller
{
public function store(Request $request)
{
return Receiver::driver('stripe')
->receive($request)
->ok();
}
}
namespace App\Http\Controllers\Webhooks;
use Illuminate\Http\Request;
use Receiver\Facades\Receiver;
class WebhookController extends Controller
{
public function store(Request $request, string $provider)
{
return Receiver::driver($provider)
->receive($request)
->ok();
}
}
namespace App\Http\Controllers\Webhooks;
use Receiver\ReceivesWebhooks;
class WebhookController extends Controller
{
use ReceivesWebhooks;
}
namespace App\Http\Handlers\Stripe;
use Illuminate\Foundation\Bus\Dispatchable;
class CustomerCreated
{
use Dispatchable;
public function __construct(
public string $event,
public array $data,
) {}
public function handle(): void
{
// Your code here
}
}
namespace App\Http\Handlers\Stripe;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
class CustomerCreated implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public function __construct(
public string $event,
public array $data,
) {}
public function handle(): void
{
// Your code here
}
}
public function boot(): void
{
app('receiver')->extend('mailgun', function () {
return new \App\Http\Receivers\MailgunProvider(
config('services.mailgun.webhook_secret')
);
});
}
namespace App\Http\Receivers;
use Illuminate\Http\Request;
use Receiver\Providers\AbstractProvider;
class MailgunProvider extends AbstractProvider
{
public function getEvent(Request $request): string|array
{
return $request->input('event-data.event');
}
public function getData(Request $request): array
{
return $request->input('event-data', []);
}
}
public function verify(Request $request): bool
{
$signature = $request->header('X-Mailgun-Signature');
$expected = hash_hmac('sha256', $request->getContent(), $this->secret);
return hash_equals($expected, (string) $signature);
}
public function handshake(Request $request): array
{
return ['challenge' => $request->input('challenge')];
}
public function getEvent(Request $request): string|array
{
$events = [];
foreach (json_decode($request->getContent(), true) as $event) {
$type = $event['type'] ?? null;
if ($type && ! isset($events[$type])) {
$events[$type] = $event;
}
}
return $events;
}