Completed
Push — master ( 85d0ea...ee5959 )
by Roy
08:36 queued 02:39
created

WC_Gateway_Stripe_Sofort::__construct()   F

Complexity

Conditions 11
Paths 640

Size

Total Lines 36
Code Lines 25

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 11
eloc 25
nc 640
nop 0
dl 0
loc 36
rs 3.3333
c 0
b 0
f 0

How to fix   Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
if ( ! defined( 'ABSPATH' ) ) {
3
	exit;
4
}
5
6
/**
7
 * Class that handles SOFORT payment method.
8
 *
9
 * @extends WC_Gateway_Stripe
10
 *
11
 * @since 4.0.0
12
 */
13
class WC_Gateway_Stripe_Sofort extends WC_Stripe_Payment_Gateway {
14
	/**
15
	 * Notices (array)
16
	 * @var array
17
	 */
18
	public $notices = array();
19
20
	/**
21
	 * Is test mode active?
22
	 *
23
	 * @var bool
24
	 */
25
	public $testmode;
26
27
	/**
28
	 * Alternate credit card statement name
29
	 *
30
	 * @var bool
31
	 */
32
	public $statement_descriptor;
33
34
	/**
35
	 * API access secret key
36
	 *
37
	 * @var string
38
	 */
39
	public $secret_key;
40
41
	/**
42
	 * Api access publishable key
43
	 *
44
	 * @var string
45
	 */
46
	public $publishable_key;
47
48
	/**
49
	 * Should we store the users credit cards?
50
	 *
51
	 * @var bool
52
	 */
53
	public $saved_cards;
54
55
	/**
56
	 * Constructor
57
	 */
58
	public function __construct() {
59
		$this->id                   = 'stripe_sofort';
60
		$this->method_title         = __( 'Stripe SOFORT', 'woocommerce-gateway-stripe' );
61
		/* translators: link */
62
		$this->method_description   = sprintf( __( 'All other general Stripe settings can be adjusted <a href="%s">here</a>.', 'woocommerce-gateway-stripe' ), admin_url( 'admin.php?page=wc-settings&tab=checkout&section=stripe' ) );
63
		$this->supports             = array(
64
			'products',
65
			'refunds',
66
		);
67
68
		// Load the form fields.
69
		$this->init_form_fields();
70
71
		// Load the settings.
72
		$this->init_settings();
73
74
		$main_settings              = get_option( 'woocommerce_stripe_settings' );
75
		$this->title                = $this->get_option( 'title' );
76
		$this->description          = $this->get_option( 'description' );
77
		$this->enabled              = $this->get_option( 'enabled' );
78
		$this->testmode             = ( ! empty( $main_settings['testmode'] ) && 'yes' === $main_settings['testmode'] ) ? true : false;
79
		$this->saved_cards          = ( ! empty( $main_settings['saved_cards'] ) && 'yes' === $main_settings['saved_cards'] ) ? true : false;
80
		$this->publishable_key      = ! empty( $main_settings['publishable_key'] ) ? $main_settings['publishable_key'] : '';
81
		$this->secret_key           = ! empty( $main_settings['secret_key'] ) ? $main_settings['secret_key'] : '';
82
		$this->statement_descriptor = ! empty( $main_settings['statement_descriptor'] ) ? $main_settings['statement_descriptor'] : '';
83
84
		if ( $this->testmode ) {
85
			$this->publishable_key = ! empty( $main_settings['test_publishable_key'] ) ? $main_settings['test_publishable_key'] : '';
86
			$this->secret_key      = ! empty( $main_settings['test_secret_key'] ) ? $main_settings['test_secret_key'] : '';
87
		}
88
89
		add_action( 'woocommerce_update_options_payment_gateways_' . $this->id, array( $this, 'process_admin_options' ) );
90
		add_action( 'admin_notices', array( $this, 'check_environment' ) );
91
		add_action( 'admin_head', array( $this, 'remove_admin_notice' ) );
92
		add_action( 'wp_enqueue_scripts', array( $this, 'payment_scripts' ) );
93
	}
94
95
	/**
96
	 * Checks to make sure environment is setup correctly to use this payment method.
97
	 *
98
	 * @since 4.0.0
99
	 * @version 4.0.0
100
	 */
101
	public function check_environment() {
102
		if ( ! current_user_can( 'manage_woocommerce' ) ) {
103
			return;
104
		}
105
106
		$environment_warning = $this->get_environment_warning();
107
108
		if ( $environment_warning ) {
109
			$this->add_admin_notice( 'bad_environment', 'error', $environment_warning );
110
		}
111
112
		foreach ( (array) $this->notices as $notice_key => $notice ) {
113
			echo "<div class='" . esc_attr( $notice['class'] ) . "'><p>";
114
			echo wp_kses( $notice['message'], array( 'a' => array( 'href' => array() ) ) );
115
			echo '</p></div>';
116
		}
117
	}
118
119
	/**
120
	 * Checks the environment for compatibility problems. Returns a string with the first incompatibility
121
	 * found or false if the environment has no problems.
122
	 *
123
	 * @since 4.0.0
124
	 * @version 4.0.0
125
	 */
126
	public function get_environment_warning() {
127
		if ( 'yes' === $this->enabled && ! in_array( get_woocommerce_currency(), $this->get_supported_currency() ) ) {
128
			$message = __( 'SOFORT is enabled - it requires store currency to be set to Euros.', 'woocommerce-gateway-stripe' );
129
130
			return $message;
131
		}
132
133
		return false;
134
	}
135
136
	/**
137
	 * Returns all supported currencies for this payment method.
138
	 *
139
	 * @since 4.0.0
140
	 * @version 4.0.0
141
	 * @return array
142
	 */
143
	public function get_supported_currency() {
144
		return apply_filters( 'wc_stripe_sofort_supported_currencies', array(
145
			'EUR',
146
		) );
147
	}
148
149
	/**
150
	 * Checks to see if all criteria is met before showing payment method.
151
	 *
152
	 * @since 4.0.0
153
	 * @version 4.0.0
154
	 * @return bool
155
	 */
156
	public function is_available() {
157
		if ( ! in_array( get_woocommerce_currency(), $this->get_supported_currency() ) ) {
158
			return false;
159
		}
160
161
		return parent::is_available();
162
	}
163
164
	/**
165
	 * Get_icon function.
166
	 *
167
	 * @since 1.0.0
168
	 * @version 4.0.0
169
	 * @return string
170
	 */
171
	public function get_icon() {
172
		$icons = $this->payment_icons();
173
174
		$icons_str = '';
175
176
		$icons_str .= $icons['sofort'];
177
178
		return apply_filters( 'woocommerce_gateway_icon', $icons_str, $this->id );
179
	}
180
181
	/**
182
	 * payment_scripts function.
183
	 *
184
	 * Outputs scripts used for stripe payment
185
	 *
186
	 * @access public
187
	 */
188
	public function payment_scripts() {
189
		if ( ! is_cart() && ! is_checkout() && ! isset( $_GET['pay_for_order'] ) && ! is_add_payment_method_page() ) {
190
			return;
191
		}
192
193
		wp_enqueue_style( 'stripe_paymentfonts' );
194
		wp_enqueue_script( 'woocommerce_stripe' );
195
	}
196
197
	/**
198
	 * Initialize Gateway Settings Form Fields.
199
	 */
200
	public function init_form_fields() {
201
		$this->form_fields = require( WC_STRIPE_PLUGIN_PATH . '/includes/admin/stripe-sofort-settings.php' );
202
	}
203
204
	/**
205
	 * Payment form on checkout page
206
	 */
207
	public function payment_fields() {
208
		$user  = wp_get_current_user();
0 ignored issues
show
Unused Code introduced by
$user is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
209
		$total = WC()->cart->total;
210
211
		// If paying from order, we need to get total from order not cart.
212
		if ( isset( $_GET['pay_for_order'] ) && ! empty( $_GET['key'] ) ) {
213
			$order = wc_get_order( wc_get_order_id_by_order_key( wc_clean( $_GET['key'] ) ) );
214
			$total = $order->get_total();
215
		}
216
217
		if ( is_add_payment_method_page() ) {
218
			$pay_button_text = __( 'Add Payment', 'woocommerce-gateway-stripe' );
0 ignored issues
show
Unused Code introduced by
$pay_button_text is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
219
			$total        = '';
220
		} else {
221
			$pay_button_text = '';
0 ignored issues
show
Unused Code introduced by
$pay_button_text is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
222
		}
223
224
		echo '<div
225
			id="stripe-sofort-payment-data"
226
			data-amount="' . esc_attr( WC_Stripe_Helper::get_stripe_amount( $total ) ) . '"
227
			data-currency="' . esc_attr( strtolower( get_woocommerce_currency() ) ) . '">';
228
229
		if ( $this->description ) {
230
			echo apply_filters( 'wc_stripe_description', wpautop( wp_kses_post( $this->description ) ) );
231
		}
232
233
		echo '</div>';
234
	}
235
236
	/**
237
	 * Creates the source for charge.
238
	 *
239
	 * @since 4.0.0
240
	 * @version 4.0.0
241
	 * @param object $order
242
	 * @return mixed
243
	 */
244 View Code Duplication
	public function create_source( $order ) {
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
245
		$currency              = WC_Stripe_Helper::is_pre_30() ? $order->get_order_currency() : $order->get_currency();
246
		$bank_country          = WC_Stripe_Helper::is_pre_30() ? $order->billing_country : $order->get_billing_country();
247
		$return_url            = $this->get_stripe_return_url( $order );
248
		$post_data             = array();
249
		$post_data['amount']   = WC_Stripe_Helper::get_stripe_amount( $order->get_total(), $currency );
250
		$post_data['currency'] = strtolower( $currency );
251
		$post_data['type']     = 'sofort';
252
		$post_data['owner']    = $this->get_owner_details( $order );
253
		$post_data['redirect'] = array( 'return_url' => $return_url );
254
		$post_data['sofort']   = array(
255
			'country'            => $bank_country,
256
			'preferred_language' => substr( get_locale(), 0, 2 ),
257
		);
258
259
		if ( ! empty( $this->statement_descriptor ) ) {
260
			$post_data['statement_descriptor'] = WC_Stripe_Helper::clean_statement_descriptor( $this->statement_descriptor );
0 ignored issues
show
Documentation introduced by
$this->statement_descriptor is of type boolean, but the function expects a string.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
261
		}
262
263
		WC_Stripe_Logger::log( 'Info: Begin creating SOFORT source' );
264
265
		return WC_Stripe_API::request( apply_filters( 'wc_stripe_sofort_source', $post_data, $order ), 'sources' );
266
	}
267
268
	/**
269
	 * Process the payment
270
	 *
271
	 * @param int  $order_id Reference.
272
	 * @param bool $retry Should we retry on fail.
273
	 * @param bool $force_save_source Force payment source to be saved.
274
	 *
275
	 * @throws Exception If payment will not be accepted.
276
	 *
277
	 * @return array|void
278
	 */
279
	public function process_payment( $order_id, $retry = true, $force_save_source = false ) {
280
		try {
281
			$order = wc_get_order( $order_id );
282
283
			// This will throw exception if not valid.
284
			$this->validate_minimum_order_amount( $order );
285
286
			// This comes from the create account checkbox in the checkout page.
287
			$create_account = ! empty( $_POST['createaccount'] ) ? true : false;
288
289
			if ( $create_account ) {
290
				$new_customer_id     = WC_Stripe_Helper::is_pre_30() ? $order->customer_user : $order->get_customer_id();
291
				$new_stripe_customer = new WC_Stripe_Customer( $new_customer_id );
292
				$new_stripe_customer->create_customer();
293
			}
294
295
			$response = $this->create_source( $order );
296
297
			if ( ! empty( $response->error ) ) {
298
				$order->add_order_note( $response->error->message );
299
300
				$localized_messages = WC_Stripe_Helper::get_localized_messages();
301
302
				if ( 'invalid_sofort_country' === $response->error->code ) {
303
					$localized_message = isset( $localized_messages[ $response->error->code ] ) ? $localized_messages[ $response->error->code ] : $response->error->message;
304
				} else {
305
					$localized_message = isset( $localized_messages[ $response->error->type ] ) ? $localized_messages[ $response->error->type ] : $response->error->message;
306
				}
307
308
				throw new WC_Stripe_Exception( print_r( $response, true ), $localized_message );
309
			}
310
311
			if ( WC_Stripe_Helper::is_pre_30() ) {
312
				update_post_meta( $order_id, '_stripe_source_id', $response->id );
313
			} else {
314
				$order->update_meta_data( '_stripe_source_id', $response->id );
315
				$order->save();
316
			}
317
318
			WC_Stripe_Logger::log( 'Info: Redirecting to SOFORT...' );
319
320
			return array(
321
				'result'   => 'success',
322
				'redirect' => esc_url_raw( $response->redirect->url ),
323
			);
324
		} catch ( WC_Stripe_Exception $e ) {
325
			wc_add_notice( $e->getLocalizedMessage(), 'error' );
326
			WC_Stripe_Logger::log( 'Error: ' . $e->getMessage() );
327
328
			do_action( 'wc_gateway_stripe_process_payment_error', $e, $order );
329
330
			if ( $order->has_status( array( 'pending', 'failed' ) ) ) {
331
				$this->send_failed_order_email( $order_id );
332
			}
333
334
			return array(
335
				'result'   => 'fail',
336
				'redirect' => '',
337
			);
338
		}
339
	}
340
}
341