s.Security.NonceVerification.Missing $data = Utils::_unstable_get_super_global_value( $_POST, 'data' ); if ( ! isset( $data['nonce'] ) || ! wp_verify_nonce( $data['nonce'], 'stripe_form_submit' ) ) { $this->error_handler( 403, esc_html__( '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__( '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' ) . '