omer = $customer; return; } // Retrieve a customer by email. try { $customers = Customer::all( [ 'email' => $email ], Helpers::get_auth_opts() ); } catch ( \Exception $e ) { $customers = null; } // Determine whether the customer name/address needs to be updated. if ( isset( $customers->data[0]->id ) ) { $this->customer = $customers->data[0]; $needUpdateName = ! empty( $name ) && $name !== $this->customer->name; $needUpdatePhone = ! empty( $phone ) && $phone !== $this->customer->phone; $needUpdateAddress = false; if ( ! $needUpdateName ) { $existingAddress = isset( $this->customer->address ) && method_exists( $this->customer->address, 'toArray' ) ? $this->customer->address->toArray() : []; $needUpdateAddress = ! empty( array_diff_assoc( $address, $existingAddress ) ); } // Update customer name/address/phone. if ( $needUpdateName || $needUpdateAddress || $needUpdatePhone ) { try { $this->customer = Customer::update( $this->customer->id, $args, Helpers::get_auth_opts() ); } catch ( \Exception $e ) { wpforms_log( 'Stripe: Unable to update customer information.', $e->getMessage(), [ 'type' => [ 'payment', 'error' ], ] ); } } return; } // Create a customer with email. try { $args['email'] = $email; $customer = Customer::create( $args, Helpers::get_auth_opts() ); } catch ( \Exception $e ) { $customer = null; } if ( ! isset( $customer->id ) ) { return; } $this->customer = $customer; } /** * Set an error message from a Stripe API exception. * * @since 1.8.2 * * @param \Exception|\WPForms\Vendor\Stripe\Exception\ApiErrorException $e Stripe API exception to process. */ protected function set_error_from_exception( $e ) { /** * WPForms set Stripe error from exception. * * @since 1.8.2 * * @param \Exception|\WPForms\Vendor\Stripe\Exception\ApiErrorException $e Stripe API exception to process. */ do_action( 'wpformsstripe_api_common_set_error_from_exception', $e ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName if ( is_a( $e, '\WPForms\Vendor\Stripe\Exception\CardException' ) ) { $body = $e->getJsonBody(); $this->error = $body['error']['message']; return; } $errors = [ '\WPForms\Vendor\Stripe\Exception\RateLimitException' => esc_html__( 'Too many requests made to the API too quickly.', 'wpforms-lite' ), '\WPForms\Vendor\Stripe\Exception\InvalidRequestException' => esc_html__( 'Invalid parameters were supplied to Stripe API.', 'wpforms-lite' ), '\WPForms\Vendor\Stripe\Exception\AuthenticationException' => esc_html__( 'Authentication with Stripe API failed.', 'wpforms-lite' ), '\WPForms\Vendor\Stripe\Exception\ApiConnectionException' => esc_html__( 'Network communication with Stripe failed.', 'wpforms-lite' ), '\WPForms\Vendor\Stripe\Exception\ApiErrorException' => esc_html__( 'Unable to process Stripe payment.', 'wpforms-lite' ), '\Exception' => esc_html__( 'Unable to process payment.', 'wpforms-lite' ), ]; foreach ( $errors as $error_type => $error_message ) { if ( is_a( $e, $error_type ) ) { $this->error = $error_message; return; } } } /** * Set an exception from a Stripe API exception. * * @since 1.8.2 * * @param \Exception $e Stripe API exception to process. */ protected function set_exception( $e ) { $this->exception = $e; } /** * Handle Stripe API exception. * * @since 1.8.2 * * @param \Exception $e Stripe API exception to process. */ protected function handle_exception( $e ) { $this->set_exception( $e ); $this->set_error_from_exception( $e ); } /** * Get data for every subscription period. * * @since 1.8.2 * * @return array */ protected function get_subscription_period_data() { return [ 'daily' => [ 'name' => 'daily', 'interval' => 'day', 'count' => 1, 'desc' => esc_html__( 'Daily', 'wpforms-lite' ), ], 'weekly' => [ 'name' => 'weekly', 'interval' => 'week', 'count' => 1, 'desc' => esc_html__( 'Weekly', 'wpforms-lite' ), ], 'monthly' => [ 'name' => 'monthly', 'interval' => 'month', 'count' => 1, 'desc' => esc_html__( 'Monthly', 'wpforms-lite' ), ], 'quarterly' => [ 'name' => 'quarterly', 'interval' => 'month', 'count' => 3, 'desc' => esc_html__( 'Quarterly', 'wpforms-lite' ), ], 'semiyearly' => [ 'name' => 'semiyearly', 'interval' => 'month', 'count' => 6, 'desc' => esc_html__( 'Semi-Yearly', 'wpforms-lite' ), ], 'yearly' => [ 'name' => 'yearly', 'interval' => 'year', 'count' => 1, 'desc' => esc_html__( 'Yearly', 'wpforms-lite' ), ], ]; } /** * Create Stripe plan. * * @since 1.8.2 * * @param string $id ID of a plan to create. * @param array $period Subscription period data. * @param array $args Additional arguments. * * @return Plan|null */ protected function create_plan( $id, $period, $args ) { $name = sprintf( '%s (%s %s)', ! empty( $args['settings']['name'] ) ? $args['settings']['name'] : $args['form_title'], $args['amount'], $period['desc'] ); /** * Allow to filter Stripe subscription plan name. * * @since 1.8.8 * * @param string $name Plan name. * @param array $period Subscription period data. * @param array $args Additional arguments. */ $name = (string) apply_filters( 'wpforms_integrations_stripe_api_common_create_plan_name', $name, $period, $args ); $plan_args = [ 'amount' => $args['amount'], 'interval' => $period['interval'], 'interval_count' => $period['count'], 'product' => [ 'name' => sanitize_text_field( $name ), ], 'nickname' => sanitize_text_field( $name ), 'currency' => strtolower( wpforms_get_currency() ), 'id' => $id, 'metadata' => [ 'form_name' => sanitize_text_field( $args['form_title'] ), 'form_id' => $args['form_id'], ], ]; try { $plan = Plan::create( $plan_args, Helpers::get_auth_opts() ); } catch ( \Exception $e ) { $plan = null; } return $plan; } /** * Get Stripe plan ID. * Check if a plan exists in Stripe, if not creates one. * * @since 1.8.2 * * @param array $args Arguments needed for getting a valid plan ID. * * @return string */ protected function get_plan_id( $args ) { $period_data = $this->get_subscription_period_data(); $period = array_key_exists( $args['settings']['period'], $period_data ) ? $period_data[ $args['settings']['period'] ] : $period_data['yearly']; if ( ! empty( $args['settings']['name'] ) ) { $slug = preg_replace( '/[^a-z0-9\-]/', '', strtolower( str_replace( ' ', '-', $args['settings']['name'] ) ) ); } else { $slug = 'form' . $args['form_id']; } $plan_id = sprintf( '%s_%s_%s', $slug, $args['amount'], $period['name'] ); try { $plan = Plan::retrieve( $plan_id, Helpers::get_auth_opts() ); } catch ( \Exception $e ) { $plan = $this->create_plan( $plan_id, $period, $args ); } return isset( $plan->id ) ? $plan->id : ''; } }
Fatal error: Uncaught Error: Class "WPForms\Integrations\Stripe\Api\Common" not found in /htdocs/wp-content/plugins/wpforms-lite/src/Integrations/Stripe/Api/WebhookRoute.php:20 Stack trace: #0 /htdocs/wp-content/plugins/the-events-calendar/vendor/composer/ClassLoader.php(576): include() #1 /htdocs/wp-content/plugins/the-events-calendar/vendor/composer/ClassLoader.php(427): Composer\Autoload\{closure}('/htdocs/wp-cont...') #2 /htdocs/wp-content/plugins/wpforms-lite/src/Integrations/Stripe/Stripe.php(49): Composer\Autoload\ClassLoader->loadClass('WPForms\\Integra...') #3 /htdocs/wp-content/plugins/wpforms-lite/src/Integrations/Loader.php(88): WPForms\Integrations\Stripe\Stripe->load() #4 /htdocs/wp-content/plugins/wpforms-lite/src/Integrations/Loader.php(73): WPForms\Integrations\Loader->load_integration(Object(WPForms\Integrations\Stripe\Stripe)) #5 /htdocs/wp-content/plugins/wpforms-lite/src/Integrations/Loader.php(22): WPForms\Integrations\Loader->__construct() #6 /htdocs/wp-includes/class-wp-hook.php(341): WPForms\Integrations\Loader::get_instance('') #7 /htdocs/wp-includes/class-wp-hook.php(365): WP_Hook->apply_filters(Object(WPForms\Providers\Providers), Array) #8 /htdocs/wp-includes/plugin.php(522): WP_Hook->do_action(Array) #9 /htdocs/wp-content/plugins/wpforms-lite/src/WPForms.php(340): do_action('wpforms_loaded') #10 /htdocs/wp-includes/class-wp-hook.php(341): WPForms\WPForms->objects('') #11 /htdocs/wp-includes/class-wp-hook.php(365): WP_Hook->apply_filters(NULL, Array) #12 /htdocs/wp-includes/plugin.php(522): WP_Hook->do_action(Array) #13 /htdocs/wp-settings.php(593): do_action('plugins_loaded') #14 /htdocs/wp-config.php(98): require_once('/htdocs/wp-sett...') #15 /htdocs/wp-load.php(50): require_once('/htdocs/wp-conf...') #16 /htdocs/wp-blog-header.php(13): require_once('/htdocs/wp-load...') #17 /htdocs/index.php(17): require('/htdocs/wp-blog...') #18 {main} thrown in /htdocs/wp-content/plugins/wpforms-lite/src/Integrations/Stripe/Api/WebhookRoute.php on line 20