Completed
Pull Request — master (#319)
by Akeda
02:24
created

woocommerce-gateway-stripe.php (2 issues)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

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.2.1
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.2.1' );
36
define( 'WC_STRIPE_MIN_PHP_VER', '5.6.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();
64
			}
65
			return self::$instance;
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( 'wc_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
			update_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
			$this->_update_plugin_version();
232
		}
233
234
		/**
235
		 * Checks the environment for compatibility problems.  Returns a string with the first incompatibility
236
		 * found or false if the environment has no problems.
237
		 */
238
		static function get_environment_warning() {
0 ignored issues
show
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...
239 View Code Duplication
			if ( version_compare( phpversion(), WC_STRIPE_MIN_PHP_VER, '<' ) ) {
240
				$message = __( 'WooCommerce Stripe - The minimum PHP version required for this plugin is %1$s. You are running %2$s.', 'woocommerce-gateway-stripe' );
241
242
				return sprintf( $message, WC_STRIPE_MIN_PHP_VER, phpversion() );
243
			}
244
245
			if ( ! defined( 'WC_VERSION' ) ) {
246
				return __( 'WooCommerce Stripe requires WooCommerce to be activated to work.', 'woocommerce-gateway-stripe' );
247
			}
248
249 View Code Duplication
			if ( version_compare( WC_VERSION, WC_STRIPE_MIN_WC_VER, '<' ) ) {
250
				$message = __( 'WooCommerce Stripe - The minimum WooCommerce version required for this plugin is %1$s. You are running %2$s.', 'woocommerce-gateway-stripe' );
251
252
				return sprintf( $message, WC_STRIPE_MIN_WC_VER, WC_VERSION );
253
			}
254
255
			if ( ! function_exists( 'curl_init' ) ) {
256
				return __( 'WooCommerce Stripe - cURL is not installed.', 'woocommerce-gateway-stripe' );
257
			}
258
259
			return false;
260
		}
261
262
		/**
263
		 * Adds plugin action links
264
		 *
265
		 * @since 1.0.0
266
		 */
267
		public function plugin_action_links( $links ) {
268
			$setting_link = $this->get_setting_link();
269
270
			$plugin_links = array(
271
				'<a href="' . $setting_link . '">' . __( 'Settings', 'woocommerce-gateway-stripe' ) . '</a>',
272
				'<a href="https://docs.woocommerce.com/document/stripe/">' . __( 'Docs', 'woocommerce-gateway-stripe' ) . '</a>',
273
				'<a href="https://woocommerce.com/contact-us/">' . __( 'Support', 'woocommerce-gateway-stripe' ) . '</a>',
274
			);
275
			return array_merge( $plugin_links, $links );
276
		}
277
278
		/**
279
		 * Get setting link.
280
		 *
281
		 * @since 1.0.0
282
		 *
283
		 * @return string Setting link
284
		 */
285
		public function get_setting_link() {
286
			$use_id_as_section = function_exists( 'WC' ) ? version_compare( WC()->version, '2.6', '>=' ) : false;
287
288
			$section_slug = $use_id_as_section ? 'stripe' : strtolower( 'WC_Gateway_Stripe' );
289
290
			return admin_url( 'admin.php?page=wc-settings&tab=checkout&section=' . $section_slug );
291
		}
292
293
		/**
294
		 * Display any notices we've collected thus far (e.g. for connection, disconnection)
295
		 */
296
		public function admin_notices() {
297
			$show_request_api_notice = get_option( 'wc_stripe_show_request_api_notice' );
298
			$show_apple_pay_notice   = get_option( 'wc_stripe_show_apple_pay_notice' );
299
300
			if ( empty( $show_apple_pay_notice ) ) {
301
				// @TODO remove this notice in the future.
302
				?>
303
				<div class="notice notice-warning wc-stripe-apple-pay-notice is-dismissible"><p><?php echo sprintf( esc_html__( 'New Feature! Stripe now supports %s. Your customers can now purchase your products even faster. Apple Pay has been enabled by default.', 'woocommerce-gateway-stripe' ), '<a href="https://woocommerce.com/apple-pay/">Apple Pay</a>'); ?></p></div>
304
305
				<script type="application/javascript">
306
					jQuery( '.wc-stripe-apple-pay-notice' ).on( 'click', '.notice-dismiss', function() {
307
						var data = {
308
							action: 'stripe_dismiss_apple_pay_notice'
309
						};
310
311
						jQuery.post( '<?php echo admin_url( 'admin-ajax.php' ); ?>', data );
312
					});
313
				</script>
314
315
				<?php
316
			}
317
318
			if ( empty( $show_request_api_notice ) ) {
319
				// @TODO remove this notice in the future.
320
				?>
321
				<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>
322
323
				<script type="application/javascript">
324
					jQuery( '.wc-stripe-request-api-notice' ).on( 'click', '.notice-dismiss', function() {
325
						var data = {
326
							action: 'stripe_dismiss_request_api_notice'
327
						};
328
329
						jQuery.post( '<?php echo admin_url( 'admin-ajax.php' ); ?>', data );
330
					});
331
				</script>
332
333
				<?php
334
			}
335
336
			foreach ( (array) $this->notices as $notice_key => $notice ) {
337
				echo "<div class='" . esc_attr( $notice['class'] ) . "'><p>";
338
				echo wp_kses( $notice['message'], array( 'a' => array( 'href' => array() ) ) );
339
				echo '</p></div>';
340
			}
341
		}
342
343
		/**
344
		 * Initialize the gateway. Called very early - in the context of the plugins_loaded action
345
		 *
346
		 * @since 1.0.0
347
		 */
348
		public function init_gateways() {
349
			if ( class_exists( 'WC_Subscriptions_Order' ) && function_exists( 'wcs_create_renewal_order' ) ) {
350
				$this->subscription_support_enabled = true;
351
			}
352
353
			if ( class_exists( 'WC_Pre_Orders_Order' ) ) {
354
				$this->pre_order_enabled = true;
355
			}
356
357
			if ( ! class_exists( 'WC_Payment_Gateway' ) ) {
358
				return;
359
			}
360
361
			if ( class_exists( 'WC_Payment_Gateway_CC' ) ) {
362
				include_once( dirname( __FILE__ ) . '/includes/class-wc-gateway-stripe.php' );
363
				include_once( dirname( __FILE__ ) . '/includes/class-wc-stripe-apple-pay.php' );
364
			} else {
365
				include_once( dirname( __FILE__ ) . '/includes/legacy/class-wc-gateway-stripe.php' );
366
				include_once( dirname( __FILE__ ) . '/includes/legacy/class-wc-gateway-stripe-saved-cards.php' );
367
			}
368
369
			load_plugin_textdomain( 'woocommerce-gateway-stripe', false, plugin_basename( dirname( __FILE__ ) ) . '/languages' );
370
			add_filter( 'woocommerce_payment_gateways', array( $this, 'add_gateways' ) );
371
372
			$load_addons = (
373
				$this->subscription_support_enabled
374
				||
375
				$this->pre_order_enabled
376
			);
377
378
			if ( $load_addons ) {
379
				require_once( dirname( __FILE__ ) . '/includes/class-wc-gateway-stripe-addons.php' );
380
			}
381
		}
382
383
		/**
384
		 * Add the gateways to WooCommerce
385
		 *
386
		 * @since 1.0.0
387
		 */
388
		public function add_gateways( $methods ) {
389
			if ( $this->subscription_support_enabled || $this->pre_order_enabled ) {
390
				$methods[] = 'WC_Gateway_Stripe_Addons';
391
			} else {
392
				$methods[] = 'WC_Gateway_Stripe';
393
			}
394
			return $methods;
395
		}
396
397
		/**
398
		 * List of currencies supported by Stripe that has no decimals.
399
		 *
400
		 * @return array $currencies
401
		 */
402
		public static function no_decimal_currencies() {
403
			return array(
404
				'bif', // Burundian Franc
405
				'djf', // Djiboutian Franc
406
				'jpy', // Japanese Yen
407
				'krw', // South Korean Won
408
				'pyg', // Paraguayan Guaraní
409
				'vnd', // Vietnamese Đồng
410
				'xaf', // Central African Cfa Franc
411
				'xpf', // Cfp Franc
412
				'clp', // Chilean Peso
413
				'gnf', // Guinean Franc
414
				'kmf', // Comorian Franc
415
				'mga', // Malagasy Ariary
416
				'rwf', // Rwandan Franc
417
				'vuv', // Vanuatu Vatu
418
				'xof', // West African Cfa Franc
419
			);
420
		}
421
422
		/**
423
		 * Stripe uses smallest denomination in currencies such as cents.
424
		 * We need to format the returned currency from Stripe into human readable form.
425
		 *
426
		 * @param object $balance_transaction
427
		 * @param string $type Type of number to format
428
		 */
429
		public static function format_number( $balance_transaction, $type = 'fee' ) {
430
			if ( ! is_object( $balance_transaction ) ) {
431
				return;
432
			}
433
434
			if ( in_array( strtolower( $balance_transaction->currency ), self::no_decimal_currencies() ) ) {
435
				if ( 'fee' === $type ) {
436
					return $balance_transaction->fee;
437
				}
438
439
				return $balance_transaction->net;
440
			}
441
442
			if ( 'fee' === $type ) {
443
				return number_format( $balance_transaction->fee / 100, 2, '.', '' );
444
			}
445
446
			return number_format( $balance_transaction->net / 100, 2, '.', '' );
447
		}
448
449
		/**
450
		 * Capture payment when the order is changed from on-hold to complete or processing
451
		 *
452
		 * @param  int $order_id
453
		 */
454
		public function capture_payment( $order_id ) {
455
			$order = wc_get_order( $order_id );
456
457
			if ( 'stripe' === ( version_compare( WC_VERSION, '3.0.0', '<' ) ? $order->payment_method : $order->get_payment_method() ) ) {
458
				$charge   = get_post_meta( $order_id, '_stripe_charge_id', true );
459
				$captured = get_post_meta( $order_id, '_stripe_charge_captured', true );
460
461
				if ( $charge && 'no' === $captured ) {
462
					$result = WC_Stripe_API::request( array(
463
						'amount'   => $order->get_total() * 100,
464
						'expand[]' => 'balance_transaction',
465
					), 'charges/' . $charge . '/capture' );
466
467
					if ( is_wp_error( $result ) ) {
468
						$order->add_order_note( __( 'Unable to capture charge!', 'woocommerce-gateway-stripe' ) . ' ' . $result->get_error_message() );
469
					} else {
470
						$order->add_order_note( sprintf( __( 'Stripe charge complete (Charge ID: %s)', 'woocommerce-gateway-stripe' ), $result->id ) );
471
						update_post_meta( $order_id, '_stripe_charge_captured', 'yes' );
472
473
						// Store other data such as fees
474
						update_post_meta( $order_id, 'Stripe Payment ID', $result->id );
475
						update_post_meta( $order_id, '_transaction_id', $result->id );
476
477 View Code Duplication
						if ( isset( $result->balance_transaction ) && isset( $result->balance_transaction->fee ) ) {
478
							// Fees and Net needs to both come from Stripe to be accurate as the returned
479
							// values are in the local currency of the Stripe account, not from WC.
480
							$fee = ! empty( $result->balance_transaction->fee ) ? self::format_number( $result->balance_transaction, 'fee' ) : 0;
481
							$net = ! empty( $result->balance_transaction->net ) ? self::format_number( $result->balance_transaction, 'net' ) : 0;
482
							update_post_meta( $order_id, 'Stripe Fee', $fee );
483
							update_post_meta( $order_id, 'Net Revenue From Stripe', $net );
484
						}
485
					}
486
				}
487
			}
488
		}
489
490
		/**
491
		 * Cancel pre-auth on refund/cancellation
492
		 *
493
		 * @param  int $order_id
494
		 */
495
		public function cancel_payment( $order_id ) {
496
			$order = wc_get_order( $order_id );
497
498
			if ( 'stripe' === ( version_compare( WC_VERSION, '3.0.0', '<' ) ? $order->payment_method : $order->get_payment_method() ) ) {
499
				$charge   = get_post_meta( $order_id, '_stripe_charge_id', true );
500
501
				if ( $charge ) {
502
					$result = WC_Stripe_API::request( array(
503
						'amount' => $order->get_total() * 100,
504
					), 'charges/' . $charge . '/refund' );
505
506
					if ( is_wp_error( $result ) ) {
507
						$order->add_order_note( __( 'Unable to refund charge!', 'woocommerce-gateway-stripe' ) . ' ' . $result->get_error_message() );
508
					} else {
509
						$order->add_order_note( sprintf( __( 'Stripe charge refunded (Charge ID: %s)', 'woocommerce-gateway-stripe' ), $result->id ) );
510
						delete_post_meta( $order_id, '_stripe_charge_captured' );
511
						delete_post_meta( $order_id, '_stripe_charge_id' );
512
					}
513
				}
514
			}
515
		}
516
517
		/**
518
		 * Gets saved tokens from API if they don't already exist in WooCommerce.
519
		 * @param array $tokens
520
		 * @return array
521
		 */
522
		public function woocommerce_get_customer_payment_tokens( $tokens, $customer_id, $gateway_id ) {
523
			if ( is_user_logged_in() && 'stripe' === $gateway_id && class_exists( 'WC_Payment_Token_CC' ) ) {
524
				$stripe_customer = new WC_Stripe_Customer( $customer_id );
525
				$stripe_cards    = $stripe_customer->get_cards();
526
				$stored_tokens   = array();
527
528
				foreach ( $tokens as $token ) {
529
					$stored_tokens[] = $token->get_token();
530
				}
531
532
				foreach ( $stripe_cards as $card ) {
533
					if ( ! in_array( $card->id, $stored_tokens ) ) {
534
						$token = new WC_Payment_Token_CC();
535
						$token->set_token( $card->id );
536
						$token->set_gateway_id( 'stripe' );
537
						$token->set_card_type( strtolower( $card->brand ) );
538
						$token->set_last4( $card->last4 );
539
						$token->set_expiry_month( $card->exp_month );
540
						$token->set_expiry_year( $card->exp_year );
541
						$token->set_user_id( $customer_id );
542
						$token->save();
543
						$tokens[ $token->get_id() ] = $token;
544
					}
545
				}
546
			}
547
			return $tokens;
548
		}
549
550
		/**
551
		 * Delete token from Stripe
552
		 */
553
		public function woocommerce_payment_token_deleted( $token_id, $token ) {
554
			if ( 'stripe' === $token->get_gateway_id() ) {
555
				$stripe_customer = new WC_Stripe_Customer( get_current_user_id() );
556
				$stripe_customer->delete_card( $token->get_token() );
557
			}
558
		}
559
560
		/**
561
		 * Set as default in Stripe
562
		 */
563
		public function woocommerce_payment_token_set_default( $token_id ) {
564
			$token = WC_Payment_Tokens::get( $token_id );
565
			if ( 'stripe' === $token->get_gateway_id() ) {
566
				$stripe_customer = new WC_Stripe_Customer( get_current_user_id() );
567
				$stripe_customer->set_default_card( $token->get_token() );
568
			}
569
		}
570
571
		/**
572
		 * Checks Stripe minimum order value authorized per currency
573
		 */
574
		public static function get_minimum_amount() {
575
			// Check order amount
576
			switch ( get_woocommerce_currency() ) {
577
				case 'USD':
578
				case 'CAD':
579
				case 'EUR':
580
				case 'CHF':
581
				case 'AUD':
582
				case 'SGD':
583
					$minimum_amount = 50;
584
					break;
585
				case 'GBP':
586
					$minimum_amount = 30;
587
					break;
588
				case 'DKK':
589
					$minimum_amount = 250;
590
					break;
591
				case 'NOK':
592
				case 'SEK':
593
					$minimum_amount = 300;
594
					break;
595
				case 'JPY':
596
					$minimum_amount = 5000;
597
					break;
598
				case 'MXN':
599
					$minimum_amount = 1000;
600
					break;
601
				case 'HKD':
602
					$minimum_amount = 400;
603
					break;
604
				default:
605
					$minimum_amount = 50;
606
					break;
607
			}
608
609
			return $minimum_amount;
610
		}
611
612
		/**
613
		 * What rolls down stairs
614
		 * alone or in pairs,
615
		 * and over your neighbor's dog?
616
		 * What's great for a snack,
617
		 * And fits on your back?
618
		 * It's log, log, log
619
		 */
620
		public static function log( $message ) {
621
			if ( empty( self::$log ) ) {
622
				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...
623
			}
624
625
			self::$log->add( 'woocommerce-gateway-stripe', $message );
626
		}
627
	}
628
629
	$GLOBALS['wc_stripe'] = WC_Stripe::get_instance();
630
631
endif;
632