mirror of
https://github.com/itflow-org/itflow
synced 2026-11-11 07:01:16 +00:00
503 lines
22 KiB
PHP
503 lines
22 KiB
PHP
<?php
|
|
|
|
namespace Stripe;
|
|
|
|
/**
|
|
* Shared registration and dispatch machinery for StripeEventNotificationHandler and
|
|
* StripeEventNotificationHandlerWithoutVerification.
|
|
*
|
|
* Deliberately declares no handle(). PHP requires an override to stay compatible with
|
|
* the parent's parameter list, so neither handler can subclass the other without
|
|
* carrying a parameter it doesn't want; as siblings, each declares its own signature.
|
|
*
|
|
* @internal implementation detail; do not depend on this class directly
|
|
*/
|
|
abstract class AbstractEventNotificationHandler
|
|
{
|
|
/** @var array<string, callable> */
|
|
protected $registeredHandlers = [];
|
|
/** @var StripeClient */
|
|
protected $client;
|
|
protected $hasHandledEvents = false;
|
|
/** @var callable(V2\Core\EventNotification, StripeClient, UnhandledNotificationDetails): void */
|
|
protected $fallbackCallback;
|
|
/** @var array<string, mixed> everything we need to duplicate a client */
|
|
protected $clientConfig;
|
|
/** @var null|callable(V2\Core\EventNotification, StripeClient): bool */
|
|
protected $preHandleCallback = null;
|
|
|
|
/**
|
|
* @param StripeClient $client The Stripe client to use for API interactions
|
|
* @param callable(V2\Core\EventNotification, StripeClient, UnhandledNotificationDetails): void $fallbackCallback A callback that's invoked for unhandled events. It receives the notification as parsed, so it's a specific subclass for event types this SDK knows about and an Events\UnknownEventNotification otherwise; check UnhandledNotificationDetails::$isKnownEventType or use instanceof to narrow
|
|
*/
|
|
public function __construct($client, $fallbackCallback)
|
|
{
|
|
$this->client = $client;
|
|
$this->fallbackCallback = $fallbackCallback;
|
|
|
|
// Extract configuration from the client for creating new instances
|
|
$this->clientConfig = [
|
|
'api_key' => $client->getApiKey(),
|
|
'client_id' => $client->getClientId(),
|
|
'stripe_account' => $client->getStripeAccount(),
|
|
'stripe_version' => $client->getStripeVersion(),
|
|
'api_base' => $client->getApiBase(),
|
|
'connect_base' => $client->getConnectBase(),
|
|
'files_base' => $client->getFilesBase(),
|
|
'meter_events_base' => $client->getMeterEventsBase(),
|
|
'max_network_retries' => $client->getMaxNetworkRetries(),
|
|
'app_info' => $client->getAppInfo(),
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Returns a sorted list of registered event types.
|
|
*
|
|
* @return string[] List of registered event type strings
|
|
*/
|
|
public function getRegisteredHandlers()
|
|
{
|
|
$eventTypes = array_keys($this->registeredHandlers);
|
|
\sort($eventTypes);
|
|
|
|
return $eventTypes;
|
|
}
|
|
|
|
/**
|
|
* Dispatches a parsed event notification to the appropriate handler.
|
|
*
|
|
* @param V2\Core\EventNotification $notif The parsed event notification
|
|
*
|
|
* @return void
|
|
*/
|
|
protected function dispatch($notif)
|
|
{
|
|
$eventType = $notif->type;
|
|
|
|
// Create a new client instance with the event's context instead of modifying the shared client
|
|
$eventClient = $this->createClientWithContext($notif->context);
|
|
|
|
if (null !== $this->preHandleCallback && !\call_user_func($this->preHandleCallback, $notif, $eventClient)) {
|
|
return;
|
|
}
|
|
|
|
if (isset($this->registeredHandlers[$eventType])) {
|
|
\call_user_func($this->registeredHandlers[$eventType], $notif, $eventClient);
|
|
} else {
|
|
\call_user_func($this->fallbackCallback, $notif, $eventClient, new UnhandledNotificationDetails(!$notif instanceof Events\UnknownEventNotification));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Creates a new StripeClient instance with the specified stripe_context.
|
|
*
|
|
* @param null|string $context The stripe_context to use for the new client
|
|
*
|
|
* @return StripeClient A new StripeClient instance with the specified context
|
|
*/
|
|
protected function createClientWithContext($context)
|
|
{
|
|
$config = $this->clientConfig;
|
|
$config['stripe_context'] = $context;
|
|
|
|
return new StripeClient($config);
|
|
}
|
|
|
|
/**
|
|
* Callbacks are expected to be registered on startup, so registering anything
|
|
* after handling an event indicates a bug.
|
|
*
|
|
* @throws Exception\BadMethodCallException if the `.handle()` method has already been called on this handler.
|
|
*/
|
|
private function assertHasntHandledYet()
|
|
{
|
|
if ($this->hasHandledEvents) {
|
|
throw new Exception\BadMethodCallException('Cannot register new callbacks after an event has been handled. This is indicative of a bug.');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Registers a handler for a specific event type.
|
|
*
|
|
* @param string $eventType The event type to register the handler for
|
|
* @param callable $handler The handler function to call when the event is received
|
|
*
|
|
* @throws Exception\InvalidArgumentException if this event type is already registered
|
|
* @throws Exception\BadMethodCallException if the `.handle()` method has already been called on this handler.
|
|
*/
|
|
protected function register($eventType, $handler)
|
|
{
|
|
$this->assertHasntHandledYet();
|
|
if (isset($this->registeredHandlers[$eventType])) {
|
|
throw new Exception\InvalidArgumentException("Callback for event type \"{$eventType}\" is already registered");
|
|
}
|
|
|
|
$this->registeredHandlers[$eventType] = $handler;
|
|
}
|
|
|
|
/**
|
|
* Registers a function that will be run before any event-specific callbacks. A useful place to
|
|
* store event-agnostic logic, such as logging or checking for
|
|
* [duplicate event deliveries](https://docs.stripe.com/webhooks#handle-duplicate-events).
|
|
*
|
|
* Returning `true` causes handling to continue as normal; returning `false` returns from
|
|
* `.handle()` immediately, so neither the registered callback nor the fallback callback are called.
|
|
*
|
|
* @param callable(V2\Core\EventNotification, StripeClient): bool $handler Return false to stop handling before any callback runs
|
|
*
|
|
* @throws Exception\InvalidArgumentException if a pre-handle hook is already registered
|
|
* @throws Exception\BadMethodCallException if the `.handle()` method has already been called on this handler.
|
|
*/
|
|
public function preHandle($handler)
|
|
{
|
|
$this->assertHasntHandledYet();
|
|
if (null !== $this->preHandleCallback) {
|
|
throw new Exception\InvalidArgumentException('A preHandle callback is already registered');
|
|
}
|
|
|
|
$this->preHandleCallback = $handler;
|
|
}
|
|
|
|
// event-handler-methods: The beginning of the section generated from our OpenAPI spec
|
|
/**
|
|
* Registers a handler for the "v1.billing.meter.error_report_triggered" event.
|
|
*
|
|
* @param callable(Events\V1BillingMeterErrorReportTriggeredEventNotification, StripeClient): void $handler Handles v1.billing.meter.error_report_triggered events
|
|
*
|
|
* @throws Exception\InvalidArgumentException if this event type is already registered
|
|
* @throws Exception\BadMethodCallException if the `.handle()` method has already been called on this handler.
|
|
*/
|
|
public function onV1BillingMeterErrorReportTriggered($handler)
|
|
{
|
|
$this->register('v1.billing.meter.error_report_triggered', $handler);
|
|
}
|
|
|
|
/**
|
|
* Registers a handler for the "v1.billing.meter.no_meter_found" event.
|
|
*
|
|
* @param callable(Events\V1BillingMeterNoMeterFoundEventNotification, StripeClient): void $handler Handles v1.billing.meter.no_meter_found events
|
|
*
|
|
* @throws Exception\InvalidArgumentException if this event type is already registered
|
|
* @throws Exception\BadMethodCallException if the `.handle()` method has already been called on this handler.
|
|
*/
|
|
public function onV1BillingMeterNoMeterFound($handler)
|
|
{
|
|
$this->register('v1.billing.meter.no_meter_found', $handler);
|
|
}
|
|
|
|
/**
|
|
* Registers a handler for the "v2.commerce.product_catalog.imports.failed" event.
|
|
*
|
|
* @param callable(Events\V2CommerceProductCatalogImportsFailedEventNotification, StripeClient): void $handler Handles v2.commerce.product_catalog.imports.failed events
|
|
*
|
|
* @throws Exception\InvalidArgumentException if this event type is already registered
|
|
* @throws Exception\BadMethodCallException if the `.handle()` method has already been called on this handler.
|
|
*/
|
|
public function onV2CommerceProductCatalogImportsFailed($handler)
|
|
{
|
|
$this->register('v2.commerce.product_catalog.imports.failed', $handler);
|
|
}
|
|
|
|
/**
|
|
* Registers a handler for the "v2.commerce.product_catalog.imports.processing" event.
|
|
*
|
|
* @param callable(Events\V2CommerceProductCatalogImportsProcessingEventNotification, StripeClient): void $handler Handles v2.commerce.product_catalog.imports.processing events
|
|
*
|
|
* @throws Exception\InvalidArgumentException if this event type is already registered
|
|
* @throws Exception\BadMethodCallException if the `.handle()` method has already been called on this handler.
|
|
*/
|
|
public function onV2CommerceProductCatalogImportsProcessing($handler)
|
|
{
|
|
$this->register('v2.commerce.product_catalog.imports.processing', $handler);
|
|
}
|
|
|
|
/**
|
|
* Registers a handler for the "v2.commerce.product_catalog.imports.succeeded" event.
|
|
*
|
|
* @param callable(Events\V2CommerceProductCatalogImportsSucceededEventNotification, StripeClient): void $handler Handles v2.commerce.product_catalog.imports.succeeded events
|
|
*
|
|
* @throws Exception\InvalidArgumentException if this event type is already registered
|
|
* @throws Exception\BadMethodCallException if the `.handle()` method has already been called on this handler.
|
|
*/
|
|
public function onV2CommerceProductCatalogImportsSucceeded($handler)
|
|
{
|
|
$this->register('v2.commerce.product_catalog.imports.succeeded', $handler);
|
|
}
|
|
|
|
/**
|
|
* Registers a handler for the "v2.commerce.product_catalog.imports.succeeded_with_errors" event.
|
|
*
|
|
* @param callable(Events\V2CommerceProductCatalogImportsSucceededWithErrorsEventNotification, StripeClient): void $handler Handles v2.commerce.product_catalog.imports.succeeded_with_errors events
|
|
*
|
|
* @throws Exception\InvalidArgumentException if this event type is already registered
|
|
* @throws Exception\BadMethodCallException if the `.handle()` method has already been called on this handler.
|
|
*/
|
|
public function onV2CommerceProductCatalogImportsSucceededWithErrors(
|
|
$handler
|
|
) {
|
|
$this->register(
|
|
'v2.commerce.product_catalog.imports.succeeded_with_errors',
|
|
$handler
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Registers a handler for the "v2.core.account.closed" event.
|
|
*
|
|
* @param callable(Events\V2CoreAccountClosedEventNotification, StripeClient): void $handler Handles v2.core.account.closed events
|
|
*
|
|
* @throws Exception\InvalidArgumentException if this event type is already registered
|
|
* @throws Exception\BadMethodCallException if the `.handle()` method has already been called on this handler.
|
|
*/
|
|
public function onV2CoreAccountClosed($handler)
|
|
{
|
|
$this->register('v2.core.account.closed', $handler);
|
|
}
|
|
|
|
/**
|
|
* Registers a handler for the "v2.core.account.created" event.
|
|
*
|
|
* @param callable(Events\V2CoreAccountCreatedEventNotification, StripeClient): void $handler Handles v2.core.account.created events
|
|
*
|
|
* @throws Exception\InvalidArgumentException if this event type is already registered
|
|
* @throws Exception\BadMethodCallException if the `.handle()` method has already been called on this handler.
|
|
*/
|
|
public function onV2CoreAccountCreated($handler)
|
|
{
|
|
$this->register('v2.core.account.created', $handler);
|
|
}
|
|
|
|
/**
|
|
* Registers a handler for the "v2.core.account.updated" event.
|
|
*
|
|
* @param callable(Events\V2CoreAccountUpdatedEventNotification, StripeClient): void $handler Handles v2.core.account.updated events
|
|
*
|
|
* @throws Exception\InvalidArgumentException if this event type is already registered
|
|
* @throws Exception\BadMethodCallException if the `.handle()` method has already been called on this handler.
|
|
*/
|
|
public function onV2CoreAccountUpdated($handler)
|
|
{
|
|
$this->register('v2.core.account.updated', $handler);
|
|
}
|
|
|
|
/**
|
|
* Registers a handler for the "v2.core.account[configuration.customer].capability_status_updated" event.
|
|
*
|
|
* @param callable(Events\V2CoreAccountIncludingConfigurationCustomerCapabilityStatusUpdatedEventNotification, StripeClient): void $handler Handles v2.core.account[configuration.customer].capability_status_updated events
|
|
*
|
|
* @throws Exception\InvalidArgumentException if this event type is already registered
|
|
* @throws Exception\BadMethodCallException if the `.handle()` method has already been called on this handler.
|
|
*/
|
|
public function onV2CoreAccountIncludingConfigurationCustomerCapabilityStatusUpdated(
|
|
$handler
|
|
) {
|
|
$this->register(
|
|
'v2.core.account[configuration.customer].capability_status_updated',
|
|
$handler
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Registers a handler for the "v2.core.account[configuration.customer].updated" event.
|
|
*
|
|
* @param callable(Events\V2CoreAccountIncludingConfigurationCustomerUpdatedEventNotification, StripeClient): void $handler Handles v2.core.account[configuration.customer].updated events
|
|
*
|
|
* @throws Exception\InvalidArgumentException if this event type is already registered
|
|
* @throws Exception\BadMethodCallException if the `.handle()` method has already been called on this handler.
|
|
*/
|
|
public function onV2CoreAccountIncludingConfigurationCustomerUpdated(
|
|
$handler
|
|
) {
|
|
$this->register(
|
|
'v2.core.account[configuration.customer].updated',
|
|
$handler
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Registers a handler for the "v2.core.account[configuration.merchant].capability_status_updated" event.
|
|
*
|
|
* @param callable(Events\V2CoreAccountIncludingConfigurationMerchantCapabilityStatusUpdatedEventNotification, StripeClient): void $handler Handles v2.core.account[configuration.merchant].capability_status_updated events
|
|
*
|
|
* @throws Exception\InvalidArgumentException if this event type is already registered
|
|
* @throws Exception\BadMethodCallException if the `.handle()` method has already been called on this handler.
|
|
*/
|
|
public function onV2CoreAccountIncludingConfigurationMerchantCapabilityStatusUpdated(
|
|
$handler
|
|
) {
|
|
$this->register(
|
|
'v2.core.account[configuration.merchant].capability_status_updated',
|
|
$handler
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Registers a handler for the "v2.core.account[configuration.merchant].updated" event.
|
|
*
|
|
* @param callable(Events\V2CoreAccountIncludingConfigurationMerchantUpdatedEventNotification, StripeClient): void $handler Handles v2.core.account[configuration.merchant].updated events
|
|
*
|
|
* @throws Exception\InvalidArgumentException if this event type is already registered
|
|
* @throws Exception\BadMethodCallException if the `.handle()` method has already been called on this handler.
|
|
*/
|
|
public function onV2CoreAccountIncludingConfigurationMerchantUpdated(
|
|
$handler
|
|
) {
|
|
$this->register(
|
|
'v2.core.account[configuration.merchant].updated',
|
|
$handler
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Registers a handler for the "v2.core.account[configuration.recipient].capability_status_updated" event.
|
|
*
|
|
* @param callable(Events\V2CoreAccountIncludingConfigurationRecipientCapabilityStatusUpdatedEventNotification, StripeClient): void $handler Handles v2.core.account[configuration.recipient].capability_status_updated events
|
|
*
|
|
* @throws Exception\InvalidArgumentException if this event type is already registered
|
|
* @throws Exception\BadMethodCallException if the `.handle()` method has already been called on this handler.
|
|
*/
|
|
public function onV2CoreAccountIncludingConfigurationRecipientCapabilityStatusUpdated(
|
|
$handler
|
|
) {
|
|
$this->register(
|
|
'v2.core.account[configuration.recipient].capability_status_updated',
|
|
$handler
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Registers a handler for the "v2.core.account[configuration.recipient].updated" event.
|
|
*
|
|
* @param callable(Events\V2CoreAccountIncludingConfigurationRecipientUpdatedEventNotification, StripeClient): void $handler Handles v2.core.account[configuration.recipient].updated events
|
|
*
|
|
* @throws Exception\InvalidArgumentException if this event type is already registered
|
|
* @throws Exception\BadMethodCallException if the `.handle()` method has already been called on this handler.
|
|
*/
|
|
public function onV2CoreAccountIncludingConfigurationRecipientUpdated(
|
|
$handler
|
|
) {
|
|
$this->register(
|
|
'v2.core.account[configuration.recipient].updated',
|
|
$handler
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Registers a handler for the "v2.core.account[defaults].updated" event.
|
|
*
|
|
* @param callable(Events\V2CoreAccountIncludingDefaultsUpdatedEventNotification, StripeClient): void $handler Handles v2.core.account[defaults].updated events
|
|
*
|
|
* @throws Exception\InvalidArgumentException if this event type is already registered
|
|
* @throws Exception\BadMethodCallException if the `.handle()` method has already been called on this handler.
|
|
*/
|
|
public function onV2CoreAccountIncludingDefaultsUpdated($handler)
|
|
{
|
|
$this->register('v2.core.account[defaults].updated', $handler);
|
|
}
|
|
|
|
/**
|
|
* Registers a handler for the "v2.core.account[future_requirements].updated" event.
|
|
*
|
|
* @param callable(Events\V2CoreAccountIncludingFutureRequirementsUpdatedEventNotification, StripeClient): void $handler Handles v2.core.account[future_requirements].updated events
|
|
*
|
|
* @throws Exception\InvalidArgumentException if this event type is already registered
|
|
* @throws Exception\BadMethodCallException if the `.handle()` method has already been called on this handler.
|
|
*/
|
|
public function onV2CoreAccountIncludingFutureRequirementsUpdated($handler)
|
|
{
|
|
$this->register('v2.core.account[future_requirements].updated', $handler);
|
|
}
|
|
|
|
/**
|
|
* Registers a handler for the "v2.core.account[identity].updated" event.
|
|
*
|
|
* @param callable(Events\V2CoreAccountIncludingIdentityUpdatedEventNotification, StripeClient): void $handler Handles v2.core.account[identity].updated events
|
|
*
|
|
* @throws Exception\InvalidArgumentException if this event type is already registered
|
|
* @throws Exception\BadMethodCallException if the `.handle()` method has already been called on this handler.
|
|
*/
|
|
public function onV2CoreAccountIncludingIdentityUpdated($handler)
|
|
{
|
|
$this->register('v2.core.account[identity].updated', $handler);
|
|
}
|
|
|
|
/**
|
|
* Registers a handler for the "v2.core.account[requirements].updated" event.
|
|
*
|
|
* @param callable(Events\V2CoreAccountIncludingRequirementsUpdatedEventNotification, StripeClient): void $handler Handles v2.core.account[requirements].updated events
|
|
*
|
|
* @throws Exception\InvalidArgumentException if this event type is already registered
|
|
* @throws Exception\BadMethodCallException if the `.handle()` method has already been called on this handler.
|
|
*/
|
|
public function onV2CoreAccountIncludingRequirementsUpdated($handler)
|
|
{
|
|
$this->register('v2.core.account[requirements].updated', $handler);
|
|
}
|
|
|
|
/**
|
|
* Registers a handler for the "v2.core.account_link.returned" event.
|
|
*
|
|
* @param callable(Events\V2CoreAccountLinkReturnedEventNotification, StripeClient): void $handler Handles v2.core.account_link.returned events
|
|
*
|
|
* @throws Exception\InvalidArgumentException if this event type is already registered
|
|
* @throws Exception\BadMethodCallException if the `.handle()` method has already been called on this handler.
|
|
*/
|
|
public function onV2CoreAccountLinkReturned($handler)
|
|
{
|
|
$this->register('v2.core.account_link.returned', $handler);
|
|
}
|
|
|
|
/**
|
|
* Registers a handler for the "v2.core.account_person.created" event.
|
|
*
|
|
* @param callable(Events\V2CoreAccountPersonCreatedEventNotification, StripeClient): void $handler Handles v2.core.account_person.created events
|
|
*
|
|
* @throws Exception\InvalidArgumentException if this event type is already registered
|
|
* @throws Exception\BadMethodCallException if the `.handle()` method has already been called on this handler.
|
|
*/
|
|
public function onV2CoreAccountPersonCreated($handler)
|
|
{
|
|
$this->register('v2.core.account_person.created', $handler);
|
|
}
|
|
|
|
/**
|
|
* Registers a handler for the "v2.core.account_person.deleted" event.
|
|
*
|
|
* @param callable(Events\V2CoreAccountPersonDeletedEventNotification, StripeClient): void $handler Handles v2.core.account_person.deleted events
|
|
*
|
|
* @throws Exception\InvalidArgumentException if this event type is already registered
|
|
* @throws Exception\BadMethodCallException if the `.handle()` method has already been called on this handler.
|
|
*/
|
|
public function onV2CoreAccountPersonDeleted($handler)
|
|
{
|
|
$this->register('v2.core.account_person.deleted', $handler);
|
|
}
|
|
|
|
/**
|
|
* Registers a handler for the "v2.core.account_person.updated" event.
|
|
*
|
|
* @param callable(Events\V2CoreAccountPersonUpdatedEventNotification, StripeClient): void $handler Handles v2.core.account_person.updated events
|
|
*
|
|
* @throws Exception\InvalidArgumentException if this event type is already registered
|
|
* @throws Exception\BadMethodCallException if the `.handle()` method has already been called on this handler.
|
|
*/
|
|
public function onV2CoreAccountPersonUpdated($handler)
|
|
{
|
|
$this->register('v2.core.account_person.updated', $handler);
|
|
}
|
|
|
|
/**
|
|
* Registers a handler for the "v2.core.event_destination.ping" event.
|
|
*
|
|
* @param callable(Events\V2CoreEventDestinationPingEventNotification, StripeClient): void $handler Handles v2.core.event_destination.ping events
|
|
*
|
|
* @throws Exception\InvalidArgumentException if this event type is already registered
|
|
* @throws Exception\BadMethodCallException if the `.handle()` method has already been called on this handler.
|
|
*/
|
|
public function onV2CoreEventDestinationPing($handler)
|
|
{
|
|
$this->register('v2.core.event_destination.ping', $handler);
|
|
}
|
|
// event-handler-methods: The end of the section generated from our OpenAPI spec
|
|
}
|