l__( 'Something went wrong, please refresh the page.', 'elementor-pro' ) ); die(); } $args = []; $widget_id = $data['widgetId'] ?? null; $args['page_url'] = $data['pageUrl'] ?? null; Plugin::elementor()->db->switch_to_post( $data['postId'] ); $document = Plugin::elementor()->documents->get( $data['postId'] ); // Retrieve data from widget document if ( $document ) { $widget = \ElementorPro\Modules\Forms\Module::find_element_recursive( $document->get_elements_data(), $widget_id ); $widget_instance = Plugin::elementor()->elements_manager->create_element_instance( $widget ); $widget_settings = $widget_instance->get_settings_for_display(); $args['product_name'] = $widget_settings['product_name'] ? $widget_settings['product_name'] : 'Product'; $product_price = $widget_settings['stripe_product_price'] ? $widget_settings['stripe_product_price'] : null; $args['currency'] = $widget['settings']['stripe_currency'] ? $widget['settings']['stripe_currency'] : 'USD'; $args['quantity'] = $widget['settings']['stripe_quantity'] ? $widget['settings']['stripe_quantity'] : 1; $args['success_url'] = ( empty( $widget_settings['redirect_after_success']['url'] ) ? $args['page_url'] : $widget_settings['redirect_after_success']['url'] ); $args['shipping_amount'] = $widget_settings['shipping_amount'] ? $widget_settings['shipping_amount'] * 100 : ''; $this->stripe_test_mode = $widget['settings']['sandbox_mode'] ? $widget['settings']['sandbox_mode'] : 'no'; $args['test_mode'] = $this->stripe_test_mode; $args['tax_rates'] = 'yes' === $args['test_mode'] ? $widget['settings']['stripe_test_env_tax_rates_list'] : $widget['settings']['stripe_live_env_tax_rates_list']; } $args['unit_amount'] = $this->currency_adaptation( $args['currency'], $product_price ); $this->set_secret_key_by_environment_state( $args['test_mode'] ); if ( ! empty( $this->secret_key ) ) { $headers = [ 'Authorization' => 'Bearer ' . $this->secret_key ]; $body = $this->build_body_for_post_request( $args ); $this->execute_post_request_to_stripe_api( $headers, $body ); } else { $this->error_handler( 401, esc_html__( 'You have not entered a valid secret key for this environment, Please add a valid secret key', 'elementor-pro' ) ); } } /** * Builds the body for the API POST request. * * @since 3.7.0 * * @param $args * * @return array */ public function build_body_for_post_request( $args ) { $body = [ 'cancel_url' => $args['page_url'], 'payment_method_types' => [ 'card' ], 'success_url' => $args['success_url'], 'mode' => 'payment', 'line_items[0][quantity]' => $args['quantity'], 'line_items[0][price_data][currency]' => $args['currency'], 'line_items[0][price_data][product_data][name]' => $args['product_name'], 'line_items[0][price_data][unit_amount]' => $args['unit_amount'], ]; if ( $args['shipping_amount'] ) { $body['shipping_options'][0]['shipping_rate_data']['type'] = 'fixed_amount'; $body['shipping_options'][0]['shipping_rate_data']['fixed_amount']['amount'] = $args['shipping_amount']; $body['shipping_options'][0]['shipping_rate_data']['fixed_amount']['currency'] = $args['currency']; $body['shipping_options'][0]['shipping_rate_data']['display_name'] = esc_html__( 'shipping fee', 'elementor-pro' ); } if ( isset( $args['tax_rates'] ) ) { $tax_rate = unserialize( $args['tax_rates'] ); $tax_id = [ $tax_rate[0] ]; $tax_behavior = $tax_rate[1]; if ( ! empty( $tax_behavior ) && ! empty( $tax_id ) ) { $body['line_items'][0]['price_data']['tax_behavior'] = $tax_behavior; $body['line_items'][0]['tax_rates'] = $tax_id; } } return $body; } /** * API call handler * * @since 3.7.0 * * @param $headers * @param $body * * @return void */ public function execute_post_request_to_stripe_api( $headers, $body ) { $response = $this->stripe_handler->post( $headers, $body, self::STRIPE_CHECKOUT_URL_EXT ); wp_send_json( $response ); } /** * Add secret_keys to Elementor integrations section * * @since 3.7.0 * * @param Settings $settings */ public function register_admin_fields( Settings $settings ) { $settings->add_section( Settings::TAB_INTEGRATIONS, 'stripe_api_keys', [ 'callback' => function () { echo '

' . esc_html__( 'Stripe', 'elementor-pro' ) . '

'; echo '

' . esc_html__( 'Insert the API keys provided in the stripe admin dashboard to start collecting payments on your website using Stripe.', 'elementor-pro' ) . '
'; echo esc_html__( 'These keys will serve as your default API key for all stripe implementations on your site.', 'elementor-pro' ) . '

'; }, 'fields' => [ self::STRIPE_TEST_SECRET_KEY => [ 'label' => esc_html__( 'Test Secret key', 'elementor-pro' ), 'field_args' => [ 'type' => 'text', 'desc' => sprintf( /* translators: 1: Link to stripe api key explanation, 2: Link closing tag. */ esc_html__( 'Enter your test secret key %1$slink%2$s.', 'elementor-pro' ), '', '' ), ], ], 'validate_stripe_api_test_secret_key_button' => [ 'field_args' => [ 'type' => 'raw_html', 'html' => sprintf( '', self::STRIPE_TEST_SECRET_KEY . '_validate', wp_create_nonce( self::STRIPE_TEST_SECRET_KEY ), esc_html__( 'Validate Test API Key', 'elementor-pro' ) ), ], ], self::STRIPE_LIVE_SECRET_KEY => [ 'label' => esc_html__( 'Live Secret key', 'elementor-pro' ), 'field_args' => [ 'type' => 'text', 'desc' => sprintf( /* translators: 1: Link to stripe api key explanation, 2: Link closing tag. */ esc_html__( 'Enter your Live secret key %1$slink%2$s.', 'elementor-pro' ), '', '' ), ], ], 'validate_stripe_api_live_secret_key_button' => [ 'field_args' => [ 'type' => 'raw_html', 'html' => sprintf( '', self::STRIPE_TEST_SECRET_KEY . '_validate', wp_create_nonce( self::STRIPE_TEST_SECRET_KEY ), esc_html__( 'Validate Live API Key', 'elementor-pro' ) ), ], ], 'stripe_legal_disclaimer' => [ 'field_args' => [ 'type' => 'raw_html', 'html' => sprintf( /* translators: %s:
. */ esc_html__( 'Please note: The Stripe name and logos are trademarks or service marks of Stripe, Inc. or its affiliates in the U.S. and other countries. %s Other names may be trademarks of their respective owners.', 'elementor-pro' ), '
' ), ], ], ], ] ); } public function __construct() { parent::__construct(); $this->stripe_handler = new Stripe_Handler(); add_action( 'wp_ajax_submit_stripe_form', [ $this, 'submit_stripe_form' ] ); add_action( 'wp_ajax_nopriv_submit_stripe_form', [ $this, 'submit_stripe_form' ] ); add_action( 'elementor/ajax/register_actions', [ $this, 'register_ajax_actions' ] ); if ( current_user_can( 'administrator' ) ) { add_action( 'elementor/admin/after_create_settings/' . Settings::PAGE_ID, [ $this, 'register_admin_fields' ], 999 ); } add_action( 'wp_ajax_' . self::STRIPE_TEST_SECRET_KEY . '_validate', [ $this, 'ajax_validate_secret_key' ] ); add_action( 'wp_ajax_' . self::STRIPE_LIVE_SECRET_KEY . '_validate', [ $this, 'ajax_validate_secret_key' ] ); } }