omer->name ) { try { $this->customer = Customer::update( $this->customer->id, $args, Helpers::get_auth_opts() ); } catch ( \Exception $e ) { wpforms_log( 'Stripe: Unable to update user name.', $e->getMessage(), [ 'type' => [ 'payment', 'error' ], ] ); } } return; } 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 : ''; } }