diff --git a/modules/ppcp-wc-gateway/services.php b/modules/ppcp-wc-gateway/services.php index ae589565a..0239ddb81 100644 --- a/modules/ppcp-wc-gateway/services.php +++ b/modules/ppcp-wc-gateway/services.php @@ -135,6 +135,7 @@ return array( $container->get( 'api.endpoint.order' ), $container->get( 'wcgateway.endpoint.capture-card-payment' ), $container->get( 'api.prefix' ), + $container->get( 'api.endpoint.payment-tokens' ), $logger ); }, @@ -1587,7 +1588,7 @@ return array( ) ); }, - 'wcgateway.endpoint.capture-card-payment' => static function( ContainerInterface $container ): CaptureCardPayment { + 'wcgateway.endpoint.capture-card-payment' => static function( ContainerInterface $container ): CaptureCardPayment { return new CaptureCardPayment( $container->get( 'api.host' ), $container->get( 'api.bearer' ), diff --git a/modules/ppcp-wc-gateway/src/Gateway/CreditCardGateway.php b/modules/ppcp-wc-gateway/src/Gateway/CreditCardGateway.php index 6d20ee8e5..1250eab98 100644 --- a/modules/ppcp-wc-gateway/src/Gateway/CreditCardGateway.php +++ b/modules/ppcp-wc-gateway/src/Gateway/CreditCardGateway.php @@ -15,6 +15,7 @@ use WC_Order; use WC_Payment_Tokens; use WooCommerce\PayPalCommerce\ApiClient\Endpoint\OrderEndpoint; use WooCommerce\PayPalCommerce\ApiClient\Endpoint\PaymentsEndpoint; +use WooCommerce\PayPalCommerce\ApiClient\Endpoint\PaymentTokensEndpoint; use WooCommerce\PayPalCommerce\ApiClient\Exception\PayPalApiException; use WooCommerce\PayPalCommerce\ApiClient\Exception\RuntimeException; use WooCommerce\PayPalCommerce\Onboarding\Environment; @@ -154,6 +155,13 @@ class CreditCardGateway extends \WC_Payment_Gateway_CC { */ private $prefix; + /** + * Payment tokens endpoint. + * + * @var PaymentTokensEndpoint + */ + private $payment_tokens_endpoint; + /** * The logger. * @@ -179,6 +187,7 @@ class CreditCardGateway extends \WC_Payment_Gateway_CC { * @param OrderEndpoint $order_endpoint The order endpoint. * @param CaptureCardPayment $capture_card_payment Capture card payment. * @param string $prefix The prefix. + * @param PaymentTokensEndpoint $payment_tokens_endpoint Payment tokens endpoint. * @param LoggerInterface $logger The logger. */ public function __construct( @@ -197,6 +206,7 @@ class CreditCardGateway extends \WC_Payment_Gateway_CC { OrderEndpoint $order_endpoint, CaptureCardPayment $capture_card_payment, string $prefix, + PaymentTokensEndpoint $payment_tokens_endpoint, LoggerInterface $logger ) { $this->id = self::ID; @@ -215,6 +225,7 @@ class CreditCardGateway extends \WC_Payment_Gateway_CC { $this->order_endpoint = $order_endpoint; $this->capture_card_payment = $capture_card_payment; $this->prefix = $prefix; + $this->payment_tokens_endpoint = $payment_tokens_endpoint; $this->logger = $logger; if ( $state->current_state() === State::STATE_ONBOARDED ) { @@ -414,9 +425,25 @@ class CreditCardGateway extends \WC_Payment_Gateway_CC { // phpcs:ignore WordPress.Security.NonceVerification.Missing $card_payment_token_id = wc_clean( wp_unslash( $_POST['wc-ppcp-credit-card-gateway-payment-token'] ?? '' ) ); if ( $card_payment_token_id ) { + $customer_id = get_user_meta( get_current_user_id(), '_ppcp_target_customer_id', true ); + if ( ! $customer_id ) { + $customer_id = get_user_meta( get_current_user_id(), 'ppcp_customer_id', true ); + } + + try { + $customer_tokens = $this->payment_tokens_endpoint->payment_tokens_for_customer( $customer_id ); + } catch ( RuntimeException $exception ) { + $customer_tokens = array(); + } + $tokens = WC_Payment_Tokens::get_customer_tokens( get_current_user_id() ); foreach ( $tokens as $token ) { if ( $token->get_id() === (int) $card_payment_token_id ) { + if ( ! in_array( $token->get_token(), $customer_tokens, true ) ) { + $token->delete(); + continue; + } + $custom_id = $wc_order->get_order_number(); $invoice_id = $this->prefix . $wc_order->get_order_number(); $create_order = $this->capture_card_payment->create_order( $token->get_token(), $custom_id, $invoice_id );