mirror of
https://github.com/woocommerce/woocommerce-paypal-payments.git
synced 2025-09-06 18:16:38 +08:00
Do not check order approved status if it does not contains physical goods
This commit is contained in:
parent
77230fefa8
commit
0a993f854d
7 changed files with 88 additions and 8 deletions
|
@ -47,6 +47,7 @@ use WooCommerce\PayPalCommerce\ApiClient\Factory\WebhookEventFactory;
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\WebhookFactory;
|
use WooCommerce\PayPalCommerce\ApiClient\Factory\WebhookFactory;
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Helper\Cache;
|
use WooCommerce\PayPalCommerce\ApiClient\Helper\Cache;
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Helper\DccApplies;
|
use WooCommerce\PayPalCommerce\ApiClient\Helper\DccApplies;
|
||||||
|
use WooCommerce\PayPalCommerce\ApiClient\Helper\OrderHelper;
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Repository\ApplicationContextRepository;
|
use WooCommerce\PayPalCommerce\ApiClient\Repository\ApplicationContextRepository;
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Repository\CartRepository;
|
use WooCommerce\PayPalCommerce\ApiClient\Repository\CartRepository;
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Repository\CustomerRepository;
|
use WooCommerce\PayPalCommerce\ApiClient\Repository\CustomerRepository;
|
||||||
|
@ -671,4 +672,7 @@ return array(
|
||||||
'SE',
|
'SE',
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
'api.order-helper' => static function( ContainerInterface $container ): OrderHelper {
|
||||||
|
return new OrderHelper();
|
||||||
|
},
|
||||||
);
|
);
|
||||||
|
|
34
modules/ppcp-api-client/src/Helper/OrderHelper.php
Normal file
34
modules/ppcp-api-client/src/Helper/OrderHelper.php
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* PayPal order helper.
|
||||||
|
*
|
||||||
|
* @package WooCommerce\PayPalCommerce\ApiClient\Helper
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace WooCommerce\PayPalCommerce\ApiClient\Helper;
|
||||||
|
|
||||||
|
use WooCommerce\PayPalCommerce\ApiClient\Entity\Order;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class OrderHelper
|
||||||
|
*/
|
||||||
|
class OrderHelper {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if order contains virtual products.
|
||||||
|
*
|
||||||
|
* @param Order $order PayPal order.
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function contains_physical_goods( Order $order ): bool {
|
||||||
|
foreach ( $order->purchase_units() as $unit ) {
|
||||||
|
if ( $unit->contains_physical_goods() ) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
|
@ -151,6 +151,7 @@ return array(
|
||||||
$three_d_secure = $container->get( 'button.helper.three-d-secure' );
|
$three_d_secure = $container->get( 'button.helper.three-d-secure' );
|
||||||
$settings = $container->get( 'wcgateway.settings' );
|
$settings = $container->get( 'wcgateway.settings' );
|
||||||
$dcc_applies = $container->get( 'api.helpers.dccapplies' );
|
$dcc_applies = $container->get( 'api.helpers.dccapplies' );
|
||||||
|
$order_helper = $container->get( 'api.order-helper' );
|
||||||
$logger = $container->get( 'woocommerce.logger.woocommerce' );
|
$logger = $container->get( 'woocommerce.logger.woocommerce' );
|
||||||
return new ApproveOrderEndpoint(
|
return new ApproveOrderEndpoint(
|
||||||
$request_data,
|
$request_data,
|
||||||
|
@ -159,6 +160,7 @@ return array(
|
||||||
$three_d_secure,
|
$three_d_secure,
|
||||||
$settings,
|
$settings,
|
||||||
$dcc_applies,
|
$dcc_applies,
|
||||||
|
$order_helper,
|
||||||
$logger
|
$logger
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|
|
@ -16,6 +16,7 @@ use WooCommerce\PayPalCommerce\ApiClient\Endpoint\OrderEndpoint;
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Entity\OrderStatus;
|
use WooCommerce\PayPalCommerce\ApiClient\Entity\OrderStatus;
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Exception\PayPalApiException;
|
use WooCommerce\PayPalCommerce\ApiClient\Exception\PayPalApiException;
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Helper\DccApplies;
|
use WooCommerce\PayPalCommerce\ApiClient\Helper\DccApplies;
|
||||||
|
use WooCommerce\PayPalCommerce\ApiClient\Helper\OrderHelper;
|
||||||
use WooCommerce\PayPalCommerce\Button\Exception\RuntimeException;
|
use WooCommerce\PayPalCommerce\Button\Exception\RuntimeException;
|
||||||
use WooCommerce\PayPalCommerce\Button\Helper\ThreeDSecure;
|
use WooCommerce\PayPalCommerce\Button\Helper\ThreeDSecure;
|
||||||
use WooCommerce\PayPalCommerce\Session\SessionHandler;
|
use WooCommerce\PayPalCommerce\Session\SessionHandler;
|
||||||
|
@ -26,7 +27,6 @@ use WooCommerce\PayPalCommerce\WcGateway\Settings\Settings;
|
||||||
*/
|
*/
|
||||||
class ApproveOrderEndpoint implements EndpointInterface {
|
class ApproveOrderEndpoint implements EndpointInterface {
|
||||||
|
|
||||||
|
|
||||||
const ENDPOINT = 'ppc-approve-order';
|
const ENDPOINT = 'ppc-approve-order';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -71,6 +71,13 @@ class ApproveOrderEndpoint implements EndpointInterface {
|
||||||
*/
|
*/
|
||||||
private $dcc_applies;
|
private $dcc_applies;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The order helper.
|
||||||
|
*
|
||||||
|
* @var OrderHelper
|
||||||
|
*/
|
||||||
|
protected $order_helper;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The logger.
|
* The logger.
|
||||||
*
|
*
|
||||||
|
@ -87,6 +94,7 @@ class ApproveOrderEndpoint implements EndpointInterface {
|
||||||
* @param ThreeDSecure $three_d_secure The 3d secure helper object.
|
* @param ThreeDSecure $three_d_secure The 3d secure helper object.
|
||||||
* @param Settings $settings The settings.
|
* @param Settings $settings The settings.
|
||||||
* @param DccApplies $dcc_applies The DCC applies object.
|
* @param DccApplies $dcc_applies The DCC applies object.
|
||||||
|
* @param OrderHelper $order_helper The order helper.
|
||||||
* @param LoggerInterface $logger The logger.
|
* @param LoggerInterface $logger The logger.
|
||||||
*/
|
*/
|
||||||
public function __construct(
|
public function __construct(
|
||||||
|
@ -96,6 +104,7 @@ class ApproveOrderEndpoint implements EndpointInterface {
|
||||||
ThreeDSecure $three_d_secure,
|
ThreeDSecure $three_d_secure,
|
||||||
Settings $settings,
|
Settings $settings,
|
||||||
DccApplies $dcc_applies,
|
DccApplies $dcc_applies,
|
||||||
|
OrderHelper $order_helper,
|
||||||
LoggerInterface $logger
|
LoggerInterface $logger
|
||||||
) {
|
) {
|
||||||
|
|
||||||
|
@ -105,6 +114,7 @@ class ApproveOrderEndpoint implements EndpointInterface {
|
||||||
$this->threed_secure = $three_d_secure;
|
$this->threed_secure = $three_d_secure;
|
||||||
$this->settings = $settings;
|
$this->settings = $settings;
|
||||||
$this->dcc_applies = $dcc_applies;
|
$this->dcc_applies = $dcc_applies;
|
||||||
|
$this->order_helper = $order_helper;
|
||||||
$this->logger = $logger;
|
$this->logger = $logger;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -173,7 +183,7 @@ class ApproveOrderEndpoint implements EndpointInterface {
|
||||||
wp_send_json_success( $order );
|
wp_send_json_success( $order );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( ! $order->status()->is( OrderStatus::APPROVED ) ) {
|
if ( $this->order_helper->contains_physical_goods( $order ) && ! $order->status()->is( OrderStatus::APPROVED ) ) {
|
||||||
$message = sprintf(
|
$message = sprintf(
|
||||||
// translators: %s is the id of the order.
|
// translators: %s is the id of the order.
|
||||||
__( 'Order %s is not approved yet.', 'woocommerce-paypal-payments' ),
|
__( 'Order %s is not approved yet.', 'woocommerce-paypal-payments' ),
|
||||||
|
|
|
@ -218,6 +218,7 @@ return array(
|
||||||
$environment = $container->get( 'onboarding.environment' );
|
$environment = $container->get( 'onboarding.environment' );
|
||||||
$logger = $container->get( 'woocommerce.logger.woocommerce' );
|
$logger = $container->get( 'woocommerce.logger.woocommerce' );
|
||||||
$subscription_helper = $container->get( 'subscription.helper' );
|
$subscription_helper = $container->get( 'subscription.helper' );
|
||||||
|
$order_helper = $container->get('api.order-helper');
|
||||||
return new OrderProcessor(
|
return new OrderProcessor(
|
||||||
$session_handler,
|
$session_handler,
|
||||||
$order_endpoint,
|
$order_endpoint,
|
||||||
|
@ -227,7 +228,8 @@ return array(
|
||||||
$settings,
|
$settings,
|
||||||
$logger,
|
$logger,
|
||||||
$environment,
|
$environment,
|
||||||
$subscription_helper
|
$subscription_helper,
|
||||||
|
$order_helper
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
'wcgateway.processor.refunds' => static function ( ContainerInterface $container ): RefundProcessor {
|
'wcgateway.processor.refunds' => static function ( ContainerInterface $container ): RefundProcessor {
|
||||||
|
|
|
@ -14,6 +14,7 @@ use WooCommerce\PayPalCommerce\ApiClient\Endpoint\OrderEndpoint;
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Entity\Order;
|
use WooCommerce\PayPalCommerce\ApiClient\Entity\Order;
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Entity\OrderStatus;
|
use WooCommerce\PayPalCommerce\ApiClient\Entity\OrderStatus;
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\OrderFactory;
|
use WooCommerce\PayPalCommerce\ApiClient\Factory\OrderFactory;
|
||||||
|
use WooCommerce\PayPalCommerce\ApiClient\Helper\OrderHelper;
|
||||||
use WooCommerce\PayPalCommerce\Button\Helper\ThreeDSecure;
|
use WooCommerce\PayPalCommerce\Button\Helper\ThreeDSecure;
|
||||||
use WooCommerce\PayPalCommerce\Onboarding\Environment;
|
use WooCommerce\PayPalCommerce\Onboarding\Environment;
|
||||||
use WooCommerce\PayPalCommerce\Session\SessionHandler;
|
use WooCommerce\PayPalCommerce\Session\SessionHandler;
|
||||||
|
@ -106,6 +107,13 @@ class OrderProcessor {
|
||||||
*/
|
*/
|
||||||
private $subscription_helper;
|
private $subscription_helper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The order helper.
|
||||||
|
*
|
||||||
|
* @var OrderHelper
|
||||||
|
*/
|
||||||
|
private $order_helper;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* OrderProcessor constructor.
|
* OrderProcessor constructor.
|
||||||
*
|
*
|
||||||
|
@ -118,6 +126,7 @@ class OrderProcessor {
|
||||||
* @param LoggerInterface $logger A logger service.
|
* @param LoggerInterface $logger A logger service.
|
||||||
* @param Environment $environment The environment.
|
* @param Environment $environment The environment.
|
||||||
* @param SubscriptionHelper $subscription_helper The subscription helper.
|
* @param SubscriptionHelper $subscription_helper The subscription helper.
|
||||||
|
* @param OrderHelper $order_helper The order helper.
|
||||||
*/
|
*/
|
||||||
public function __construct(
|
public function __construct(
|
||||||
SessionHandler $session_handler,
|
SessionHandler $session_handler,
|
||||||
|
@ -128,7 +137,8 @@ class OrderProcessor {
|
||||||
Settings $settings,
|
Settings $settings,
|
||||||
LoggerInterface $logger,
|
LoggerInterface $logger,
|
||||||
Environment $environment,
|
Environment $environment,
|
||||||
SubscriptionHelper $subscription_helper
|
SubscriptionHelper $subscription_helper,
|
||||||
|
OrderHelper $order_helper
|
||||||
) {
|
) {
|
||||||
|
|
||||||
$this->session_handler = $session_handler;
|
$this->session_handler = $session_handler;
|
||||||
|
@ -140,6 +150,7 @@ class OrderProcessor {
|
||||||
$this->environment = $environment;
|
$this->environment = $environment;
|
||||||
$this->logger = $logger;
|
$this->logger = $logger;
|
||||||
$this->subscription_helper = $subscription_helper;
|
$this->subscription_helper = $subscription_helper;
|
||||||
|
$this->order_helper = $order_helper;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -160,7 +171,7 @@ class OrderProcessor {
|
||||||
$this->add_paypal_meta( $wc_order, $order, $this->environment );
|
$this->add_paypal_meta( $wc_order, $order, $this->environment );
|
||||||
|
|
||||||
$error_message = null;
|
$error_message = null;
|
||||||
if ( ! $this->order_is_approved( $order ) ) {
|
if ( $this->order_helper->contains_physical_goods( $order ) && ! $this->order_is_approved( $order ) ) {
|
||||||
$error_message = __(
|
$error_message = __(
|
||||||
'The payment has not been approved yet.',
|
'The payment has not been approved yet.',
|
||||||
'woocommerce-paypal-payments'
|
'woocommerce-paypal-payments'
|
||||||
|
|
|
@ -16,6 +16,7 @@ use WooCommerce\PayPalCommerce\ApiClient\Entity\OrderStatus;
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Entity\Payments;
|
use WooCommerce\PayPalCommerce\ApiClient\Entity\Payments;
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Entity\PurchaseUnit;
|
use WooCommerce\PayPalCommerce\ApiClient\Entity\PurchaseUnit;
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\OrderFactory;
|
use WooCommerce\PayPalCommerce\ApiClient\Factory\OrderFactory;
|
||||||
|
use WooCommerce\PayPalCommerce\ApiClient\Helper\OrderHelper;
|
||||||
use WooCommerce\PayPalCommerce\Button\Helper\ThreeDSecure;
|
use WooCommerce\PayPalCommerce\Button\Helper\ThreeDSecure;
|
||||||
use WooCommerce\PayPalCommerce\Onboarding\Environment;
|
use WooCommerce\PayPalCommerce\Onboarding\Environment;
|
||||||
use WooCommerce\PayPalCommerce\Session\SessionHandler;
|
use WooCommerce\PayPalCommerce\Session\SessionHandler;
|
||||||
|
@ -129,6 +130,8 @@ class OrderProcessorTest extends TestCase
|
||||||
$subscription_helper = Mockery::mock(SubscriptionHelper::class);
|
$subscription_helper = Mockery::mock(SubscriptionHelper::class);
|
||||||
$subscription_helper->shouldReceive('has_subscription');
|
$subscription_helper->shouldReceive('has_subscription');
|
||||||
|
|
||||||
|
$order_helper = Mockery::mock(OrderHelper::class);
|
||||||
|
|
||||||
$testee = new OrderProcessor(
|
$testee = new OrderProcessor(
|
||||||
$sessionHandler,
|
$sessionHandler,
|
||||||
$orderEndpoint,
|
$orderEndpoint,
|
||||||
|
@ -138,7 +141,8 @@ class OrderProcessorTest extends TestCase
|
||||||
$settings,
|
$settings,
|
||||||
$logger,
|
$logger,
|
||||||
$this->environment,
|
$this->environment,
|
||||||
$subscription_helper
|
$subscription_helper,
|
||||||
|
$order_helper
|
||||||
);
|
);
|
||||||
|
|
||||||
$wcOrder
|
$wcOrder
|
||||||
|
@ -165,6 +169,8 @@ class OrderProcessorTest extends TestCase
|
||||||
$wcOrder->expects('set_transaction_id')
|
$wcOrder->expects('set_transaction_id')
|
||||||
->with($transactionId);
|
->with($transactionId);
|
||||||
|
|
||||||
|
$order_helper->shouldReceive('contains_physical_goods')->andReturn(true);
|
||||||
|
|
||||||
$this->assertTrue($testee->process($wcOrder));
|
$this->assertTrue($testee->process($wcOrder));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -247,6 +253,8 @@ class OrderProcessorTest extends TestCase
|
||||||
$logger = Mockery::mock(LoggerInterface::class);
|
$logger = Mockery::mock(LoggerInterface::class);
|
||||||
$subscription_helper = Mockery::mock(SubscriptionHelper::class);
|
$subscription_helper = Mockery::mock(SubscriptionHelper::class);
|
||||||
|
|
||||||
|
$order_helper = Mockery::mock(OrderHelper::class);
|
||||||
|
|
||||||
$testee = new OrderProcessor(
|
$testee = new OrderProcessor(
|
||||||
$sessionHandler,
|
$sessionHandler,
|
||||||
$orderEndpoint,
|
$orderEndpoint,
|
||||||
|
@ -256,7 +264,8 @@ class OrderProcessorTest extends TestCase
|
||||||
$settings,
|
$settings,
|
||||||
$logger,
|
$logger,
|
||||||
$this->environment,
|
$this->environment,
|
||||||
$subscription_helper
|
$subscription_helper,
|
||||||
|
$order_helper
|
||||||
);
|
);
|
||||||
|
|
||||||
$wcOrder
|
$wcOrder
|
||||||
|
@ -277,6 +286,9 @@ class OrderProcessorTest extends TestCase
|
||||||
->with($transactionId);
|
->with($transactionId);
|
||||||
$wcOrder
|
$wcOrder
|
||||||
->expects('payment_complete');
|
->expects('payment_complete');
|
||||||
|
|
||||||
|
$order_helper->shouldReceive('contains_physical_goods')->andReturn(true);
|
||||||
|
|
||||||
$this->assertTrue($testee->process($wcOrder));
|
$this->assertTrue($testee->process($wcOrder));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -343,6 +355,8 @@ class OrderProcessorTest extends TestCase
|
||||||
$logger = Mockery::mock(LoggerInterface::class);
|
$logger = Mockery::mock(LoggerInterface::class);
|
||||||
$subscription_helper = Mockery::mock(SubscriptionHelper::class);
|
$subscription_helper = Mockery::mock(SubscriptionHelper::class);
|
||||||
|
|
||||||
|
$order_helper = Mockery::mock(OrderHelper::class);
|
||||||
|
|
||||||
$testee = new OrderProcessor(
|
$testee = new OrderProcessor(
|
||||||
$sessionHandler,
|
$sessionHandler,
|
||||||
$orderEndpoint,
|
$orderEndpoint,
|
||||||
|
@ -352,7 +366,8 @@ class OrderProcessorTest extends TestCase
|
||||||
$settings,
|
$settings,
|
||||||
$logger,
|
$logger,
|
||||||
$this->environment,
|
$this->environment,
|
||||||
$subscription_helper
|
$subscription_helper,
|
||||||
|
$order_helper
|
||||||
);
|
);
|
||||||
|
|
||||||
$wcOrder
|
$wcOrder
|
||||||
|
@ -368,6 +383,8 @@ class OrderProcessorTest extends TestCase
|
||||||
$orderIntent
|
$orderIntent
|
||||||
);
|
);
|
||||||
|
|
||||||
|
$order_helper->shouldReceive('contains_physical_goods')->andReturn(true);
|
||||||
|
|
||||||
$this->assertFalse($testee->process($wcOrder));
|
$this->assertFalse($testee->process($wcOrder));
|
||||||
$this->assertNotEmpty($testee->last_error());
|
$this->assertNotEmpty($testee->last_error());
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue