id = self::ID; $this->settings_renderer = $settings_renderer; $this->order_processor = $order_processor; $this->config = $config; $this->session_handler = $session_handler; $this->refund_processor = $refund_processor; $this->state = $state; $this->transaction_url_provider = $transaction_url_provider; $this->subscription_helper = $subscription_helper; $this->default_enabled = $default_enabled; $this->environment = $environment; $this->onboarded = $state->current_state() === State::STATE_ONBOARDED; $this->payment_token_repository = $payment_token_repository; $this->logger = $logger; $this->supports = array( 'refunds', 'products', ); if ( ( $this->config->has( 'vault_enabled' ) && $this->config->get( 'vault_enabled' ) ) || ( $this->config->has( 'subscriptions_mode' ) && $this->config->get( 'subscriptions_mode' ) === 'subscriptions_api' ) ) { array_push( $this->supports, 'subscriptions', 'subscription_cancellation', 'subscription_suspension', 'subscription_reactivation', 'subscription_amount_changes', 'subscription_date_changes', 'subscription_payment_method_change', 'subscription_payment_method_change_customer', 'subscription_payment_method_change_admin', 'multiple_subscriptions' ); } $this->method_title = __( 'Standard Card Button', 'woocommerce-paypal-payments' ); $this->method_description = __( 'The separate payment gateway with the card button. If disabled, the button is included in the PayPal gateway.', 'woocommerce-paypal-payments' ); $this->title = $this->get_option( 'title', __( 'Debit & Credit Cards', 'woocommerce-paypal-payments' ) ); $this->description = $this->get_option( 'description', '' ); $this->init_form_fields(); $this->init_settings(); add_action( 'woocommerce_update_options_payment_gateways_' . $this->id, array( $this, 'process_admin_options', ) ); } /** * Whether the Gateway needs to be setup. * * @return bool */ public function needs_setup(): bool { return ! $this->onboarded; } /** * Initializes the form fields. */ public function init_form_fields() { $this->form_fields = array( 'enabled' => array( 'title' => __( 'Enable/Disable', 'woocommerce-paypal-payments' ), 'type' => 'checkbox', 'label' => __( 'Enable Standard Card Button gateway', 'woocommerce-paypal-payments' ), 'default' => $this->default_enabled ? 'yes' : 'no', 'desc_tip' => true, 'description' => __( 'Enable/Disable the separate payment gateway with the card button.', 'woocommerce-paypal-payments' ), ), 'title' => array( 'title' => __( 'Title', 'woocommerce-paypal-payments' ), 'type' => 'text', 'default' => $this->title, 'desc_tip' => true, 'description' => __( 'This controls the title which the user sees during checkout.', 'woocommerce-paypal-payments' ), ), 'description' => array( 'title' => __( 'Description', 'woocommerce-paypal-payments' ), 'type' => 'text', 'default' => $this->description, 'desc_tip' => true, 'description' => __( 'This controls the description which the user sees during checkout.', 'woocommerce-paypal-payments' ), ), 'ppcp' => array( 'type' => 'ppcp', ), ); } /** * Process payment for a WooCommerce order. * * @param int $order_id The WooCommerce order id. * * @return array */ public function process_payment( $order_id ) { $wc_order = wc_get_order( $order_id ); if ( ! is_a( $wc_order, WC_Order::class ) ) { return $this->handle_payment_failure( null, new GatewayGenericException( new Exception( 'WC order was not found.' ) ) ); } /** * If customer has chosen change Subscription payment. */ if ( $this->subscription_helper->has_subscription( $order_id ) && $this->subscription_helper->is_subscription_change_payment() ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing $saved_paypal_payment = wc_clean( wp_unslash( $_POST['saved_paypal_payment'] ?? '' ) ); if ( $saved_paypal_payment ) { $wc_order->update_meta_data( 'payment_token_id', $saved_paypal_payment ); $wc_order->save(); return $this->handle_payment_success( $wc_order ); } } /** * If the WC_Order is paid through the approved webhook. */ //phpcs:disable WordPress.Security.NonceVerification.Recommended if ( isset( $_REQUEST['ppcp-resume-order'] ) && $wc_order->has_status( 'processing' ) ) { return $this->handle_payment_success( $wc_order ); } //phpcs:enable WordPress.Security.NonceVerification.Recommended try { if ( ! $this->order_processor->process( $wc_order ) ) { return $this->handle_payment_failure( $wc_order, new Exception( $this->order_processor->last_error() ) ); } do_action( 'woocommerce_paypal_payments_before_handle_payment_success', $wc_order ); return $this->handle_payment_success( $wc_order ); } catch ( PayPalApiException $error ) { return $this->handle_payment_failure( $wc_order, new Exception( Messages::generic_payment_error_message() . ' ' . $error->getMessage(), $error->getCode(), $error ) ); } catch ( RuntimeException $error ) { return $this->handle_payment_failure( $wc_order, $error ); } } /** * Process refund. * * If the gateway declares 'refunds' support, this will allow it to refund. * a passed in amount. * * @param int $order_id Order ID. * @param float $amount Refund amount. * @param string $reason Refund reason. * @return boolean True or false based on success, or a WP_Error object. */ public function process_refund( $order_id, $amount = null, $reason = '' ) { $order = wc_get_order( $order_id ); if ( ! is_a( $order, \WC_Order::class ) ) { return false; } return $this->refund_processor->process( $order, (float) $amount, (string) $reason ); } /** * Return transaction url for this gateway and given order. * * @param \WC_Order $order WC order to get transaction url by. * * @return string */ public function get_transaction_url( $order ): string { $this->view_transaction_url = $this->transaction_url_provider->get_transaction_url_base( $order ); return parent::get_transaction_url( $order ); } /** * Returns the settings renderer. * * @return SettingsRenderer */ protected function settings_renderer(): SettingsRenderer { return $this->settings_renderer; } }