Completed
Push — master ( 87ce88...61011b )
by Dwain
16s queued 11s
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: 4.3.3
9
 * Requires at least: 4.4
10
 * Tested up to: 5.4
11
 * WC requires at least: 3.0
12
 * WC tested up to: 4.0
13
 * Text Domain: woocommerce-gateway-stripe
14
 * Domain Path: /languages
15
 *
16
 */
17
18
if ( ! defined( 'ABSPATH' ) ) {
19
	exit;
20
}
21
22
/**
23
 * Required minimums and constants
24
 */
25
define( 'WC_STRIPE_VERSION', '4.3.3' );
26
define( 'WC_STRIPE_MIN_PHP_VER', '5.6.0' );
27
define( 'WC_STRIPE_MIN_WC_VER', '3.0' );
28
define( 'WC_STRIPE_FUTURE_MIN_WC_VER', '3.0' );
29
define( 'WC_STRIPE_MAIN_FILE', __FILE__ );
30
define( 'WC_STRIPE_PLUGIN_URL', untrailingslashit( plugins_url( basename( plugin_dir_path( __FILE__ ) ), basename( __FILE__ ) ) ) );
31
define( 'WC_STRIPE_PLUGIN_PATH', untrailingslashit( plugin_dir_path( __FILE__ ) ) );
32
33
// phpcs:disable WordPress.Files.FileName
34
35
/**
36
 * WooCommerce fallback notice.
37
 *
38
 * @since 4.1.2
39
 * @return string
40
 */
41
function woocommerce_stripe_missing_wc_notice() {
42
	/* translators: 1. URL link. */
43
	echo '<div class="error"><p><strong>' . sprintf( esc_html__( 'Stripe requires WooCommerce to be installed and active. You can download %s here.', 'woocommerce-gateway-stripe' ), '<a href="https://woocommerce.com/" target="_blank">WooCommerce</a>' ) . '</strong></p></div>';
44
}
45
46
/**
47
 * WooCommerce not supported fallback notice.
48
 *
49
 * @since 4.4.0
50
 * @return string
51
 */
52
function woocommerce_stripe_wc_not_supported() {
53
	/* translators: $1. Minimum WooCommerce version. $2. Current WooCommerce version. */
54
	echo '<div class="error"><p><strong>' . sprintf( esc_html__( 'Stripe requires WooCommerce %1$s or greater to be installed and active. WooCommerce %2$s is no longer supported.', 'woocommerce-gateway-stripe' ), WC_STRIPE_MIN_WC_VER, WC_VERSION ) . '</strong></p></div>';
55
}
56
57
add_action( 'plugins_loaded', 'woocommerce_gateway_stripe_init' );
58
59
function woocommerce_gateway_stripe_init() {
60
	load_plugin_textdomain( 'woocommerce-gateway-stripe', false, plugin_basename( dirname( __FILE__ ) ) . '/languages' );
61
62
	if ( ! class_exists( 'WooCommerce' ) ) {
63
		add_action( 'admin_notices', 'woocommerce_stripe_missing_wc_notice' );
64
		return;
65
	}
66
67
	if ( version_compare( WC_VERSION, WC_STRIPE_MIN_WC_VER, '<' ) ) {
68
		add_action( 'admin_notices', 'woocommerce_stripe_wc_not_supported' );
69
		return;
70
	}
71
72
	if ( ! class_exists( 'WC_Stripe' ) ) :
73
74
		class WC_Stripe {
75
76
			/**
77
			 * @var Singleton The reference the *Singleton* instance of this class
78
			 */
79
			private static $instance;
80
81
			/**
82
			 * Returns the *Singleton* instance of this class.
83
			 *
84
			 * @return Singleton The *Singleton* instance.
85
			 */
86
			public static function get_instance() {
87
				if ( null === self::$instance ) {
88
					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...
89
				}
90
				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 90 which is incompatible with the return type documented by WC_Stripe::get_instance of type Singleton.
Loading history...
91
			}
92
93
			/**
94
			 * Private clone method to prevent cloning of the instance of the
95
			 * *Singleton* instance.
96
			 *
97
			 * @return void
98
			 */
99
			private function __clone() {}
100
101
			/**
102
			 * Private unserialize method to prevent unserializing of the *Singleton*
103
			 * instance.
104
			 *
105
			 * @return void
106
			 */
107
			private function __wakeup() {}
108
109
			/**
110
			 * Protected constructor to prevent creating a new instance of the
111
			 * *Singleton* via the `new` operator from outside of this class.
112
			 */
113
			private function __construct() {
114
				add_action( 'admin_init', array( $this, 'install' ) );
115
				$this->init();
116
			}
117
118
			/**
119
			 * Init the plugin after plugins_loaded so environment variables are set.
120
			 *
121
			 * @since 1.0.0
122
			 * @version 4.0.0
123
			 */
124
			public function init() {
125
				if ( is_admin() ) {
126
					require_once dirname( __FILE__ ) . '/includes/admin/class-wc-stripe-privacy.php';
127
				}
128
129
				require_once dirname( __FILE__ ) . '/includes/class-wc-stripe-exception.php';
130
				require_once dirname( __FILE__ ) . '/includes/class-wc-stripe-logger.php';
131
				require_once dirname( __FILE__ ) . '/includes/class-wc-stripe-helper.php';
132
				include_once dirname( __FILE__ ) . '/includes/class-wc-stripe-api.php';
133
				require_once dirname( __FILE__ ) . '/includes/abstracts/abstract-wc-stripe-payment-gateway.php';
134
				require_once dirname( __FILE__ ) . '/includes/class-wc-stripe-webhook-handler.php';
135
				require_once dirname( __FILE__ ) . '/includes/class-wc-stripe-sepa-payment-token.php';
136
				require_once dirname( __FILE__ ) . '/includes/class-wc-stripe-apple-pay-registration.php';
137
				require_once dirname( __FILE__ ) . '/includes/compat/class-wc-stripe-pre-orders-compat.php';
138
				require_once dirname( __FILE__ ) . '/includes/class-wc-gateway-stripe.php';
139
				require_once dirname( __FILE__ ) . '/includes/payment-methods/class-wc-gateway-stripe-bancontact.php';
140
				require_once dirname( __FILE__ ) . '/includes/payment-methods/class-wc-gateway-stripe-sofort.php';
141
				require_once dirname( __FILE__ ) . '/includes/payment-methods/class-wc-gateway-stripe-giropay.php';
142
				require_once dirname( __FILE__ ) . '/includes/payment-methods/class-wc-gateway-stripe-eps.php';
143
				require_once dirname( __FILE__ ) . '/includes/payment-methods/class-wc-gateway-stripe-ideal.php';
144
				require_once dirname( __FILE__ ) . '/includes/payment-methods/class-wc-gateway-stripe-p24.php';
145
				require_once dirname( __FILE__ ) . '/includes/payment-methods/class-wc-gateway-stripe-alipay.php';
146
				require_once dirname( __FILE__ ) . '/includes/payment-methods/class-wc-gateway-stripe-sepa.php';
147
				require_once dirname( __FILE__ ) . '/includes/payment-methods/class-wc-gateway-stripe-multibanco.php';
148
				require_once dirname( __FILE__ ) . '/includes/payment-methods/class-wc-stripe-payment-request.php';
149
				require_once dirname( __FILE__ ) . '/includes/compat/class-wc-stripe-subs-compat.php';
150
				require_once dirname( __FILE__ ) . '/includes/compat/class-wc-stripe-sepa-subs-compat.php';
151
				require_once dirname( __FILE__ ) . '/includes/class-wc-stripe-order-handler.php';
152
				require_once dirname( __FILE__ ) . '/includes/class-wc-stripe-payment-tokens.php';
153
				require_once dirname( __FILE__ ) . '/includes/class-wc-stripe-customer.php';
154
				require_once dirname( __FILE__ ) . '/includes/class-wc-stripe-intent-controller.php';
155
156
				if ( is_admin() ) {
157
					require_once dirname( __FILE__ ) . '/includes/admin/class-wc-stripe-admin-notices.php';
158
				}
159
160
				// REMOVE IN THE FUTURE.
161
				require_once dirname( __FILE__ ) . '/includes/deprecated/class-wc-stripe-apple-pay.php';
162
163
				add_filter( 'woocommerce_payment_gateways', array( $this, 'add_gateways' ) );
164
				add_filter( 'plugin_action_links_' . plugin_basename( __FILE__ ), array( $this, 'plugin_action_links' ) );
165
166
				// Modify emails emails.
167
				add_filter( 'woocommerce_email_classes', array( $this, 'add_emails' ), 20 );
168
169
				if ( version_compare( WC_VERSION, '3.4', '<' ) ) {
170
					add_filter( 'woocommerce_get_sections_checkout', array( $this, 'filter_gateway_order_admin' ) );
171
				}
172
			}
173
174
			/**
175
			 * Updates the plugin version in db
176
			 *
177
			 * @since 3.1.0
178
			 * @version 4.0.0
179
			 */
180
			public function update_plugin_version() {
181
				delete_option( 'wc_stripe_version' );
182
				update_option( 'wc_stripe_version', WC_STRIPE_VERSION );
183
			}
184
185
			/**
186
			 * Handles upgrade routines.
187
			 *
188
			 * @since 3.1.0
189
			 * @version 3.1.0
190
			 */
191
			public function install() {
192
				if ( ! is_plugin_active( plugin_basename( __FILE__ ) ) ) {
193
					return;
194
				}
195
196
				if ( ! defined( 'IFRAME_REQUEST' ) && ( WC_STRIPE_VERSION !== get_option( 'wc_stripe_version' ) ) ) {
197
					do_action( 'woocommerce_stripe_updated' );
198
199
					if ( ! defined( 'WC_STRIPE_INSTALLING' ) ) {
200
						define( 'WC_STRIPE_INSTALLING', true );
201
					}
202
203
					$this->update_plugin_version();
204
				}
205
			}
206
207
			/**
208
			 * Adds plugin action links.
209
			 *
210
			 * @since 1.0.0
211
			 * @version 4.0.0
212
			 */
213
			public function plugin_action_links( $links ) {
214
				$plugin_links = array(
215
					'<a href="admin.php?page=wc-settings&tab=checkout&section=stripe">' . esc_html__( 'Settings', 'woocommerce-gateway-stripe' ) . '</a>',
216
					'<a href="https://docs.woocommerce.com/document/stripe/">' . esc_html__( 'Docs', 'woocommerce-gateway-stripe' ) . '</a>',
217
					'<a href="https://woocommerce.com/my-account/create-a-ticket?broken=primary&select=18627">' . esc_html__( 'Support', 'woocommerce-gateway-stripe' ) . '</a>',
218
				);
219
				return array_merge( $plugin_links, $links );
220
			}
221
222
			/**
223
			 * Add the gateways to WooCommerce.
224
			 *
225
			 * @since 1.0.0
226
			 * @version 4.0.0
227
			 */
228
			public function add_gateways( $methods ) {
229
				if ( class_exists( 'WC_Subscriptions_Order' ) && function_exists( 'wcs_create_renewal_order' ) ) {
230
					$methods[] = 'WC_Stripe_Subs_Compat';
231
					$methods[] = 'WC_Stripe_Sepa_Subs_Compat';
232
				} else {
233
					$methods[] = 'WC_Gateway_Stripe';
234
					$methods[] = 'WC_Gateway_Stripe_Sepa';
235
				}
236
237
				$methods[] = 'WC_Gateway_Stripe_Bancontact';
238
				$methods[] = 'WC_Gateway_Stripe_Sofort';
239
				$methods[] = 'WC_Gateway_Stripe_Giropay';
240
				$methods[] = 'WC_Gateway_Stripe_Eps';
241
				$methods[] = 'WC_Gateway_Stripe_Ideal';
242
				$methods[] = 'WC_Gateway_Stripe_P24';
243
				$methods[] = 'WC_Gateway_Stripe_Alipay';
244
				$methods[] = 'WC_Gateway_Stripe_Multibanco';
245
246
				return $methods;
247
			}
248
249
			/**
250
			 * Modifies the order of the gateways displayed in admin.
251
			 *
252
			 * @since 4.0.0
253
			 * @version 4.0.0
254
			 */
255
			public function filter_gateway_order_admin( $sections ) {
256
				unset( $sections['stripe'] );
257
				unset( $sections['stripe_bancontact'] );
258
				unset( $sections['stripe_sofort'] );
259
				unset( $sections['stripe_giropay'] );
260
				unset( $sections['stripe_eps'] );
261
				unset( $sections['stripe_ideal'] );
262
				unset( $sections['stripe_p24'] );
263
				unset( $sections['stripe_alipay'] );
264
				unset( $sections['stripe_sepa'] );
265
				unset( $sections['stripe_multibanco'] );
266
267
				$sections['stripe']            = 'Stripe';
268
				$sections['stripe_bancontact'] = __( 'Stripe Bancontact', 'woocommerce-gateway-stripe' );
269
				$sections['stripe_sofort']     = __( 'Stripe SOFORT', 'woocommerce-gateway-stripe' );
270
				$sections['stripe_giropay']    = __( 'Stripe Giropay', 'woocommerce-gateway-stripe' );
271
				$sections['stripe_eps']        = __( 'Stripe EPS', 'woocommerce-gateway-stripe' );
272
				$sections['stripe_ideal']      = __( 'Stripe iDeal', 'woocommerce-gateway-stripe' );
273
				$sections['stripe_p24']        = __( 'Stripe P24', 'woocommerce-gateway-stripe' );
274
				$sections['stripe_alipay']     = __( 'Stripe Alipay', 'woocommerce-gateway-stripe' );
275
				$sections['stripe_sepa']       = __( 'Stripe SEPA Direct Debit', 'woocommerce-gateway-stripe' );
276
				$sections['stripe_multibanco'] = __( 'Stripe Multibanco', 'woocommerce-gateway-stripe' );
277
278
				return $sections;
279
			}
280
281
			/**
282
			 * Adds the failed SCA auth email to WooCommerce.
283
			 *
284
			 * @param WC_Email[] $email_classes All existing emails.
285
			 * @return WC_Email[]
286
			 */
287
			public function add_emails( $email_classes ) {
288
				require_once WC_STRIPE_PLUGIN_PATH . '/includes/compat/class-wc-stripe-email-failed-authentication.php';
289
				require_once WC_STRIPE_PLUGIN_PATH . '/includes/compat/class-wc-stripe-email-failed-renewal-authentication.php';
290
				require_once WC_STRIPE_PLUGIN_PATH . '/includes/compat/class-wc-stripe-email-failed-preorder-authentication.php';
291
				require_once WC_STRIPE_PLUGIN_PATH . '/includes/compat/class-wc-stripe-email-failed-authentication-retry.php';
292
293
				// Add all emails, generated by the gateway.
294
				$email_classes['WC_Stripe_Email_Failed_Renewal_Authentication']  = new WC_Stripe_Email_Failed_Renewal_Authentication( $email_classes );
295
				$email_classes['WC_Stripe_Email_Failed_Preorder_Authentication'] = new WC_Stripe_Email_Failed_Preorder_Authentication( $email_classes );
296
				$email_classes['WC_Stripe_Email_Failed_Authentication_Retry'] = new WC_Stripe_Email_Failed_Authentication_Retry( $email_classes );
297
298
				return $email_classes;
299
			}
300
		}
301
302
		WC_Stripe::get_instance();
303
	endif;
304
}
305