mirror of
https://github.com/woocommerce/woocommerce-paypal-payments.git
synced 2025-09-04 08:47:23 +08:00
Add service for current webhook
This commit is contained in:
parent
efb5ab3d14
commit
2c294861a1
2 changed files with 42 additions and 16 deletions
|
@ -10,8 +10,10 @@ declare(strict_types=1);
|
|||
namespace WooCommerce\PayPalCommerce\Webhooks;
|
||||
|
||||
use Exception;
|
||||
use Psr\Log\LoggerInterface;
|
||||
use WooCommerce\PayPalCommerce\ApiClient\Endpoint\WebhookEndpoint;
|
||||
use WooCommerce\PayPalCommerce\ApiClient\Entity\Webhook;
|
||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\WebhookFactory;
|
||||
use WooCommerce\PayPalCommerce\WcGateway\Assets\WebhooksStatusPageAssets;
|
||||
use WooCommerce\PayPalCommerce\Webhooks\Endpoint\ResubscribeEndpoint;
|
||||
use WooCommerce\PayPalCommerce\Webhooks\Handler\CheckoutOrderApproved;
|
||||
|
@ -37,14 +39,14 @@ return array(
|
|||
},
|
||||
'webhook.endpoint.controller' => function( $container ) : IncomingWebhookEndpoint {
|
||||
$webhook_endpoint = $container->get( 'api.endpoint.webhook' );
|
||||
$webhook_factory = $container->get( 'api.factory.webhook' );
|
||||
$webhook = $container->get( 'webhook.current' );
|
||||
$handler = $container->get( 'webhook.endpoint.handler' );
|
||||
$logger = $container->get( 'woocommerce.logger.woocommerce' );
|
||||
$verify_request = ! defined( 'PAYPAL_WEBHOOK_REQUEST_VERIFICATION' ) || PAYPAL_WEBHOOK_REQUEST_VERIFICATION;
|
||||
|
||||
return new IncomingWebhookEndpoint(
|
||||
$webhook_endpoint,
|
||||
$webhook_factory,
|
||||
$webhook,
|
||||
$logger,
|
||||
$verify_request,
|
||||
... $handler
|
||||
|
@ -63,6 +65,29 @@ return array(
|
|||
);
|
||||
},
|
||||
|
||||
'webhook.current' => function( $container ) : ?Webhook {
|
||||
$data = (array) get_option( WebhookRegistrar::KEY, array() );
|
||||
if ( empty( $data ) ) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$factory = $container->get( 'api.factory.webhook' );
|
||||
assert( $factory instanceof WebhookFactory );
|
||||
|
||||
try {
|
||||
return $factory->from_array( $data );
|
||||
} catch ( Exception $exception ) {
|
||||
$logger = $container->get( 'woocommerce.logger.woocommerce' );
|
||||
assert( $logger instanceof LoggerInterface );
|
||||
$logger->error( 'Failed to parse the stored webhook data: ' . $exception->getMessage() );
|
||||
return null;
|
||||
}
|
||||
},
|
||||
|
||||
'webhook.is-registered' => function( $container ) : bool {
|
||||
return $container->get( 'webhook.current' ) !== null;
|
||||
},
|
||||
|
||||
'webhook.status.registered-webhooks' => function( $container ) : array {
|
||||
$endpoint = $container->get( 'api.endpoint.webhook' );
|
||||
assert( $endpoint instanceof WebhookEndpoint );
|
||||
|
|
|
@ -10,8 +10,8 @@ declare(strict_types=1);
|
|||
namespace WooCommerce\PayPalCommerce\Webhooks;
|
||||
|
||||
use WooCommerce\PayPalCommerce\ApiClient\Endpoint\WebhookEndpoint;
|
||||
use WooCommerce\PayPalCommerce\ApiClient\Entity\Webhook;
|
||||
use WooCommerce\PayPalCommerce\ApiClient\Exception\RuntimeException;
|
||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\WebhookFactory;
|
||||
use WooCommerce\PayPalCommerce\Webhooks\Handler\RequestHandler;
|
||||
use Psr\Log\LoggerInterface;
|
||||
|
||||
|
@ -31,11 +31,11 @@ class IncomingWebhookEndpoint {
|
|||
private $webhook_endpoint;
|
||||
|
||||
/**
|
||||
* The Webhook Factory.
|
||||
* Our registered webhook.
|
||||
*
|
||||
* @var WebhookFactory
|
||||
* @var Webhook|null
|
||||
*/
|
||||
private $webhook_factory;
|
||||
private $webhook;
|
||||
|
||||
/**
|
||||
* The Request handlers.
|
||||
|
@ -62,21 +62,21 @@ class IncomingWebhookEndpoint {
|
|||
* IncomingWebhookEndpoint constructor.
|
||||
*
|
||||
* @param WebhookEndpoint $webhook_endpoint The webhook endpoint.
|
||||
* @param WebhookFactory $webhook_factory The webhook factory.
|
||||
* @param Webhook|null $webhook Our registered webhook.
|
||||
* @param LoggerInterface $logger The logger.
|
||||
* @param bool $verify_request Whether requests need to be verified or not.
|
||||
* @param RequestHandler ...$handlers The handlers, which process a request in the end.
|
||||
*/
|
||||
public function __construct(
|
||||
WebhookEndpoint $webhook_endpoint,
|
||||
WebhookFactory $webhook_factory,
|
||||
?Webhook $webhook,
|
||||
LoggerInterface $logger,
|
||||
bool $verify_request,
|
||||
RequestHandler ...$handlers
|
||||
) {
|
||||
|
||||
$this->webhook_endpoint = $webhook_endpoint;
|
||||
$this->webhook_factory = $webhook_factory;
|
||||
$this->webhook = $webhook;
|
||||
$this->handlers = $handlers;
|
||||
$this->logger = $logger;
|
||||
$this->verify_request = $verify_request;
|
||||
|
@ -116,15 +116,16 @@ class IncomingWebhookEndpoint {
|
|||
if ( ! $this->verify_request ) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if ( ! $this->webhook ) {
|
||||
$this->logger->error( 'Failed to retrieve stored webhook data.' );
|
||||
return false;
|
||||
}
|
||||
|
||||
try {
|
||||
$data = (array) get_option( WebhookRegistrar::KEY, array() );
|
||||
$webhook = $this->webhook_factory->from_array( $data );
|
||||
$result = $this->webhook_endpoint->verify_current_request_for_webhook( $webhook );
|
||||
$result = $this->webhook_endpoint->verify_current_request_for_webhook( $this->webhook );
|
||||
if ( ! $result ) {
|
||||
$this->logger->log(
|
||||
'error',
|
||||
__( 'Illegit Webhook request detected.', 'woocommerce-paypal-payments' )
|
||||
);
|
||||
$this->logger->error( 'Webhook verification failed.' );
|
||||
}
|
||||
return $result;
|
||||
} catch ( RuntimeException $exception ) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue