mirror of
https://github.com/woocommerce/woocommerce-paypal-payments.git
synced 2025-09-04 08:47:23 +08:00
add webhook
This commit is contained in:
parent
a740e866fe
commit
33a84b19cb
11 changed files with 278 additions and 1 deletions
|
@ -43,7 +43,8 @@
|
|||
"Inpsyde\\PayPalCommerce\\Button\\": "modules.local/ppcp-button/src/",
|
||||
"Inpsyde\\PayPalCommerce\\WcGateway\\": "modules.local/ppcp-wc-gateway/src/",
|
||||
"Inpsyde\\PayPalCommerce\\Onboarding\\": "modules.local/ppcp-onboarding/src/",
|
||||
"Inpsyde\\Woocommerce\\Logging\\": "modules.local/woocommerce-logging/src/"
|
||||
"Inpsyde\\Woocommerce\\Logging\\": "modules.local/woocommerce-logging/src/",
|
||||
"Inpsyde\\Woocommerce\\Webhooks\\": "modules.local/ppcp-webhooks/src/"
|
||||
}
|
||||
},
|
||||
"autoload-dev": {
|
||||
|
|
27
modules.local/ppcp-webhooks/composer.json
Normal file
27
modules.local/ppcp-webhooks/composer.json
Normal file
|
@ -0,0 +1,27 @@
|
|||
{
|
||||
"name": "inpsyde/ppcp-webhooks",
|
||||
"type": "inpsyde-module",
|
||||
"require": {
|
||||
"dhii/module-interface": "0.2.x-dev"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Inpsyde\\PayPalCommerce\\Webhooks\\": "src/"
|
||||
}
|
||||
},
|
||||
"autoload-dev": {
|
||||
"psr-4": {
|
||||
"Inpsyde\\PayPalCommerce\\Webhooks\\": "tests/PHPUnit"
|
||||
}
|
||||
},
|
||||
"scripts": {
|
||||
"unit": "./vendor/bin/phpunit --coverage-html build/coverage-report"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "^9.1",
|
||||
"brain/monkey": "^2.4",
|
||||
"inpsyde/php-coding-standards": "^1"
|
||||
},
|
||||
"minimum-stability": "dev",
|
||||
"prefer-stable": true
|
||||
}
|
9
modules.local/ppcp-webhooks/extensions.php
Normal file
9
modules.local/ppcp-webhooks/extensions.php
Normal file
|
@ -0,0 +1,9 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Inpsyde\PayPalCommerce\Webhooks;
|
||||
|
||||
return [
|
||||
|
||||
];
|
11
modules.local/ppcp-webhooks/module.php
Normal file
11
modules.local/ppcp-webhooks/module.php
Normal file
|
@ -0,0 +1,11 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Inpsyde\PayPalCommerce\Webhooks;
|
||||
|
||||
use Dhii\Modular\Module\ModuleInterface;
|
||||
|
||||
return static function (): ModuleInterface {
|
||||
return new WebhookModule();
|
||||
};
|
20
modules.local/ppcp-webhooks/phpunit.xml.dist
Normal file
20
modules.local/ppcp-webhooks/phpunit.xml.dist
Normal file
|
@ -0,0 +1,20 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<phpunit
|
||||
bootstrap="vendor/autoload.php"
|
||||
backupGlobals="false"
|
||||
colors="true"
|
||||
convertErrorsToExceptions="true"
|
||||
convertNoticesToExceptions="true"
|
||||
convertWarningsToExceptions="true"
|
||||
>
|
||||
<filter>
|
||||
<whitelist processUncoveredFilesFromWhitelist="true">
|
||||
<directory suffix=".php">./src</directory>
|
||||
</whitelist>
|
||||
</filter>
|
||||
<testsuites>
|
||||
<testsuite name="unit">
|
||||
<directory suffix="Test.php">./tests/PHPUnit</directory>
|
||||
</testsuite>
|
||||
</testsuites>
|
||||
</phpunit>
|
31
modules.local/ppcp-webhooks/services.php
Normal file
31
modules.local/ppcp-webhooks/services.php
Normal file
|
@ -0,0 +1,31 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Inpsyde\PayPalCommerce\Webhooks;
|
||||
|
||||
use Inpsyde\PayPalCommerce\Webhooks\Handler\PaymentCaptureCompleted;
|
||||
use Psr\Container\ContainerInterface;
|
||||
|
||||
return [
|
||||
|
||||
'webhook.registrar' => function(ContainerInterface $container) : WebhookRegistrar {
|
||||
$factory = $container->get('api.factory.webhook');
|
||||
$endpoint = $container->get('api.endpoint.webhook');
|
||||
$restEndpoint = $container->get('webhook.endpoint.controller');
|
||||
return new WebhookRegistrar(
|
||||
$factory,
|
||||
$endpoint,
|
||||
$restEndpoint
|
||||
);
|
||||
},
|
||||
'webhook.endpoint.controller' => function(ContainerInterface $container) : IncomingWebhookEndpoint {
|
||||
$handler = $container->get('webhook.endpoint.handler');
|
||||
return new IncomingWebhookEndpoint(... $handler);
|
||||
},
|
||||
'webhook.endpoint.handler' => function(ContainerInterface $container) : array {
|
||||
return [
|
||||
new PaymentCaptureCompleted(),
|
||||
];
|
||||
}
|
||||
];
|
|
@ -0,0 +1,25 @@
|
|||
<?php
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Inpsyde\PayPalCommerce\Webhooks\Handler;
|
||||
|
||||
|
||||
class PaymentCaptureCompleted implements RequestHandler
|
||||
{
|
||||
|
||||
|
||||
public function eventType(): string
|
||||
{
|
||||
return 'PAYMENT.CAPTURE.COMPLETED';
|
||||
}
|
||||
|
||||
public function responsibleForRequest(\WP_REST_Request $request): bool
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public function handleRequest(\WP_REST_Request $request): \WP_REST_Response
|
||||
{
|
||||
return new \WP_REST_Response();
|
||||
}
|
||||
}
|
15
modules.local/ppcp-webhooks/src/Handler/RequestHandler.php
Normal file
15
modules.local/ppcp-webhooks/src/Handler/RequestHandler.php
Normal file
|
@ -0,0 +1,15 @@
|
|||
<?php
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Inpsyde\PayPalCommerce\Webhooks\Handler;
|
||||
|
||||
|
||||
interface RequestHandler
|
||||
{
|
||||
|
||||
public function eventType() : string;
|
||||
|
||||
public function responsibleForRequest(\WP_REST_Request $request) : bool;
|
||||
|
||||
public function handleRequest(\WP_REST_Request $request) : \WP_REST_Response;
|
||||
}
|
58
modules.local/ppcp-webhooks/src/IncomingWebhookEndpoint.php
Normal file
58
modules.local/ppcp-webhooks/src/IncomingWebhookEndpoint.php
Normal file
|
@ -0,0 +1,58 @@
|
|||
<?php
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Inpsyde\PayPalCommerce\Webhooks;
|
||||
|
||||
|
||||
use Inpsyde\PayPalCommerce\Webhooks\Handler\RequestHandler;
|
||||
|
||||
class IncomingWebhookEndpoint
|
||||
{
|
||||
|
||||
public const NAMESPACE = 'paypal/v1/';
|
||||
public const ROUTE = 'incoming';
|
||||
private $handlers;
|
||||
public function __construct(RequestHandler ...$handlers)
|
||||
{
|
||||
$this->handlers = $handlers;
|
||||
}
|
||||
|
||||
public function register() : bool
|
||||
{
|
||||
return (bool) register_rest_route(
|
||||
self::NAMESPACE,
|
||||
self::ROUTE,
|
||||
[
|
||||
'methods' => [
|
||||
'GET',
|
||||
],
|
||||
'callback' => [
|
||||
$this,
|
||||
'handleRequest',
|
||||
],
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
public function handleRequest(\WP_REST_Request $request) : \WP_REST_Response {
|
||||
|
||||
foreach ($this->handlers as $handler) {
|
||||
if ($handler->responsibleForRequest($request)) {
|
||||
return $handler->handleRequest($request);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function url() : string {
|
||||
return rest_url(self::NAMESPACE . self::ROUTE );
|
||||
}
|
||||
|
||||
public function handledEventTypes() : array {
|
||||
return array_map(
|
||||
function(RequestHandler $handler) : string {
|
||||
return $handler->eventType();
|
||||
},
|
||||
$this->handlers
|
||||
);
|
||||
}
|
||||
}
|
39
modules.local/ppcp-webhooks/src/WebhookModule.php
Normal file
39
modules.local/ppcp-webhooks/src/WebhookModule.php
Normal file
|
@ -0,0 +1,39 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Inpsyde\PayPalCommerce\Webhooks;
|
||||
|
||||
use Dhii\Container\ServiceProvider;
|
||||
use Dhii\Modular\Module\ModuleInterface;
|
||||
use Inpsyde\PayPalCommerce\Onboarding\Assets\OnboardingAssets;
|
||||
use Inpsyde\PayPalCommerce\Onboarding\Endpoint\LoginSellerEndpoint;
|
||||
use Inpsyde\PayPalCommerce\Onboarding\Render\OnboardingRenderer;
|
||||
use Interop\Container\ServiceProviderInterface;
|
||||
use Psr\Container\ContainerInterface;
|
||||
|
||||
class WebhookModule implements ModuleInterface
|
||||
{
|
||||
public function setup(): ServiceProviderInterface
|
||||
{
|
||||
return new ServiceProvider(
|
||||
require __DIR__ . '/../services.php',
|
||||
require __DIR__ . '/../extensions.php'
|
||||
);
|
||||
}
|
||||
|
||||
public function run(ContainerInterface $container)
|
||||
{
|
||||
add_action(
|
||||
'rest_init',
|
||||
function() use ($container) {
|
||||
$endpoint = $container->get('webhook.endpoint.controller');
|
||||
/**
|
||||
* @var IncomingWebhookEndpoint $endpoint
|
||||
*/
|
||||
$endpoint->register();
|
||||
}
|
||||
);
|
||||
|
||||
}
|
||||
}
|
41
modules.local/ppcp-webhooks/src/WebhookRegistrar.php
Normal file
41
modules.local/ppcp-webhooks/src/WebhookRegistrar.php
Normal file
|
@ -0,0 +1,41 @@
|
|||
<?php
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Inpsyde\PayPalCommerce\Webhooks;
|
||||
|
||||
|
||||
use Inpsyde\PayPalCommerce\ApiClient\Endpoint\WebhookEndpoint;
|
||||
use Inpsyde\PayPalCommerce\ApiClient\Exception\RuntimeException;
|
||||
use Inpsyde\PayPalCommerce\ApiClient\Factory\WebhookFactory;
|
||||
|
||||
class WebhookRegistrar
|
||||
{
|
||||
|
||||
private $webhookFactory;
|
||||
private $endpoint;
|
||||
private $restEndpoint;
|
||||
public function __construct(
|
||||
WebhookFactory $webhookFactory,
|
||||
WebhookEndpoint $endpoint,
|
||||
IncomingWebhookEndpoint $restEndpoint
|
||||
) {
|
||||
$this->webhookFactory = $webhookFactory;
|
||||
$this->endpoint = $endpoint;
|
||||
$this->restEndpoint = $restEndpoint;
|
||||
}
|
||||
|
||||
public function register() : bool
|
||||
{
|
||||
$webhook = $this->webhookFactory->forUrlAndEvents(
|
||||
$this->restEndpoint->url(),
|
||||
$this->restEndpoint->handledEventTypes()
|
||||
);
|
||||
|
||||
try {
|
||||
$created = $this->endpoint->create($webhook);
|
||||
return ! empty($created->id());
|
||||
} catch (RuntimeException $error) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue