Move vaulted subscriptions intent logic to module

This commit is contained in:
Emili Castells Guasch 2023-09-19 12:19:31 +02:00
parent 80cc94939d
commit 7d17e4a892
3 changed files with 24 additions and 7 deletions

View file

@ -194,7 +194,7 @@ class OrderEndpoint {
): Order {
$bearer = $this->bearer->bearer();
$data = array(
'intent' => ( $this->subscription_helper->cart_contains_subscription() || $this->subscription_helper->current_product_is_subscription() ) ? 'AUTHORIZE' : $this->intent,
'intent' => apply_filters( 'woocommerce_paypal_payments_saved_payment_subscription_intent', $this->intent ),
'purchase_units' => array_map(
static function ( PurchaseUnit $item ) use ( $shipping_preference ): array {
$data = $item->to_array();

View file

@ -1547,16 +1547,14 @@ class SmartButton implements SmartButtonInterface {
* @throws NotFoundException If intent is not found.
*/
private function intent(): string {
$intent = ( $this->settings->has( 'intent' ) ) ? $this->settings->get( 'intent' ) : 'capture';
$product_intent = $this->subscription_helper->current_product_is_subscription() ? 'authorize' : $intent;
$other_context_intent = $this->subscription_helper->cart_contains_subscription() ? 'authorize' : $intent;
$subscription_mode = $this->settings->has( 'subscriptions_mode' ) ? $this->settings->get( 'subscriptions_mode' ) : '';
if ( $this->subscription_helper->need_subscription_intent( $subscription_mode ) ) {
return 'subscription';
}
return $this->context() === 'product' ? $product_intent : $other_context_intent;
$intent = $this->settings->has( 'intent' ) ? $this->settings->get( 'intent' ) : 'capture';
return strtolower( apply_filters( 'woocommerce_paypal_payments_saved_payment_subscription_intent', $intent ) );
}
/**

View file

@ -9,6 +9,7 @@ declare(strict_types=1);
namespace WooCommerce\PayPalCommerce\SavedPaymentChecker;
use WooCommerce\PayPalCommerce\Subscription\Helper\SubscriptionHelper;
use WooCommerce\PayPalCommerce\Vendor\Dhii\Container\ServiceProvider;
use WooCommerce\PayPalCommerce\Vendor\Dhii\Modular\Module\ModuleInterface;
use WooCommerce\PayPalCommerce\Vendor\Interop\Container\ServiceProviderInterface;
@ -32,5 +33,23 @@ class SavedPaymentCheckerModule implements ModuleInterface {
/**
* {@inheritDoc}
*/
public function run( ContainerInterface $c ): void {}
public function run( ContainerInterface $c ): void {
/**
* Set authorize intent for vaulted subscriptions, so we can void if payment not saved.
*/
add_filter(
'woocommerce_paypal_payments_saved_payment_subscription_intent',
function( string $intent ) use ( $c ) {
$subscription_helper = $c->get( 'subscription.helper' );
assert( $subscription_helper instanceof SubscriptionHelper );
if ( $subscription_helper->cart_contains_subscription() || $subscription_helper->current_product_is_subscription() ) {
return 'AUTHORIZE';
}
return $intent;
}
);
}
}