Merge pull request #2015 from woocommerce/PCP-2626-cannot-enable-apple-pay

Cannot enable Apple Pay when API credentials were manually created (2626)
This commit is contained in:
Emili Castells 2024-02-15 16:31:12 +01:00 committed by GitHub
commit 0181186f35
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 186 additions and 25 deletions

View file

@ -21,19 +21,37 @@ class SellerStatus {
*/ */
private $products; private $products;
/**
* The capabilities.
*
* @var SellerStatusCapability[]
*/
private $capabilities;
/** /**
* SellerStatus constructor. * SellerStatus constructor.
* *
* @param SellerStatusProduct[] $products The products. * @param SellerStatusProduct[] $products The products.
* @param SellerStatusCapability[] $capabilities The capabilities.
*
* @psalm-suppress RedundantConditionGivenDocblockType
*/ */
public function __construct( array $products ) { public function __construct( array $products, array $capabilities ) {
foreach ( $products as $key => $product ) { foreach ( $products as $key => $product ) {
if ( is_a( $product, SellerStatusProduct::class ) ) { if ( is_a( $product, SellerStatusProduct::class ) ) {
continue; continue;
} }
unset( $products[ $key ] ); unset( $products[ $key ] );
} }
$this->products = $products; foreach ( $capabilities as $key => $capability ) {
if ( is_a( $capability, SellerStatusCapability::class ) ) {
continue;
}
unset( $capabilities[ $key ] );
}
$this->products = $products;
$this->capabilities = $capabilities;
} }
/** /**
@ -45,6 +63,15 @@ class SellerStatus {
return $this->products; return $this->products;
} }
/**
* Returns the capabilities.
*
* @return SellerStatusCapability[]
*/
public function capabilities() : array {
return $this->capabilities;
}
/** /**
* Returns the enitity as array. * Returns the enitity as array.
* *
@ -58,8 +85,16 @@ class SellerStatus {
$this->products() $this->products()
); );
$capabilities = array_map(
function( SellerStatusCapability $capability ) : array {
return $capability->to_array();
},
$this->capabilities()
);
return array( return array(
'products' => $products, 'products' => $products,
'capabilities' => $capabilities,
); );
} }
} }

View file

@ -0,0 +1,77 @@
<?php
/**
* The capabilities of a seller status.
*
* @package WooCommerce\PayPalCommerce\ApiClient\Entity
*/
declare( strict_types=1 );
namespace WooCommerce\PayPalCommerce\ApiClient\Entity;
/**
* Class SellerStatusCapability
*/
class SellerStatusCapability {
const STATUS_ACTIVE = 'ACTIVE';
/**
* The name of the product.
*
* @var string
*/
private $name;
/**
* The status of the capability.
*
* @var string
*/
private $status;
/**
* SellerStatusCapability constructor.
*
* @param string $name The name of the product.
* @param string $status The status of the capability.
*/
public function __construct(
string $name,
string $status
) {
$this->name = $name;
$this->status = $status;
}
/**
* Returns the name of the product.
*
* @return string
*/
public function name() : string {
return $this->name;
}
/**
* Returns the status for this capability.
*
* @return string
*/
public function status() : string {
return $this->status;
}
/**
* Returns the entity as array.
*
* @return array
*/
public function to_array() : array {
return array(
'name' => $this->name(),
'status' => $this->status(),
);
}
}

View file

@ -11,6 +11,7 @@ namespace WooCommerce\PayPalCommerce\ApiClient\Factory;
use WooCommerce\PayPalCommerce\ApiClient\Entity\SellerStatus; use WooCommerce\PayPalCommerce\ApiClient\Entity\SellerStatus;
use WooCommerce\PayPalCommerce\ApiClient\Entity\SellerStatusProduct; use WooCommerce\PayPalCommerce\ApiClient\Entity\SellerStatusProduct;
use WooCommerce\PayPalCommerce\ApiClient\Entity\SellerStatusCapability;
/** /**
* Class SellerStatusFactory * Class SellerStatusFactory
@ -37,6 +38,17 @@ class SellerStatusFactory {
isset( $json->products ) ? (array) $json->products : array() isset( $json->products ) ? (array) $json->products : array()
); );
return new SellerStatus( $products ); $capabilities = array_map(
function( $json ) : SellerStatusCapability {
$capability = new SellerStatusCapability(
isset( $json->name ) ? (string) $json->name : '',
isset( $json->status ) ? (string) $json->status : ''
);
return $capability;
},
isset( $json->capabilities ) ? (array) $json->capabilities : array()
);
return new SellerStatus( $products, $capabilities );
} }
} }

View file

@ -18,6 +18,7 @@ use WooCommerce\PayPalCommerce\Applepay\Assets\BlocksPaymentMethod;
use WooCommerce\PayPalCommerce\Applepay\Assets\PropertiesDictionary; use WooCommerce\PayPalCommerce\Applepay\Assets\PropertiesDictionary;
use WooCommerce\PayPalCommerce\Applepay\Helper\ApmApplies; use WooCommerce\PayPalCommerce\Applepay\Helper\ApmApplies;
use WooCommerce\PayPalCommerce\Applepay\Helper\AvailabilityNotice; use WooCommerce\PayPalCommerce\Applepay\Helper\AvailabilityNotice;
use WooCommerce\PayPalCommerce\Common\Pattern\SingletonDecorator;
use WooCommerce\PayPalCommerce\Onboarding\Environment; use WooCommerce\PayPalCommerce\Onboarding\Environment;
use WooCommerce\PayPalCommerce\Onboarding\State; use WooCommerce\PayPalCommerce\Onboarding\State;
use WooCommerce\PayPalCommerce\Vendor\Psr\Container\ContainerInterface; use WooCommerce\PayPalCommerce\Vendor\Psr\Container\ContainerInterface;
@ -72,14 +73,16 @@ return array(
return $settings->has( 'applepay_validated' ) ? $settings->get( 'applepay_validated' ) === true : false; return $settings->has( 'applepay_validated' ) ? $settings->get( 'applepay_validated' ) === true : false;
}, },
'applepay.apple-product-status' => static function( ContainerInterface $container ): AppleProductStatus { 'applepay.apple-product-status' => SingletonDecorator::make(
return new AppleProductStatus( static function( ContainerInterface $container ): AppleProductStatus {
$container->get( 'wcgateway.settings' ), return new AppleProductStatus(
$container->get( 'api.endpoint.partners' ), $container->get( 'wcgateway.settings' ),
$container->get( 'onboarding.state' ), $container->get( 'api.endpoint.partners' ),
$container->get( 'api.helper.failure-registry' ) $container->get( 'onboarding.state' ),
); $container->get( 'api.helper.failure-registry' )
}, );
}
),
'applepay.available' => static function ( ContainerInterface $container ): bool { 'applepay.available' => static function ( ContainerInterface $container ): bool {
if ( apply_filters( 'woocommerce_paypal_payments_applepay_validate_product_status', true ) ) { if ( apply_filters( 'woocommerce_paypal_payments_applepay_validate_product_status', true ) ) {
$status = $container->get( 'applepay.apple-product-status' ); $status = $container->get( 'applepay.apple-product-status' );

View file

@ -11,6 +11,7 @@ namespace WooCommerce\PayPalCommerce\Applepay\Assets;
use Throwable; use Throwable;
use WooCommerce\PayPalCommerce\ApiClient\Endpoint\PartnersEndpoint; use WooCommerce\PayPalCommerce\ApiClient\Endpoint\PartnersEndpoint;
use WooCommerce\PayPalCommerce\ApiClient\Entity\SellerStatusCapability;
use WooCommerce\PayPalCommerce\ApiClient\Helper\FailureRegistry; use WooCommerce\PayPalCommerce\ApiClient\Helper\FailureRegistry;
use WooCommerce\PayPalCommerce\Onboarding\State; use WooCommerce\PayPalCommerce\Onboarding\State;
use WooCommerce\PayPalCommerce\WcGateway\Settings\Settings; use WooCommerce\PayPalCommerce\WcGateway\Settings\Settings;
@ -100,6 +101,11 @@ class AppleProductStatus {
return false; return false;
} }
$status_override = apply_filters( 'woocommerce_paypal_payments_apple_pay_product_status', null );
if ( null !== $status_override ) {
return $status_override;
}
// If status was already checked on this request return the same result. // If status was already checked on this request return the same result.
if ( null !== $this->current_status ) { if ( null !== $this->current_status ) {
return $this->current_status; return $this->current_status;
@ -128,21 +134,32 @@ class AppleProductStatus {
} }
// Check the seller status for the intended capability. // Check the seller status for the intended capability.
$has_capability = false;
foreach ( $seller_status->products() as $product ) { foreach ( $seller_status->products() as $product ) {
if ( $product->name() !== 'PAYMENT_METHODS' ) { if ( $product->name() !== 'PAYMENT_METHODS' ) {
continue; continue;
} }
if ( in_array( self::CAPABILITY_NAME, $product->capabilities(), true ) ) { if ( in_array( self::CAPABILITY_NAME, $product->capabilities(), true ) ) {
// Capability found, persist status and return true. $has_capability = true;
$this->settings->set( self::SETTINGS_KEY, self::SETTINGS_VALUE_ENABLED );
$this->settings->persist();
$this->current_status = true;
return $this->current_status;
} }
} }
foreach ( $seller_status->capabilities() as $capability ) {
if ( $capability->name() === self::CAPABILITY_NAME && $capability->status() === SellerStatusCapability::STATUS_ACTIVE ) {
$has_capability = true;
}
}
if ( $has_capability ) {
// Capability found, persist status and return true.
$this->settings->set( self::SETTINGS_KEY, self::SETTINGS_VALUE_ENABLED );
$this->settings->persist();
$this->current_status = true;
return $this->current_status;
}
// Capability not found, persist status and return false. // Capability not found, persist status and return false.
$this->settings->set( self::SETTINGS_KEY, self::SETTINGS_VALUE_DISABLED ); $this->settings->set( self::SETTINGS_KEY, self::SETTINGS_VALUE_DISABLED );
$this->settings->persist(); $this->settings->persist();

View file

@ -11,6 +11,7 @@ namespace WooCommerce\PayPalCommerce\Googlepay\Helper;
use Throwable; use Throwable;
use WooCommerce\PayPalCommerce\ApiClient\Endpoint\PartnersEndpoint; use WooCommerce\PayPalCommerce\ApiClient\Endpoint\PartnersEndpoint;
use WooCommerce\PayPalCommerce\ApiClient\Entity\SellerStatusCapability;
use WooCommerce\PayPalCommerce\ApiClient\Helper\FailureRegistry; use WooCommerce\PayPalCommerce\ApiClient\Helper\FailureRegistry;
use WooCommerce\PayPalCommerce\Onboarding\State; use WooCommerce\PayPalCommerce\Onboarding\State;
use WooCommerce\PayPalCommerce\WcGateway\Settings\Settings; use WooCommerce\PayPalCommerce\WcGateway\Settings\Settings;
@ -100,6 +101,11 @@ class ApmProductStatus {
return false; return false;
} }
$status_override = apply_filters( 'woocommerce_paypal_payments_google_pay_product_status', null );
if ( null !== $status_override ) {
return $status_override;
}
// If status was already checked on this request return the same result. // If status was already checked on this request return the same result.
if ( null !== $this->current_status ) { if ( null !== $this->current_status ) {
return $this->current_status; return $this->current_status;
@ -128,21 +134,32 @@ class ApmProductStatus {
} }
// Check the seller status for the intended capability. // Check the seller status for the intended capability.
$has_capability = false;
foreach ( $seller_status->products() as $product ) { foreach ( $seller_status->products() as $product ) {
if ( $product->name() !== 'PAYMENT_METHODS' ) { if ( $product->name() !== 'PAYMENT_METHODS' ) {
continue; continue;
} }
if ( in_array( self::CAPABILITY_NAME, $product->capabilities(), true ) ) { if ( in_array( self::CAPABILITY_NAME, $product->capabilities(), true ) ) {
// Capability found, persist status and return true. $has_capability = true;
$this->settings->set( self::SETTINGS_KEY, self::SETTINGS_VALUE_ENABLED );
$this->settings->persist();
$this->current_status = true;
return $this->current_status;
} }
} }
foreach ( $seller_status->capabilities() as $capability ) {
if ( $capability->name() === self::CAPABILITY_NAME && $capability->status() === SellerStatusCapability::STATUS_ACTIVE ) {
$has_capability = true;
}
}
if ( $has_capability ) {
// Capability found, persist status and return true.
$this->settings->set( self::SETTINGS_KEY, self::SETTINGS_VALUE_ENABLED );
$this->settings->persist();
$this->current_status = true;
return $this->current_status;
}
// Capability not found, persist status and return false. // Capability not found, persist status and return false.
$this->settings->set( self::SETTINGS_KEY, self::SETTINGS_VALUE_DISABLED ); $this->settings->set( self::SETTINGS_KEY, self::SETTINGS_VALUE_DISABLED );
$this->settings->persist(); $this->settings->persist();