id = 'stripe_sofort'; $this->method_title = __( 'Stripe SOFORT', 'woocommerce-gateway-stripe' ); /* translators: link */ $this->method_description = sprintf( __( 'All other general Stripe settings can be adjusted here.', 'woocommerce-gateway-stripe' ), admin_url( 'admin.php?page=wc-settings&tab=checkout§ion=stripe' ) ); $this->supports = array( 'products', 'refunds', ); // Load the form fields. $this->init_form_fields(); // Load the settings. $this->init_settings(); $main_settings = get_option( 'woocommerce_stripe_settings' ); $this->title = $this->get_option( 'title' ); $this->description = $this->get_option( 'description' ); $this->enabled = $this->get_option( 'enabled' ); $this->testmode = ( ! empty( $main_settings['testmode'] ) && 'yes' === $main_settings['testmode'] ) ? true : false; $this->saved_cards = ( ! empty( $main_settings['saved_cards'] ) && 'yes' === $main_settings['saved_cards'] ) ? true : false; $this->publishable_key = ! empty( $main_settings['publishable_key'] ) ? $main_settings['publishable_key'] : ''; $this->secret_key = ! empty( $main_settings['secret_key'] ) ? $main_settings['secret_key'] : ''; $this->statement_descriptor = ! empty( $main_settings['statement_descriptor'] ) ? $main_settings['statement_descriptor'] : ''; if ( $this->testmode ) { $this->publishable_key = ! empty( $main_settings['test_publishable_key'] ) ? $main_settings['test_publishable_key'] : ''; $this->secret_key = ! empty( $main_settings['test_secret_key'] ) ? $main_settings['test_secret_key'] : ''; } add_action( 'woocommerce_update_options_payment_gateways_' . $this->id, array( $this, 'process_admin_options' ) ); add_action( 'wp_enqueue_scripts', array( $this, 'payment_scripts' ) ); } /** * Returns all supported currencies for this payment method. * * @since 4.0.0 * @version 4.0.0 * @return array */ public function get_supported_currency() { return apply_filters( 'wc_stripe_sofort_supported_currencies', array( 'EUR', ) ); } /** * Checks to see if all criteria is met before showing payment method. * * @since 4.0.0 * @version 4.0.0 * @return bool */ public function is_available() { if ( ! in_array( get_woocommerce_currency(), $this->get_supported_currency() ) ) { return false; } return parent::is_available(); } /** * Get_icon function. * * @since 1.0.0 * @version 4.0.0 * @return string */ public function get_icon() { $icons = $this->payment_icons(); $icons_str = ''; $icons_str .= isset( $icons['sofort'] ) ? $icons['sofort'] : ''; return apply_filters( 'woocommerce_gateway_icon', $icons_str, $this->id ); } /** * payment_scripts function. * * Outputs scripts used for stripe payment * * @access public */ public function payment_scripts() { if ( ! is_cart() && ! is_checkout() && ! isset( $_GET['pay_for_order'] ) && ! is_add_payment_method_page() ) { return; } wp_enqueue_style( 'stripe_styles' ); wp_enqueue_script( 'woocommerce_stripe' ); } /** * Initialize Gateway Settings Form Fields. */ public function init_form_fields() { $this->form_fields = require( WC_STRIPE_PLUGIN_PATH . '/includes/admin/stripe-sofort-settings.php' ); } /** * Payment form on checkout page */ public function payment_fields() { global $wp; $user = wp_get_current_user(); $total = WC()->cart->total; $description = $this->get_description(); // If paying from order, we need to get total from order not cart. if ( isset( $_GET['pay_for_order'] ) && ! empty( $_GET['key'] ) ) { $order = wc_get_order( wc_clean( $wp->query_vars['order-pay'] ) ); $total = $order->get_total(); } if ( is_add_payment_method_page() ) { $pay_button_text = __( 'Add Payment', 'woocommerce-gateway-stripe' ); $total = ''; } else { $pay_button_text = ''; } echo '
'; if ( $description ) { echo apply_filters( 'wc_stripe_description', wpautop( wp_kses_post( $description ) ), $this->id ); } echo '
'; } /** * Creates the source for charge. * * @since 4.0.0 * @version 4.0.0 * @param object $order * @return mixed */ public function create_source( $order ) { $currency = $order->get_currency(); $bank_country = $order->get_billing_country(); $return_url = $this->get_stripe_return_url( $order ); $post_data = array(); $post_data['amount'] = WC_Stripe_Helper::get_stripe_amount( $order->get_total(), $currency ); $post_data['currency'] = strtolower( $currency ); $post_data['type'] = 'sofort'; $post_data['owner'] = $this->get_owner_details( $order ); $post_data['redirect'] = array( 'return_url' => $return_url ); $post_data['sofort'] = array( 'country' => $bank_country, 'preferred_language' => $this->get_locale(), ); if ( ! empty( $this->statement_descriptor ) ) { $post_data['statement_descriptor'] = WC_Stripe_Helper::clean_statement_descriptor( $this->statement_descriptor ); } WC_Stripe_Logger::log( 'Info: Begin creating SOFORT source' ); return WC_Stripe_API::request( apply_filters( 'wc_stripe_sofort_source', $post_data, $order ), 'sources' ); } /** * Process the payment * * @param int $order_id Reference. * @param bool $retry Should we retry on fail. * @param bool $force_save_source Force payment source to be saved. * * @throws Exception If payment will not be accepted. * * @return array|void */ public function process_payment( $order_id, $retry = true, $force_save_source = false ) { try { $order = wc_get_order( $order_id ); // This will throw exception if not valid. $this->validate_minimum_order_amount( $order ); // This comes from the create account checkbox in the checkout page. $create_account = ! empty( $_POST['createaccount'] ) ? true : false; if ( $create_account ) { $new_customer_id = $order->get_customer_id(); $new_stripe_customer = new WC_Stripe_Customer( $new_customer_id ); $new_stripe_customer->create_customer(); } $response = $this->create_source( $order ); if ( ! empty( $response->error ) ) { $order->add_order_note( $response->error->message ); $localized_messages = WC_Stripe_Helper::get_localized_messages(); if ( 'invalid_sofort_country' === $response->error->code ) { $localized_message = isset( $localized_messages[ $response->error->code ] ) ? $localized_messages[ $response->error->code ] : $response->error->message; } else { $localized_message = isset( $localized_messages[ $response->error->type ] ) ? $localized_messages[ $response->error->type ] : $response->error->message; } throw new WC_Stripe_Exception( print_r( $response, true ), $localized_message ); } $order->update_meta_data( '_stripe_source_id', $response->id ); $order->save(); WC_Stripe_Logger::log( 'Info: Redirecting to SOFORT...' ); return array( 'result' => 'success', 'redirect' => esc_url_raw( $response->redirect->url ), ); } catch ( WC_Stripe_Exception $e ) { wc_add_notice( $e->getLocalizedMessage(), 'error' ); WC_Stripe_Logger::log( 'Error: ' . $e->getMessage() ); do_action( 'wc_gateway_stripe_process_payment_error', $e, $order ); if ( $order->has_status( array( 'pending', 'failed' ) ) ) { $this->send_failed_order_email( $order_id ); } return array( 'result' => 'fail', 'redirect' => '', ); } } }