Completed
Push — master ( 187303...eac9ce )
by Roy
02:30
created

WC_Stripe::check_environment()   D

Complexity

Conditions 10
Paths 16

Size

Total Lines 26
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 10
eloc 13
nc 16
nop 0
dl 0
loc 26
rs 4.8196
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
/*
3
 * Plugin Name: WooCommerce Stripe Gateway
4
 * Plugin URI: https://wordpress.org/plugins/woocommerce-gateway-stripe/
5
 * Description: Take credit card payments on your store using Stripe.
6
 * Author: WooCommerce
7
 * Author URI: https://woocommerce.com/
8
 * Version: 3.0.6
9
 * Text Domain: woocommerce-gateway-stripe
10
 * Domain Path: /languages
11
 *
12
 * Copyright (c) 2017 WooCommerce
13
 *
14
 * This program is free software: you can redistribute it and/or modify
15
 * it under the terms of the GNU General Public License as published by
16
 * the Free Software Foundation, either version 3 of the License, or
17
 * (at your option) any later version.
18
 *
19
 * This program is distributed in the hope that it will be useful,
20
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22
 * GNU General Public License for more details.
23
 *
24
 * You should have received a copy of the GNU General Public License
25
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
26
*/
27
28
if ( ! defined( 'ABSPATH' ) ) {
29
	exit;
30
}
31
32
/**
33
 * Required minimums and constants
34
 */
35
define( 'WC_STRIPE_VERSION', '3.0.6' );
36
define( 'WC_STRIPE_MIN_PHP_VER', '5.3.0' );
37
define( 'WC_STRIPE_MIN_WC_VER', '2.5.0' );
38
define( 'WC_STRIPE_MAIN_FILE', __FILE__ );
39
define( 'WC_STRIPE_PLUGIN_URL', untrailingslashit( plugins_url( basename( plugin_dir_path( __FILE__ ) ), basename( __FILE__ ) ) ) );
40
define( 'WC_STRIPE_PLUGIN_PATH', untrailingslashit( plugin_dir_path( __FILE__ ) ) );
41
42
if ( ! class_exists( 'WC_Stripe' ) ) :
43
44
	class WC_Stripe {
45
46
		/**
47
		 * @var Singleton The reference the *Singleton* instance of this class
48
		 */
49
		private static $instance;
50
51
		/**
52
		 * @var Reference to logging class.
53
		 */
54
		private static $log;
55
56
		/**
57
		 * Returns the *Singleton* instance of this class.
58
		 *
59
		 * @return Singleton The *Singleton* instance.
60
		 */
61
		public static function get_instance() {
62
			if ( null === self::$instance ) {
63
				self::$instance = new self();
0 ignored issues
show
Documentation Bug introduced by
It seems like new self() of type object<WC_Stripe> is incompatible with the declared type object<Singleton> of property $instance.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
64
			}
65
			return self::$instance;
0 ignored issues
show
Bug Compatibility introduced by
The expression self::$instance; of type WC_Stripe|Singleton adds the type WC_Stripe to the return on line 65 which is incompatible with the return type documented by WC_Stripe::get_instance of type Singleton.
Loading history...
66
		}
67
68
		/**
69
		 * Private clone method to prevent cloning of the instance of the
70
		 * *Singleton* instance.
71
		 *
72
		 * @return void
73
		 */
74
		private function __clone() {}
75
76
		/**
77
		 * Private unserialize method to prevent unserializing of the *Singleton*
78
		 * instance.
79
		 *
80
		 * @return void
81
		 */
82
		private function __wakeup() {}
83
84
		/**
85
		 * Flag to indicate whether or not we need to load code for / support subscriptions.
86
		 *
87
		 * @var bool
88
		 */
89
		private $subscription_support_enabled = false;
90
91
		/**
92
		 * Flag to indicate whether or not we need to load support for pre-orders.
93
		 *
94
		 * @since 3.0.3
95
		 *
96
		 * @var bool
97
		 */
98
		private $pre_order_enabled = false;
99
100
		/**
101
		 * Notices (array)
102
		 * @var array
103
		 */
104
		public $notices = array();
105
106
		/**
107
		 * Protected constructor to prevent creating a new instance of the
108
		 * *Singleton* via the `new` operator from outside of this class.
109
		 */
110
		protected function __construct() {
111
			add_action( 'admin_init', array( $this, 'check_environment' ) );
112
			add_action( 'admin_notices', array( $this, 'admin_notices' ), 15 );
113
			add_action( 'plugins_loaded', array( $this, 'init' ) );
114
		}
115
116
		/**
117
		 * Init the plugin after plugins_loaded so environment variables are set.
118
		 */
119
		public function init() {
120
			// Don't hook anything else in the plugin if we're in an incompatible environment
121
			if ( self::get_environment_warning() ) {
122
				return;
123
			}
124
125
			include_once( dirname( __FILE__ ) . '/includes/class-wc-stripe-api.php' );
126
			include_once( dirname( __FILE__ ) . '/includes/class-wc-stripe-customer.php' );
127
128
			// Init the gateway itself
129
			$this->init_gateways();
130
131
			add_filter( 'plugin_action_links_' . plugin_basename( __FILE__ ), array( $this, 'plugin_action_links' ) );
132
			add_action( 'woocommerce_order_status_on-hold_to_processing', array( $this, 'capture_payment' ) );
133
			add_action( 'woocommerce_order_status_on-hold_to_completed', array( $this, 'capture_payment' ) );
134
			add_action( 'woocommerce_order_status_on-hold_to_cancelled', array( $this, 'cancel_payment' ) );
135
			add_action( 'woocommerce_order_status_on-hold_to_refunded', array( $this, 'cancel_payment' ) );
136
			add_filter( 'woocommerce_get_customer_payment_tokens', array( $this, 'woocommerce_get_customer_payment_tokens' ), 10, 3 );
137
			add_action( 'woocommerce_payment_token_deleted', array( $this, 'woocommerce_payment_token_deleted' ), 10, 2 );
138
			add_action( 'woocommerce_payment_token_set_default', array( $this, 'woocommerce_payment_token_set_default' ) );
139
			add_action( 'wp_ajax_stripe_dismiss_request_api_notice', array( $this, 'dismiss_request_api_notice' ) );
140
			add_action( 'wp_ajax_stripe_dismiss_apple_pay_notice', array( $this, 'dismiss_apple_pay_notice' ) );
141
142
			include_once( dirname( __FILE__ ) . '/includes/class-wc-stripe-payment-request.php' );
143
		}
144
145
		/**
146
		 * Allow this class and other classes to add slug keyed notices (to avoid duplication)
147
		 */
148
		public function add_admin_notice( $slug, $class, $message ) {
149
			$this->notices[ $slug ] = array(
150
				'class'   => $class,
151
				'message' => $message,
152
			);
153
		}
154
155
		/**
156
		 * The backup sanity check, in case the plugin is activated in a weird way,
157
		 * or the environment changes after activation. Also handles upgrade routines.
158
		 */
159
		public function check_environment() {
160
			if ( ! defined( 'IFRAME_REQUEST' ) && ( WC_STRIPE_VERSION !== get_option( 'woocommerce_stripe_version' ) ) ) {
161
				$this->install();
162
163
				do_action( 'woocommerce_stripe_updated' );
164
			}
165
166
			$environment_warning = self::get_environment_warning();
167
168
			if ( $environment_warning && is_plugin_active( plugin_basename( __FILE__ ) ) ) {
169
				$this->add_admin_notice( 'bad_environment', 'error', $environment_warning );
170
			}
171
172
			// Check if secret key present. Otherwise prompt, via notice, to go to
173
			// setting.
174
			if ( ! class_exists( 'WC_Stripe_API' ) ) {
175
				include_once( dirname( __FILE__ ) . '/includes/class-wc-stripe-api.php' );
176
			}
177
178
			$secret = WC_Stripe_API::get_secret_key();
179
180
			if ( empty( $secret ) && ! ( isset( $_GET['page'], $_GET['section'] ) && 'wc-settings' === $_GET['page'] && 'stripe' === $_GET['section'] ) ) {
181
				$setting_link = $this->get_setting_link();
182
				$this->add_admin_notice( 'prompt_connect', 'notice notice-warning', sprintf( __( 'Stripe is almost ready. To get started, <a href="%s">set your Stripe account keys</a>.', 'woocommerce-gateway-stripe' ), $setting_link ) );
183
			}
184
		}
185
186
		/**
187
		 * Updates the plugin version in db
188
		 *
189
		 * @since 3.1.0
190
		 * @version 3.1.0
191
		 * @return bool
192
		 */
193
		private static function _update_plugin_version() {
194
			delete_option( 'wc_stripe_version' );
195
			add_option( 'wc_stripe_version', WC_STRIPE_VERSION );
196
197
			return true;
198
		}
199
200
		/**
201
		 * Dismiss the Google Payment Request API Feature notice.
202
		 *
203
		 * @since 3.1.0
204
		 * @version 3.1.0
205
		 */
206
		public function dismiss_request_api_notice() {
207
			update_option( 'wc_stripe_show_request_api_notice', 'no' );
208
		}
209
210
		/**
211
		 * Dismiss the Apple Pay Feature notice.
212
		 *
213
		 * @since 3.1.0
214
		 * @version 3.1.0
215
		 */
216
		public function dismiss_apple_pay_notice() {
217
			update_option( 'wc_stripe_show_apple_pay_notice', 'no' );
218
		}
219
220
		/**
221
		 * Handles upgrade routines.
222
		 *
223
		 * @since 3.1.0
224
		 * @version 3.1.0
225
		 */
226
		public function install() {
227
			if ( ! defined( 'WC_STRIPE_INSTALLING' ) ) {
228
				define( 'WC_STRIPE_INSTALLING', true );
229
			}
230
231
			// @TODO remove this in the future.
232
			update_option( 'wc_stripe_show_features_notice', 'yes' );
233
234
			$this->_update_plugin_version();
235
		}
236
237
		/**
238
		 * Checks the environment for compatibility problems.  Returns a string with the first incompatibility
239
		 * found or false if the environment has no problems.
240
		 */
241
		static function get_environment_warning() {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
242 View Code Duplication
			if ( version_compare( phpversion(), WC_STRIPE_MIN_PHP_VER, '<' ) ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across 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...
243
				$message = __( 'WooCommerce Stripe - The minimum PHP version required for this plugin is %1$s. You are running %2$s.', 'woocommerce-gateway-stripe' );
244
245
				return sprintf( $message, WC_STRIPE_MIN_PHP_VER, phpversion() );
246
			}
247
248
			if ( ! defined( 'WC_VERSION' ) ) {
249
				return __( 'WooCommerce Stripe requires WooCommerce to be activated to work.', 'woocommerce-gateway-stripe' );
250
			}
251
252 View Code Duplication
			if ( version_compare( WC_VERSION, WC_STRIPE_MIN_WC_VER, '<' ) ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across 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...
253
				$message = __( 'WooCommerce Stripe - The minimum WooCommerce version required for this plugin is %1$s. You are running %2$s.', 'woocommerce-gateway-stripe' );
254
255
				return sprintf( $message, WC_STRIPE_MIN_WC_VER, WC_VERSION );
256
			}
257
258
			if ( ! function_exists( 'curl_init' ) ) {
259
				return __( 'WooCommerce Stripe - cURL is not installed.', 'woocommerce-gateway-stripe' );
260
			}
261
262
			return false;
263
		}
264
265
		/**
266
		 * Adds plugin action links
267
		 *
268
		 * @since 1.0.0
269
		 */
270
		public function plugin_action_links( $links ) {
271
			$setting_link = $this->get_setting_link();
272
273
			$plugin_links = array(
274
				'<a href="' . $setting_link . '">' . __( 'Settings', 'woocommerce-gateway-stripe' ) . '</a>',
275
				'<a href="https://docs.woothemes.com/document/stripe/">' . __( 'Docs', 'woocommerce-gateway-stripe' ) . '</a>',
276
				'<a href="http://support.woothemes.com/">' . __( 'Support', 'woocommerce-gateway-stripe' ) . '</a>',
277
			);
278
			return array_merge( $plugin_links, $links );
279
		}
280
281
		/**
282
		 * Get setting link.
283
		 *
284
		 * @since 1.0.0
285
		 *
286
		 * @return string Setting link
287
		 */
288
		public function get_setting_link() {
289
			$use_id_as_section = function_exists( 'WC' ) ? version_compare( WC()->version, '2.6', '>=' ) : false;
290
291
			$section_slug = $use_id_as_section ? 'stripe' : strtolower( 'WC_Gateway_Stripe' );
292
293
			return admin_url( 'admin.php?page=wc-settings&tab=checkout&section=' . $section_slug );
294
		}
295
296
		/**
297
		 * Display any notices we've collected thus far (e.g. for connection, disconnection)
298
		 */
299
		public function admin_notices() {
300
			$show_request_api_notice = get_option( 'wc_stripe_show_request_api_notice' );
301
			$show_apple_pay_notice   = get_option( 'wc_stripe_show_apple_pay_notice' );
302
303 View Code Duplication
			if ( empty( $show_apple_pay_notice ) || 'yes' === $show_apple_pay_notice ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across 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...
304
				// @TODO remove this notice in the future.
305
				?>
306
				<div class="notice notice-warning wc-stripe-apple-pay-notice is-dismissible"><p><?php esc_html_e( 'New Feature! Stripe now supports Apple Pay. Your customers can now purchase your products even faster. Apple Pay has been enabled by default.', 'woocommerce-gateway-stripe' ); ?></p></div>
307
308
				<script type="application/javascript">
309
					window.onload = function() {
310
						jQuery( '.wc-stripe-apple-pay-notice' ).on( 'click', '.notice-dismiss', function () {
311
							var data = {
312
								action: 'stripe_dismiss_apple_pay_notice'
313
							};
314
315
							jQuery.post( '<?php echo admin_url( 'admin-ajax.php' ); ?>', data );
316
						});
317
					}
318
				</script>
319
320
				<?php
321
			}
322
323 View Code Duplication
			if ( empty( $show_request_api_notice ) || 'yes' === $show_request_api_notice ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across 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...
324
				// @TODO remove this notice in the future.
325
				?>
326
				<div class="notice notice-warning wc-stripe-request-api-notice is-dismissible"><p><?php esc_html_e( 'New Feature! Stripe now supports Google Payment Request. Your customers can now use mobile phones with supported browsers such as Chrome to make purchases easier and faster.', 'woocommerce-gateway-stripe' ); ?></p></div>
327
				
328
				<script type="application/javascript">
329
					window.onload = function() {
330
						jQuery( '.wc-stripe-request-api-notice' ).on( 'click', '.notice-dismiss', function () {
331
							var data = {
332
								action: 'stripe_dismiss_request_api_notice'
333
							};
334
335
							jQuery.post( '<?php echo admin_url( 'admin-ajax.php' ); ?>', data );
336
						});
337
					}
338
				</script>
339
340
				<?php
341
			}
342
			
343
			foreach ( (array) $this->notices as $notice_key => $notice ) {
344
				echo "<div class='" . esc_attr( $notice['class'] ) . "'><p>";
345
				echo wp_kses( $notice['message'], array( 'a' => array( 'href' => array() ) ) );
346
				echo '</p></div>';
347
			}
348
		}
349
350
		/**
351
		 * Initialize the gateway. Called very early - in the context of the plugins_loaded action
352
		 *
353
		 * @since 1.0.0
354
		 */
355
		public function init_gateways() {
356
			if ( class_exists( 'WC_Subscriptions_Order' ) && function_exists( 'wcs_create_renewal_order' ) ) {
357
				$this->subscription_support_enabled = true;
358
			}
359
360
			if ( class_exists( 'WC_Pre_Orders_Order' ) ) {
361
				$this->pre_order_enabled = true;
362
			}
363
364
			if ( ! class_exists( 'WC_Payment_Gateway' ) ) {
365
				return;
366
			}
367
368
			if ( class_exists( 'WC_Payment_Gateway_CC' ) ) {
369
				include_once( dirname( __FILE__ ) . '/includes/class-wc-gateway-stripe.php' );
370
				include_once( dirname( __FILE__ ) . '/includes/class-wc-stripe-apple-pay.php' );
371
			} else {
372
				include_once( dirname( __FILE__ ) . '/includes/legacy/class-wc-gateway-stripe.php' );
373
				include_once( dirname( __FILE__ ) . '/includes/legacy/class-wc-gateway-stripe-saved-cards.php' );
374
			}
375
376
			load_plugin_textdomain( 'woocommerce-gateway-stripe', false, plugin_basename( dirname( __FILE__ ) ) . '/languages' );
377
			add_filter( 'woocommerce_payment_gateways', array( $this, 'add_gateways' ) );
378
			
379
			$load_addons = (
380
				$this->subscription_support_enabled
381
				||
382
				$this->pre_order_enabled
383
			);
384
385
			if ( $load_addons ) {
386
				require_once( dirname( __FILE__ ) . '/includes/class-wc-gateway-stripe-addons.php' );
387
			}
388
		}
389
390
		/**
391
		 * Add the gateways to WooCommerce
392
		 *
393
		 * @since 1.0.0
394
		 */
395
		public function add_gateways( $methods ) {
396
			if ( $this->subscription_support_enabled || $this->pre_order_enabled ) {
397
				$methods[] = 'WC_Gateway_Stripe_Addons';
398
			} else {
399
				$methods[] = 'WC_Gateway_Stripe';
400
			}
401
			return $methods;
402
		}
403
404
		/**
405
		 * Capture payment when the order is changed from on-hold to complete or processing
406
		 *
407
		 * @param  int $order_id
408
		 */
409
		public function capture_payment( $order_id ) {
410
			$order = wc_get_order( $order_id );
411
412
			if ( 'stripe' === $order->payment_method ) {
413
				$charge   = get_post_meta( $order_id, '_stripe_charge_id', true );
414
				$captured = get_post_meta( $order_id, '_stripe_charge_captured', true );
415
416
				if ( $charge && 'no' === $captured ) {
417
					$result = WC_Stripe_API::request( array(
418
						'amount'   => $order->get_total() * 100,
419
						'expand[]' => 'balance_transaction',
420
					), 'charges/' . $charge . '/capture' );
421
422
					if ( is_wp_error( $result ) ) {
423
						$order->add_order_note( __( 'Unable to capture charge!', 'woocommerce-gateway-stripe' ) . ' ' . $result->get_error_message() );
424
					} else {
425
						$order->add_order_note( sprintf( __( 'Stripe charge complete (Charge ID: %s)', 'woocommerce-gateway-stripe' ), $result->id ) );
426
						update_post_meta( $order->id, '_stripe_charge_captured', 'yes' );
427
428
						// Store other data such as fees
429
						update_post_meta( $order->id, 'Stripe Payment ID', $result->id );
430
431 View Code Duplication
						if ( isset( $result->balance_transaction ) && isset( $result->balance_transaction->fee ) ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across 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...
432
							// Fees and Net needs to both come from Stripe to be accurate as the returned
433
							// values are in the local currency of the Stripe account, not from WC.
434
							$fee = ! empty( $result->balance_transaction->fee ) ? number_format( $result->balance_transaction->fee / 100, 2, '.', '' ) : 0;
435
							$net = ! empty( $result->balance_transaction->net ) ? number_format( $result->balance_transaction->net / 100, 2, '.', '' ) : 0;
436
							update_post_meta( $order->id, 'Stripe Fee', $fee );
437
							update_post_meta( $order->id, 'Net Revenue From Stripe', $net );
438
						}
439
					}
440
				}
441
			}
442
		}
443
444
		/**
445
		 * Cancel pre-auth on refund/cancellation
446
		 *
447
		 * @param  int $order_id
448
		 */
449
		public function cancel_payment( $order_id ) {
450
			$order = wc_get_order( $order_id );
451
452
			if ( 'stripe' === $order->payment_method ) {
453
				$charge   = get_post_meta( $order_id, '_stripe_charge_id', true );
454
455
				if ( $charge ) {
456
					$result = WC_Stripe_API::request( array(
457
						'amount' => $order->get_total() * 100,
458
					), 'charges/' . $charge . '/refund' );
459
460
					if ( is_wp_error( $result ) ) {
461
						$order->add_order_note( __( 'Unable to refund charge!', 'woocommerce-gateway-stripe' ) . ' ' . $result->get_error_message() );
462
					} else {
463
						$order->add_order_note( sprintf( __( 'Stripe charge refunded (Charge ID: %s)', 'woocommerce-gateway-stripe' ), $result->id ) );
464
						delete_post_meta( $order->id, '_stripe_charge_captured' );
465
						delete_post_meta( $order->id, '_stripe_charge_id' );
466
					}
467
				}
468
			}
469
		}
470
471
		/**
472
		 * Gets saved tokens from API if they don't already exist in WooCommerce.
473
		 * @param array $tokens
474
		 * @return array
475
		 */
476
		public function woocommerce_get_customer_payment_tokens( $tokens, $customer_id, $gateway_id ) {
477
			if ( is_user_logged_in() && 'stripe' === $gateway_id && class_exists( 'WC_Payment_Token_CC' ) ) {
478
				$stripe_customer = new WC_Stripe_Customer( $customer_id );
479
				$stripe_cards    = $stripe_customer->get_cards();
480
				$stored_tokens   = array();
481
482
				foreach ( $tokens as $token ) {
483
					$stored_tokens[] = $token->get_token();
484
				}
485
486
				foreach ( $stripe_cards as $card ) {
487
					if ( ! in_array( $card->id, $stored_tokens ) ) {
488
						$token = new WC_Payment_Token_CC();
489
						$token->set_token( $card->id );
490
						$token->set_gateway_id( 'stripe' );
491
						$token->set_card_type( strtolower( $card->brand ) );
492
						$token->set_last4( $card->last4 );
493
						$token->set_expiry_month( $card->exp_month );
494
						$token->set_expiry_year( $card->exp_year );
495
						$token->set_user_id( $customer_id );
496
						$token->save();
497
						$tokens[ $token->get_id() ] = $token;
498
					}
499
				}
500
			}
501
			return $tokens;
502
		}
503
504
		/**
505
		 * Delete token from Stripe
506
		 */
507
		public function woocommerce_payment_token_deleted( $token_id, $token ) {
508
			if ( 'stripe' === $token->get_gateway_id() ) {
509
				$stripe_customer = new WC_Stripe_Customer( get_current_user_id() );
510
				$stripe_customer->delete_card( $token->get_token() );
511
			}
512
		}
513
514
		/**
515
		 * Set as default in Stripe
516
		 */
517
		public function woocommerce_payment_token_set_default( $token_id ) {
518
			$token = WC_Payment_Tokens::get( $token_id );
519
			if ( 'stripe' === $token->get_gateway_id() ) {
520
				$stripe_customer = new WC_Stripe_Customer( get_current_user_id() );
521
				$stripe_customer->set_default_card( $token->get_token() );
522
			}
523
		}
524
525
		/**
526
		 * Checks Stripe minimum order value authorized per currency
527
		 */
528
		public static function get_minimum_amount() {
529
			// Check order amount
530
			switch ( get_woocommerce_currency() ) {
531
				case 'USD':
532
				case 'CAD':
533
				case 'EUR':
534
				case 'CHF':
535
				case 'AUD':
536
				case 'SGD':
537
					$minimum_amount = 50;
538
					break;
539
				case 'GBP':
540
					$minimum_amount = 30;
541
					break;
542
				case 'DKK':
543
					$minimum_amount = 250;
544
					break;
545
				case 'NOK':
546
				case 'SEK':
547
					$minimum_amount = 300;
548
					break;
549
				case 'JPY':
550
					$minimum_amount = 5000;
551
					break;
552
				case 'MXN':
553
					$minimum_amount = 1000;
554
					break;
555
				case 'HKD':
556
					$minimum_amount = 400;
557
					break;
558
				default:
559
					$minimum_amount = 50;
560
					break;
561
			}
562
563
			return $minimum_amount;
564
		}
565
566
		/**
567
		 * What rolls down stairs
568
		 * alone or in pairs,
569
		 * and over your neighbor's dog?
570
		 * What's great for a snack,
571
		 * And fits on your back?
572
		 * It's log, log, log
573
		 */
574
		public static function log( $message ) {
575
			if ( empty( self::$log ) ) {
576
				self::$log = new WC_Logger();
0 ignored issues
show
Documentation Bug introduced by
It seems like new \WC_Logger() of type object<WC_Logger> is incompatible with the declared type object<Reference> of property $log.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
577
			}
578
579
			self::$log->add( 'woocommerce-gateway-stripe', $message );
580
		}
581
	}
582
583
	$GLOBALS['wc_stripe'] = WC_Stripe::get_instance();
584
585
endif;
586