diff --git a/modules.local/ppcp-wc-gateway/extensions.php b/modules.local/ppcp-wc-gateway/extensions.php index cf4b7cc97..cd16cc0e2 100644 --- a/modules.local/ppcp-wc-gateway/extensions.php +++ b/modules.local/ppcp-wc-gateway/extensions.php @@ -35,6 +35,10 @@ return [ $settings = $container->get('wcgateway.settings'); return $settings->has('client_secret') ? (string) $settings->get('client_secret') : ''; }, + 'api.prefix' => static function (ContainerInterface $container): string { + $settings = $container->get('wcgateway.settings'); + return $settings->has('prefix') ? (string) $settings->get('prefix') : 'WC-'; + }, 'api.endpoint.order' => static function (ContainerInterface $container): OrderEndpoint { $orderFactory = $container->get('api.factory.order'); $patchCollectionFactory = $container->get('api.factory.patch-collection-factory'); diff --git a/modules.local/ppcp-wc-gateway/services.php b/modules.local/ppcp-wc-gateway/services.php index 9143cd4a2..15e41b05f 100644 --- a/modules.local/ppcp-wc-gateway/services.php +++ b/modules.local/ppcp-wc-gateway/services.php @@ -529,6 +529,19 @@ return [ ], 'requirements' => [], ], + 'prefix' => [ + 'title' => __('Installation prefix', 'woocommerce-paypal-commerce-gateway'), + 'type' => 'text', + 'desc_tip' => true, + 'description' => __('If you use your PayPal account with more than one installation, please use a distinct prefix to seperate those installations. Please do not use numbers in your prefix.', 'woocommerce-paypal-commerce-gateway'), + 'default' => 'WC-', + 'screens' => [ + State::STATE_START, + State::STATE_PROGRESSIVE, + State::STATE_ONBOARDED, + ], + 'requirements' => [], + ], ]; }, ]; diff --git a/modules.local/ppcp-wc-gateway/src/Settings/SettingsListener.php b/modules.local/ppcp-wc-gateway/src/Settings/SettingsListener.php index d8a92d9bb..16cc75c39 100644 --- a/modules.local/ppcp-wc-gateway/src/Settings/SettingsListener.php +++ b/modules.local/ppcp-wc-gateway/src/Settings/SettingsListener.php @@ -86,6 +86,12 @@ class SettingsListener case 'text': $settings[$key] = isset($rawData[$key]) ? sanitize_text_field($rawData[$key]) : ''; break; + case 'password': + if (empty($rawData[$key])) { + break; + } + $settings[$key] = sanitize_text_field($rawData[$key]); + break; case 'ppcp-multiselect': $values = isset($rawData[$key]) ? (array) $rawData[$key] : []; $valuesToSave = []; diff --git a/modules.local/ppcp-webhooks/services.php b/modules.local/ppcp-webhooks/services.php index 59241ac2e..b9860fda3 100644 --- a/modules.local/ppcp-webhooks/services.php +++ b/modules.local/ppcp-webhooks/services.php @@ -39,11 +39,12 @@ return [ }, 'webhook.endpoint.handler' => function(ContainerInterface $container) : array { $logger = $container->get('woocommerce.logger.woocommerce'); + $prefix = $container->get('api.prefix'); return [ - new CheckoutOrderCompleted($logger), - new PaymentCaptureRefunded($logger), - new PaymentCaptureReversed($logger), - new PaymentCaptureCompleted($logger), + new CheckoutOrderCompleted($logger, $prefix), + new PaymentCaptureRefunded($logger, $prefix), + new PaymentCaptureReversed($logger, $prefix), + new PaymentCaptureCompleted($logger, $prefix), ]; } ]; diff --git a/modules.local/ppcp-webhooks/src/Handler/CheckoutOrderCompleted.php b/modules.local/ppcp-webhooks/src/Handler/CheckoutOrderCompleted.php index 30abdbb51..85693a48d 100644 --- a/modules.local/ppcp-webhooks/src/Handler/CheckoutOrderCompleted.php +++ b/modules.local/ppcp-webhooks/src/Handler/CheckoutOrderCompleted.php @@ -9,10 +9,12 @@ use Psr\Log\LoggerInterface; class CheckoutOrderCompleted implements RequestHandler { + use PrefixTrait; private $logger; - public function __construct(LoggerInterface $logger) + public function __construct(LoggerInterface $logger, string $prefix) { $this->logger = $logger; + $this->prefix = $prefix; } public function eventTypes(): array @@ -32,7 +34,7 @@ class CheckoutOrderCompleted implements RequestHandler public function handleRequest(\WP_REST_Request $request): \WP_REST_Response { $response = ['success' => false]; - $orderIds = array_filter( + $customIds = array_filter( array_map( static function (array $purchaseUnit): string { return isset($purchaseUnit['custom_id']) ? (string) $purchaseUnit['custom_id'] : ''; @@ -45,7 +47,7 @@ class CheckoutOrderCompleted implements RequestHandler } ); - if (empty($orderIds)) { + if (empty($customIds)) { $message = sprintf( // translators: %s is the PayPal webhook Id. __('No order for webhook event %s was found.', 'woocommerce-paypal-commerce-gateway'), @@ -62,6 +64,13 @@ class CheckoutOrderCompleted implements RequestHandler return rest_ensure_response($response); } + $orderIds = array_map( + [ + $this, + 'sanitizeCustomId', + ], + $customIds + ); $args = [ 'post__in' => $orderIds, 'limit' => -1, diff --git a/modules.local/ppcp-webhooks/src/Handler/PaymentCaptureCompleted.php b/modules.local/ppcp-webhooks/src/Handler/PaymentCaptureCompleted.php index ca9859c25..07cb87a31 100644 --- a/modules.local/ppcp-webhooks/src/Handler/PaymentCaptureCompleted.php +++ b/modules.local/ppcp-webhooks/src/Handler/PaymentCaptureCompleted.php @@ -10,11 +10,12 @@ use Psr\Log\LoggerInterface; class PaymentCaptureCompleted implements RequestHandler { + use PrefixTrait; private $logger; - - public function __construct(LoggerInterface $logger) + public function __construct(LoggerInterface $logger, string $prefix) { $this->logger = $logger; + $this->prefix = $prefix; } public function eventTypes(): array @@ -31,7 +32,23 @@ class PaymentCaptureCompleted implements RequestHandler public function handleRequest(\WP_REST_Request $request): \WP_REST_Response { $response = ['success' => false]; - $orderId = (int) $request['resource']['custom_id']; + $orderId = isset($request['resource']['custom_id']) ? $this->sanitizeCustomId($request['resource']['custom_id']) : 0; + if (! $orderId) { + $message = sprintf( + // translators: %s is the PayPal webhook Id. + __('No order for webhook event %s was found.', 'woocommerce-paypal-commerce-gateway'), + isset($request['id']) ? $request['id'] : '' + ); + $this->logger->log( + 'warning', + $message, + [ + 'request' => $request, + ] + ); + $response['message'] = $message; + return rest_ensure_response($response); + } $wcOrder = wc_get_order($orderId); if (! is_a($wcOrder, \WC_Order::class)) { diff --git a/modules.local/ppcp-webhooks/src/Handler/PaymentCaptureRefunded.php b/modules.local/ppcp-webhooks/src/Handler/PaymentCaptureRefunded.php index 0bbdfeeaf..31028cf50 100644 --- a/modules.local/ppcp-webhooks/src/Handler/PaymentCaptureRefunded.php +++ b/modules.local/ppcp-webhooks/src/Handler/PaymentCaptureRefunded.php @@ -9,10 +9,12 @@ use Psr\Log\LoggerInterface; class PaymentCaptureRefunded implements RequestHandler { + use PrefixTrait; private $logger; - public function __construct(LoggerInterface $logger) + public function __construct(LoggerInterface $logger, string $prefix) { $this->logger = $logger; + $this->prefix = $prefix; } public function eventTypes(): array @@ -29,7 +31,7 @@ class PaymentCaptureRefunded implements RequestHandler public function handleRequest(\WP_REST_Request $request): \WP_REST_Response { $response = ['success' => false]; - $orderId = isset($request['resource']['custom_id']) ? (int) $request['resource']['custom_id'] : 0; + $orderId = isset($request['resource']['custom_id']) ? $this->sanitizeCustomId($request['resource']['custom_id']) : 0; if (! $orderId) { $message = sprintf( // translators: %s is the PayPal webhook Id. diff --git a/modules.local/ppcp-webhooks/src/Handler/PaymentCaptureReversed.php b/modules.local/ppcp-webhooks/src/Handler/PaymentCaptureReversed.php index 70c056339..ea5baffc8 100644 --- a/modules.local/ppcp-webhooks/src/Handler/PaymentCaptureReversed.php +++ b/modules.local/ppcp-webhooks/src/Handler/PaymentCaptureReversed.php @@ -9,10 +9,12 @@ use Psr\Log\LoggerInterface; class PaymentCaptureReversed implements RequestHandler { + use PrefixTrait; private $logger; - public function __construct(LoggerInterface $logger) + public function __construct(LoggerInterface $logger, string $prefix) { $this->logger = $logger; + $this->prefix = $prefix; } public function eventTypes(): array @@ -33,7 +35,7 @@ class PaymentCaptureReversed implements RequestHandler public function handleRequest(\WP_REST_Request $request): \WP_REST_Response { $response = ['success' => false]; - $orderId = isset($request['resource']['custom_id']) ? (int) $request['resource']['custom_id'] : 0; + $orderId = isset($request['resource']['custom_id']) ? $this->sanitizeCustomId($request['resource']['custom_id']) : 0; if (! $orderId) { $message = sprintf( // translators: %s is the PayPal webhook Id. diff --git a/modules.local/ppcp-webhooks/src/Handler/PrefixTrait.php b/modules.local/ppcp-webhooks/src/Handler/PrefixTrait.php new file mode 100644 index 000000000..eb9e09146 --- /dev/null +++ b/modules.local/ppcp-webhooks/src/Handler/PrefixTrait.php @@ -0,0 +1,16 @@ +prefix, '', $customId); + return (int) $orderId; + } +} \ No newline at end of file