PluginProbe
PayPlug for WooCommerce (Official) / 3.1.0
PayPlug for WooCommerce (Official) v3.1.0
3.1.0 3.0.0 2.18.0 1.0.17 1.0.18 1.0.19 1.0.20 1.0.21 1.0.22 1.0.3 1.0.4 1.0.5 1.0.6 1.0.7 1.0.8 1.1.0 1.10.0 1.10.1 1.2.1 1.2.10 1.2.11 1.2.2 1.2.3 1.2.4 1.2.5 All 102 releases
← All changes | src/PayplugWoocommerceHelper.php +900 -398 1.1.0 → 3.1.0 View file →
@@ -2,429 +2,931 @@
2 2
3 3 namespace Payplug\PayplugWoocommerce;
4 4
5 5 // Exit if accessed directly
6 -if ( ! defined( 'ABSPATH' ) ) {
7 - exit;
6 +if (!defined('ABSPATH')) {
7 + exit;
8 8 }
9 9
10 +use Payplug\Authentication;
11 +use Payplug\Exception\ForbiddenException;
12 +use Payplug\Payplug;
13 +use Payplug\PayplugWoocommerce\Gateway\PayplugGateway;
14 +use Payplug\PayplugWoocommerce\Gateway\PayplugGatewayOney3x;
15 +use Payplug\PayplugWoocommerce\Gateway\PayplugPermissions;
16 +use Payplug\PayplugWoocommerce\Traits\ServiceGetter;
10 17 use Payplug\Resource\APIResource;
18 +use WC_Blocks_Utils;
19 +use WC_Subscriptions;
11 20
12 21 /**
13 22 * Helper class.
14 - *
15 - * @package Payplug\PayplugWoocommerce
16 23 */
17 -class PayplugWoocommerceHelper {
24 +class PayplugWoocommerceHelper
25 +{
26 + use ServiceGetter;
18 27
19 - /**
20 - * Check if current WooCommerce version is below 3.0.0
21 - *
22 - * @return bool
23 - */
24 - public static function is_pre_30() {
25 - $wc = function_exists( 'WC' ) ? WC() : $GLOBALS['woocommerce'];
28 + /**
29 + * Check if current WooCommerce version is below 3.0.0
30 + *
31 + * @return bool
32 + */
33 + public static function is_pre_30()
34 + {
35 + $wc = function_exists('WC') ? WC() : $GLOBALS['woocommerce'];
26 36
27 - return version_compare( $wc->version, '3.0.0', '<' );
28 - }
37 + return version_compare($wc->version, '3.0.0', '<');
38 + }
29 39
30 - /**
31 - * Get a URL to the PayPlug gateway settings page.
32 - *
33 - * @return string
34 - */
35 - public static function get_setting_link() {
36 - $use_id_as_section = function_exists( 'WC' ) ? version_compare( WC()->version, '2.6', '>=' ) : false;
37 - $section_slug = $use_id_as_section ? 'payplug' : strtolower( 'PayplugGateway' );
40 + /**
41 + * Get a URL to the PayPlug gateway settings page.
42 + *
43 + * @return string
44 + */
45 + public static function get_setting_link()
46 + {
47 + $use_id_as_section = function_exists('WC') ? version_compare(WC()->version, '2.6', '>=') : false;
48 + $section_slug = $use_id_as_section ? 'payplug' : strtolower('PayplugGateway');
38 49
39 - return admin_url( 'admin.php?page=wc-settings&tab=checkout&section=' . $section_slug );
40 - }
50 + return admin_url('admin.php?page=wc-settings&tab=checkout&section=' . $section_slug);
51 + }
41 52
42 - /**
43 - * Get all country code supported by PayPlug.
44 - *
45 - * Those are ISO 3166-1 alpha-2. You can find more information on https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2
46 - *
47 - * @return array
48 - */
49 - public static function get_supported_countries() {
50 - return [
51 - 'AD',
52 - 'AO',
53 - 'AX',
54 - 'BG',
55 - 'BO',
56 - 'BY',
57 - 'CH',
58 - 'CR',
59 - 'DE',
60 - 'EE',
61 - 'FI',
62 - 'GB',
63 - 'GL',
64 - 'GT',
65 - 'HR',
66 - 'IN',
67 - 'JM',
68 - 'KM',
69 - 'KZ',
70 - 'LS',
71 - 'MD',
72 - 'MM',
73 - 'MT',
74 - 'NA',
75 - 'NO',
76 - 'PE',
77 - 'PN',
78 - 'RE',
79 - 'SC',
80 - 'SK',
81 - 'ST',
82 - 'TF',
83 - 'TN',
84 - 'UA',
85 - 'VC',
86 - 'WS',
87 - 'AE',
88 - 'AQ',
89 - 'AZ',
90 - 'BH',
91 - 'BQ',
92 - 'BZ',
93 - 'CI',
94 - 'CU',
95 - 'DJ',
96 - 'EG',
97 - 'FJ',
98 - 'GD',
99 - 'GM',
100 - 'GU',
101 - 'HT',
102 - 'IO',
103 - 'JO',
104 - 'KN',
105 - 'LA',
106 - 'LT',
107 - 'ME',
108 - 'MN',
109 - 'MU',
110 - 'NC',
111 - 'NP',
112 - 'PF',
113 - 'PR',
114 - 'RO',
115 - 'SD',
116 - 'SL',
117 - 'SV',
118 - 'TG',
119 - 'TO',
120 - 'UG',
121 - 'VE',
122 - 'YE',
123 - 'AM',
124 - 'AW',
125 - 'BF',
126 - 'BN',
127 - 'BW',
128 - 'CG',
129 - 'CO',
130 - 'AF',
131 - 'CZ',
132 - 'EC',
133 - 'EU',
134 - 'GA',
135 - 'GI',
136 - 'GS',
137 - 'HN',
138 - 'IM',
139 - 'JE',
140 - 'KI',
141 - 'KY',
142 - 'LR',
143 - 'MC',
144 - 'ML',
145 - 'MS',
146 - 'MZ',
147 - 'NL',
148 - 'PA',
149 - 'PM',
150 - 'QA',
151 - 'SB',
152 - 'SJ',
153 - 'SS',
154 - 'TD',
155 - 'TM',
156 - 'TZ',
157 - 'VA',
158 - 'WF',
159 - 'AR',
160 - 'BA',
161 - 'BI',
162 - 'BR',
163 - 'CA',
164 - 'CK',
165 - 'CV',
166 - 'DK',
167 - 'EH',
168 - 'FK',
169 - 'GE',
170 - 'GN',
171 - 'GW',
172 - 'HU',
173 - 'IQ',
174 - 'JP',
175 - 'KP',
176 - 'LB',
177 - 'LU',
178 - 'MF',
179 - 'MO',
180 - 'MV',
181 - 'NE',
182 - 'NR',
183 - 'PG',
184 - 'PS',
185 - 'RS',
186 - 'SE',
187 - 'SM',
188 - 'SX',
189 - 'TH',
190 - 'TR',
191 - 'UM',
192 - 'VG',
193 - 'YT',
194 - 'AL',
195 - 'AU',
196 - 'BE',
197 - 'BM',
198 - 'BV',
199 - 'CF',
200 - 'CN',
201 - 'CY',
202 - 'DZ',
203 - 'ET',
204 - 'FR',
205 - 'GH',
206 - 'GR',
207 - 'HM',
208 - 'IL',
209 - 'IT',
210 - 'KH',
211 - 'KW',
212 - 'LK',
213 - 'MA',
214 - 'MK',
215 - 'MR',
216 - 'MY',
217 - 'NI',
218 - 'OM',
219 - 'PL',
220 - 'PY',
221 - 'SA',
222 - 'SI',
223 - 'SR',
224 - 'TC',
225 - 'TL',
226 - 'TW',
227 - 'UZ',
228 - 'VU',
229 - 'ZW',
230 - 'AI',
231 - 'AT',
232 - 'BD',
233 - 'BL',
234 - 'BT',
235 - 'CD',
236 - 'CM',
237 - 'CX',
238 - 'DO',
239 - 'ES',
240 - 'FO',
241 - 'GG',
242 - 'GQ',
243 - 'HK',
244 - 'IE',
245 - 'IS',
246 - 'KG',
247 - 'KS',
248 - 'LI',
249 - 'LY',
250 - 'MH',
251 - 'MQ',
252 - 'MX',
253 - 'NG',
254 - 'NZ',
255 - 'PK',
256 - 'PW',
257 - 'RW',
258 - 'SH',
259 - 'SO',
260 - 'SZ',
261 - 'TK',
262 - 'TV',
263 - 'UY',
264 - 'VN',
265 - 'ZM',
266 - 'AG',
267 - 'AS',
268 - 'BB',
269 - 'BJ',
270 - 'BS',
271 - 'CC',
272 - 'CL',
273 - 'CW',
274 - 'DM',
275 - 'ER',
276 - 'FM',
277 - 'GF',
278 - 'GP',
279 - 'GY',
280 - 'ID',
281 - 'IR',
282 - 'KE',
283 - 'KR',
284 - 'LC',
285 - 'LV',
286 - 'MG',
287 - 'MP',
288 - 'MW',
289 - 'NF',
290 - 'NU',
291 - 'PH',
292 - 'PT',
293 - 'RU',
294 - 'SG',
295 - 'SN',
296 - 'SY',
297 - 'TJ',
298 - 'TT',
299 - 'US',
300 - 'VI',
301 - 'ZA'
302 - ];
303 - }
53 + /**
54 + * Get all country code supported by PayPlug.
55 + *
56 + * Those are ISO 3166-1 alpha-2. You can find more information on https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2
57 + *
58 + * @return array
59 + */
60 + public static function get_supported_countries()
61 + {
62 + return [
63 + 'AD',
64 + 'AO',
65 + 'AX',
66 + 'BG',
67 + 'BO',
68 + 'BY',
69 + 'CH',
70 + 'CR',
71 + 'DE',
72 + 'EE',
73 + 'FI',
74 + 'GB',
75 + 'GL',
76 + 'GT',
77 + 'HR',
78 + 'IN',
79 + 'JM',
80 + 'KM',
81 + 'KZ',
82 + 'LS',
83 + 'MD',
84 + 'MM',
85 + 'MT',
86 + 'NA',
87 + 'NO',
88 + 'PE',
89 + 'PN',
90 + 'RE',
91 + 'SC',
92 + 'SK',
93 + 'ST',
94 + 'TF',
95 + 'TN',
96 + 'UA',
97 + 'VC',
98 + 'WS',
99 + 'AE',
100 + 'AQ',
101 + 'AZ',
102 + 'BH',
103 + 'BQ',
104 + 'BZ',
105 + 'CI',
106 + 'CU',
107 + 'DJ',
108 + 'EG',
109 + 'FJ',
110 + 'GD',
111 + 'GM',
112 + 'GU',
113 + 'HT',
114 + 'IO',
115 + 'JO',
116 + 'KN',
117 + 'LA',
118 + 'LT',
119 + 'ME',
120 + 'MN',
121 + 'MU',
122 + 'NC',
123 + 'NP',
124 + 'PF',
125 + 'PR',
126 + 'RO',
127 + 'SD',
128 + 'SL',
129 + 'SV',
130 + 'TG',
131 + 'TO',
132 + 'UG',
133 + 'VE',
134 + 'YE',
135 + 'AM',
136 + 'AW',
137 + 'BF',
138 + 'BN',
139 + 'BW',
140 + 'CG',
141 + 'CO',
142 + 'AF',
143 + 'CZ',
144 + 'EC',
145 + 'EU',
146 + 'GA',
147 + 'GI',
148 + 'GS',
149 + 'HN',
150 + 'IM',
151 + 'JE',
152 + 'KI',
153 + 'KY',
154 + 'LR',
155 + 'MC',
156 + 'ML',
157 + 'MS',
158 + 'MZ',
159 + 'NL',
160 + 'PA',
161 + 'PM',
162 + 'QA',
163 + 'SB',
164 + 'SJ',
165 + 'SS',
166 + 'TD',
167 + 'TM',
168 + 'TZ',
169 + 'VA',
170 + 'WF',
171 + 'AR',
172 + 'BA',
173 + 'BI',
174 + 'BR',
175 + 'CA',
176 + 'CK',
177 + 'CV',
178 + 'DK',
179 + 'EH',
180 + 'FK',
181 + 'GE',
182 + 'GN',
183 + 'GW',
184 + 'HU',
185 + 'IQ',
186 + 'JP',
187 + 'KP',
188 + 'LB',
189 + 'LU',
190 + 'MF',
191 + 'MO',
192 + 'MV',
193 + 'NE',
194 + 'NR',
195 + 'PG',
196 + 'PS',
197 + 'RS',
198 + 'SE',
199 + 'SM',
200 + 'SX',
201 + 'TH',
202 + 'TR',
203 + 'UM',
204 + 'VG',
205 + 'YT',
206 + 'AL',
207 + 'AU',
208 + 'BE',
209 + 'BM',
210 + 'BV',
211 + 'CF',
212 + 'CN',
213 + 'CY',
214 + 'DZ',
215 + 'ET',
216 + 'FR',
217 + 'GH',
218 + 'GR',
219 + 'HM',
220 + 'IL',
221 + 'IT',
222 + 'KH',
223 + 'KW',
224 + 'LK',
225 + 'MA',
226 + 'MK',
227 + 'MR',
228 + 'MY',
229 + 'NI',
230 + 'OM',
231 + 'PL',
232 + 'PY',
233 + 'SA',
234 + 'SI',
235 + 'SR',
236 + 'TC',
237 + 'TL',
238 + 'TW',
239 + 'UZ',
240 + 'VU',
241 + 'ZW',
242 + 'AI',
243 + 'AT',
244 + 'BD',
245 + 'BL',
246 + 'BT',
247 + 'CD',
248 + 'CM',
249 + 'CX',
250 + 'DO',
251 + 'ES',
252 + 'FO',
253 + 'GG',
254 + 'GQ',
255 + 'HK',
256 + 'IE',
257 + 'IS',
258 + 'KG',
259 + 'KS',
260 + 'LI',
261 + 'LY',
262 + 'MH',
263 + 'MQ',
264 + 'MX',
265 + 'NG',
266 + 'NZ',
267 + 'PK',
268 + 'PW',
269 + 'RW',
270 + 'SH',
271 + 'SO',
272 + 'SZ',
273 + 'TK',
274 + 'TV',
275 + 'UY',
276 + 'VN',
277 + 'ZM',
278 + 'AG',
279 + 'AS',
280 + 'BB',
281 + 'BJ',
282 + 'BS',
283 + 'CC',
284 + 'CL',
285 + 'CW',
286 + 'DM',
287 + 'ER',
288 + 'FM',
289 + 'GF',
290 + 'GP',
291 + 'GY',
292 + 'ID',
293 + 'IR',
294 + 'KE',
295 + 'KR',
296 + 'LC',
297 + 'LV',
298 + 'MG',
299 + 'MP',
300 + 'MW',
301 + 'NF',
302 + 'NU',
303 + 'PH',
304 + 'PT',
305 + 'RU',
306 + 'SG',
307 + 'SN',
308 + 'SY',
309 + 'TJ',
310 + 'TT',
311 + 'US',
312 + 'VI',
313 + 'ZA',
314 + ];
315 + }
304 316
305 - /**
306 - * Ensure country code is supported by PayPlug.
307 - *
308 - * @param string $country The ISO 3166-1 alpha-2 code for the country
309 - *
310 - * @return bool
311 - * @author Clément Boirie
312 - */
313 - public static function is_country_supported( $country ) {
314 - $country = trim( $country );
315 - if ( empty( $country ) ) {
316 - return false;
317 - }
317 + /**
318 + * Ensure country code is supported by PayPlug.
319 + *
320 + * @param string $country The ISO 3166-1 alpha-2 code for the country
321 + *
322 + * @return bool
323 + *
324 + * @author Clément Boirie
325 + */
326 + public static function is_country_supported($country)
327 + {
328 + $country = trim($country);
329 + if (empty($country)) {
330 + return false;
331 + }
318 332
319 - return in_array( strtoupper( $country ), self::get_supported_countries() );
320 - }
333 + return in_array(strtoupper($country), self::get_supported_countries());
334 + }
321 335
322 - /**
323 - * Get default country.
324 - *
325 - * @return string
326 - */
327 - public static function get_default_country() {
328 - $country = \WC()->countries->get_base_country();
336 + /**
337 + * Get default country.
338 + *
339 + * @return string
340 + */
341 + public static function get_default_country()
342 + {
343 + $country = \WC()->countries->get_base_country();
329 344
330 - return ( self::is_country_supported( $country ) ) ? strtoupper( $country ) : 'FR';
331 - }
345 + return (self::is_country_supported($country)) ? strtoupper($country) : 'FR';
346 + }
332 347
333 - /**
334 - * Get minimum amount allowed by PayPlug.
335 - *
336 - * This amount is in cents.
337 - *
338 - * @return int
339 - */
340 - public static function get_minimum_amount() {
341 - return 99;
342 - }
348 + /**
349 + * Get minimum amount allowed by PayPlug.
350 + *
351 + * This amount is in cents.
352 + *
353 + * @return int
354 + */
355 + public static function get_minimum_amount()
356 + {
357 + return 99;
358 + }
343 359
344 - /**
345 - * Get maximum amount allowed by PayPlug.
346 - *
347 - * This amount is in cents.
348 - *
349 - * @return int
350 - */
351 - public static function get_maximum_amount() {
352 - return 2000000;
353 - }
360 + /**
361 + * Get maximum amount allowed by PayPlug.
362 + *
363 + * This amount is in cents.
364 + *
365 + * @return int
366 + */
367 + public static function get_maximum_amount()
368 + {
369 + return 2000000;
370 + }
354 371
355 - /**
356 - * Convert amount in cents.
357 - *
358 - * @param float $amount
359 - *
360 - * @return int
361 - */
362 - public static function get_payplug_amount( $amount ) {
363 - if ( is_null( $amount ) ) {
364 - return $amount;
365 - }
372 + /**
373 + * Convert amount in cents.
374 + *
375 + * @param float $amount
376 + *
377 + * @return int
378 + */
379 + public static function get_payplug_amount($amount)
380 + {
381 + if (is_null($amount)) {
382 + return $amount;
383 + }
366 384
367 - return absint( wc_format_decimal( ( (float) $amount * 100 ), wc_get_price_decimals() ) );
368 - }
385 + return absint(wc_format_decimal(((float) $amount * 100), wc_get_price_decimals()));
386 + }
369 387
370 - /**
371 - * Extract useful metadata from PayPlug response.
372 - *
373 - * @param APIResource $resource
374 - *
375 - * @return array
376 - */
377 - public static function extract_transaction_metadata( $resource ) {
378 - return [
379 - 'transaction_id' => sanitize_text_field( $resource->id ),
380 - 'paid' => (bool) $resource->is_paid,
381 - 'refunded' => (bool) $resource->is_refunded,
382 - 'amount' => sanitize_text_field( $resource->amount ),
383 - 'amount_refunded' => sanitize_text_field( $resource->amount_refunded ),
384 - '3ds' => (bool) $resource->is_3ds,
385 - 'live' => (bool) $resource->is_live,
386 - 'paid_at' => isset( $resource->hosted_payment->paid_at ) ? sanitize_text_field( $resource->hosted_payment->paid_at ) : sanitize_text_field( $resource->created_at ),
387 - 'card_last4' => sanitize_text_field( $resource->card->last4 ),
388 - 'card_exp_month' => sanitize_text_field( $resource->card->exp_month ),
389 - 'card_exp_year' => sanitize_text_field( $resource->card->exp_year ),
390 - 'card_brand' => sanitize_text_field( $resource->card->brand ),
391 - 'card_country' => sanitize_text_field( $resource->card->country ),
392 - ];
393 - }
388 + /**
389 + * Extract useful metadata from PayPlug response.
390 + *
391 + * @param APIResource $resource
392 + *
393 + * @return array
394 + */
395 + public static function extract_transaction_metadata($resource)
396 + {
397 + // For non-card payment methods (e.g. Oney), the API returns "card": null.
398 + // Accessing null->property throws \Error in PHP 8+, which is not caught by catch(\Exception).
399 + $card = (isset($resource->card) && $resource->card !== null) ? $resource->card : null;
394 400
395 - /**
396 - * @param \WC_Order $order
397 - *
398 - * @return array|bool
399 - * @author Clément Boirie
400 - */
401 - public static function get_transaction_metadata( $order ) {
401 + return [
402 + 'transaction_id' => sanitize_text_field($resource->id),
403 + 'paid' => (bool) $resource->is_paid,
404 + 'refunded' => (bool) $resource->is_refunded,
405 + 'amount' => sanitize_text_field($resource->amount),
406 + 'amount_refunded' => sanitize_text_field($resource->amount_refunded),
407 + '3ds' => (bool) $resource->is_3ds,
408 + 'live' => (bool) $resource->is_live,
409 + 'paid_at' => isset($resource->hosted_payment->paid_at) ? sanitize_text_field($resource->hosted_payment->paid_at) : sanitize_text_field($resource->created_at),
410 + 'card_last4' => $card !== null ? sanitize_text_field($card->last4) : '',
411 + 'card_exp_month' => $card !== null ? sanitize_text_field($card->exp_month) : '',
412 + 'card_exp_year' => $card !== null ? sanitize_text_field($card->exp_year) : '',
413 + 'card_brand' => $card !== null ? sanitize_text_field($card->brand) : '',
414 + 'card_country' => $card !== null ? sanitize_text_field($card->country) : '',
415 + ];
416 + }
402 417
403 - if ( PayplugWoocommerceHelper::is_pre_30() ) {
404 - return get_post_meta( $order->id, '_payplug_metadata', true );
405 - } else {
406 - return $order->get_meta( '_payplug_metadata', true );
407 - }
408 - }
418 + /**
419 + * @param \WC_Order $order
420 + *
421 + * @return array|bool
422 + *
423 + * @author Clément Boirie
424 + */
425 + public static function get_transaction_metadata($order)
426 + {
427 + if (self::is_pre_30()) {
428 + return get_post_meta($order->id, '_payplug_metadata', true);
429 + } else {
430 + return $order->get_meta('_payplug_metadata', true);
431 + }
432 + }
409 433
410 - /**
411 - * Save transaction metadata extracted from PayPlug response.
412 - *
413 - * @param \WC_Order $order
414 - * @param array $metadata
415 - *
416 - * @return void
417 - */
418 - public static function save_transaction_metadata( $order, $metadata ) {
434 + /**
435 + * Save transaction metadata extracted from PayPlug response.
436 + *
437 + * @param \WC_Order $order
438 + * @param array $metadata
439 + *
440 + * @return void
441 + */
442 + public static function save_transaction_metadata($order, $metadata): void
443 + {
444 + if (self::is_pre_30()) {
445 + update_post_meta($order->id, '_payplug_metadata', $metadata);
446 + } else {
447 + $order->add_meta_data('_payplug_metadata', $metadata, true);
448 + $order->save_meta_data();
449 + }
450 + }
419 451
420 - if ( PayplugWoocommerceHelper::is_pre_30() ) {
421 - update_post_meta( $order->id, '_payplug_metadata', $metadata );
422 - } else {
423 - $order->add_meta_data( '_payplug_metadata', $metadata, true );
452 + /**
453 + * Set flag ipn ( in progress / over ) on order
454 + *
455 + * @param \WC_Order $order
456 + * @param array $metadata
457 + * @param bool $flag
458 + *
459 + * @return void
460 + */
461 + public static function set_flag_ipn_order($order, $metadata, $flag): void
462 + {
463 + $metadata['transaction_in_progress'] = $flag;
464 + self::save_transaction_metadata($order, $metadata);
465 + }
424 466
425 - if ( is_callable( [ $order, 'save' ] ) ) {
426 - $order->save();
427 - }
428 - }
429 - }
467 + /**
468 + * Get transient key from payplug option
469 + *
470 + * @return string
471 + */
472 + public static function get_transient_key($options)
473 + {
474 + $transient_key = PayplugGateway::OPTION_NAME . (array_key_exists('mode', $options) && (bool) $options['mode'] ? '_live' : '_test');
475 +
476 + return $transient_key;
477 + }
478 +
479 + /**
480 + * Get transient live key from payplug option
481 + *
482 + * @return string
483 + */
484 + public static function get_live_transient_key()
485 + {
486 + return PayplugGateway::OPTION_NAME . '_live';
487 + }
488 +
489 + /**
490 + * Set transient data for payplug account
491 + *
492 + * @return string
493 + */
494 + public static function set_transient_data($data, $options = null)
495 + {
496 + $options = $options ? $options : self::get_payplug_options();
497 + $transient_key = self::get_transient_key($options);
498 + set_transient($transient_key, isset($data['httpResponse']) ? $data['httpResponse'] : []);
499 + }
500 +
501 + /**
502 + * Get current option from payplug settings
503 + *
504 + * @return array
505 + */
506 + public static function get_account_data_from_options()
507 + {
508 + $options = self::get_payplug_options();
509 + $transient_key = self::get_transient_key($options);
510 + $account = get_transient($transient_key);
511 +
512 + if (empty($account) || !is_array($account)) {
513 + self::set_account_data_from_options();
514 + $account = get_transient($transient_key);
515 + }
516 +
517 + return $account;
518 + }
519 +
520 + /**
521 + * Get current option from payplug settings
522 + *this should replace get_account_data_from_options
523 + *
524 + * @return array
525 + */
526 + public static function generic_get_account_data_from_options($gateway_id)
527 + {
528 + $options = self::get_payplug_options();
529 + $transient_key = self::get_transient_key($options);
530 + $account = get_transient($transient_key);
531 +
532 + //if transient is empty, it goes and get the permissions for the customer to populate it
533 + if (empty($account) || !is_array($account)) {
534 + self::set_account_data_from_options();
535 + $account = get_transient($transient_key);
536 + }
537 +
538 + if (!empty($account)) {
539 + $helper = new self();
540 + $configuration = $helper->get_service('configuration');
541 + $account['permissions']['payplug'] = $configuration->get_option('payment_methods.configuration.payplug.active');
542 + }
543 +
544 + return $account;
545 + }
546 +
547 + /**
548 + * Set current option from payplug settings and api call
549 + *
550 + * @return void
551 + */
552 + public static function set_account_data_from_options()
553 + {
554 + $helper = new self();
555 + $configuration = $helper->get_service('configuration');
556 + $options = $configuration->get_options();
557 +
558 + if (empty($options) || !isset($options['api_key']) || !isset($options['jwt'])) {
559 + return [];
560 + }
561 +
562 + // get_bearer_token() refreshes the JWT if it's close to expiry (OAuth2 accounts).
563 + $mode = (bool) $options['mode'] ? 'live' : 'test';
564 + $key = (string) $helper->get_api()->get_bearer_token($mode);
565 +
566 + if (empty($key)) {
567 + return [];
568 + }
569 +
570 + try {
571 + $parameters_account = Authentication::getAccount(new Payplug($key));
572 + self::set_transient_data($parameters_account, $options);
573 + } catch (\Payplug\Exception\UnauthorizedException $e) {
574 + self::exception_handler_400_logout($e->getCode(), __('payplug_enable_feature', 'payplug'), sprintf('Account request error from PayPlug API : %s <br><b> ' . __('Successfully logged out.', 'payplug') . '</b>', wc_print_r($e->getMessage(), true)));
575 + } catch (\Payplug\Exception\ConfigurationNotSetException $e) {
576 + } catch (\Payplug\Exception\ForbiddenException $e) {
577 + } catch (\Payplug\Exception\ForbiddenException $e) {
578 + return [];
579 + }
580 + }
581 +
582 + /**
583 + * Check if oney is available with current settings
584 + *
585 + * @return bool
586 + */
587 + public static function is_oney_available()
588 + {
589 + $account = self::get_account_data_from_options();
590 + if (!$account) {
591 + return false;
592 + }
593 +
594 + $options = self::get_payplug_options();
595 + $oney_active = (bool) $options['payment_methods']['configuration']['oney']['active'];
596 +
597 + return $account && $account['permissions'][PayplugPermissions::USE_ONEY] == '1' && $oney_active;
598 + }
599 +
600 + /**
601 + * Hide popup for if country_code != payplug country
602 + * https://payplug-prod.atlassian.net/browse/WOOC-249
603 + *
604 + * @return bool
605 + */
606 + public static function show_oney_popup()
607 + {
608 + $account = self::get_account_data_from_options();
609 + if ($account && $account['permissions'][PayplugPermissions::USE_ONEY] == true && $account['country'] == self::getISOCountryCode()) {
610 + return true;
611 + }
612 +
613 + return false;
614 + }
615 +
616 + /**
617 + * @return bool
618 + */
619 + public static function check_order_max_amount($order_total)
620 + {
621 + if ($order_total < PayplugGatewayOney3x::MIN_AMOUNT || $order_total > PayplugGatewayOney3x::MAX_AMOUNT) {
622 + return false;
623 + }
624 +
625 + return true;
626 + }
627 +
628 + /**
629 + * Load translations from plugin languages folder.
630 + *
631 + * @param string $plugin_rel_path
632 + *
633 + * @return bool
634 + */
635 + public static function load_plugin_textdomain($plugin_rel_path)
636 + {
637 + $domain = 'payplug';
638 +
639 + $locale = apply_filters('plugin_locale', is_admin() ? get_user_locale() : get_locale(), $domain);
640 +
641 + $mofile = $domain . '-' . $locale . '.mo';
642 +
643 + $path = WP_PLUGIN_DIR . '/' . trim($plugin_rel_path, '/');
644 +
645 + return load_textdomain($domain, $path . '/' . $mofile);
646 + }
647 +
648 + public static function getISOCountryCode()
649 + {
650 + preg_match('([a-z-]+)', get_locale(), $country);
651 +
652 + return strtoupper($country[0]);
653 + }
654 +
655 + /**
656 + * Get country of the payplug merchant account and save it to the database
657 + *
658 + * @return string payplug merchant account country
659 + */
660 + public static function get_payplug_merchant_country()
661 + {
662 + $data = self::get_payplug_options();
663 +
664 + //in order to reduce the getAccount calls
665 + if (isset($data['payplug_live_key'])) {
666 + if (!isset($data['payplug_merchant_country'])) {
667 + return self::UpdateCountryOption($data);
668 + }
669 +
670 + return $data['payplug_merchant_country'];
671 + }
672 +
673 + $country = wc_get_base_location();
674 +
675 + return $country['country'];
676 + }
677 +
678 + /**
679 + * Update payplug options and return the country
680 + *
681 + * @param $options
682 + *
683 + * @throws \Payplug\Exception\ConfigurationException
684 + *
685 + * @return string
686 + */
687 + public static function UpdateCountryOption($options)
688 + {
689 + if (!isset($options['api_key'])) {
690 + $options['company_iso'] = 'FR';
691 +
692 + return $options['company_iso'];
693 + }
694 +
695 + try {
696 + $api_key = json_decode($options['api_key'], true);
697 +
698 + //fail safe for non activated account
699 + if ((isset($options['mode'])) && $api_key['test']) {
700 + $key = $options['mode'] && !empty($api_key['live']) ? $api_key['live'] : $api_key['test'];
701 + }
702 +
703 + if (empty($api_key['live'])) {
704 + $options['mode'] = false;
705 + }
706 +
707 + if (isset($key) && !empty($key)) {
708 + $response = self::get_account_data_from_options();
709 + }
710 +
711 + if (isset($response['httpResponse']['country'])) {
712 + $options['company_iso'] = $response['httpResponse']['country'];
713 + update_option('woocommerce_payplug_settings', apply_filters('woocommerce_settings_api_sanitized_fields_payplug', $options));
714 + } else {
715 +
716 + //default value for merchant country
717 + $options['company_iso'] = 'FR';
718 + }
719 + } catch (ForbiddenException $e) {
720 + PayplugGateway::log('Error while getting account : ' . $e->getMessage(), 'error');
721 + \WC_Admin_Settings::add_error($e->getMessage());
722 + $options['company_iso'] = 'FR';
723 + }
724 +
725 + return $options['company_iso'];
726 + }
727 +
728 + public static function get_live_key()
729 + {
730 + // get_bearer_token() refreshes the JWT if it's close to expiry (OAuth2 accounts).
731 + return (new self())->get_api()->get_bearer_token('live');
732 + }
733 +
734 + public static function get_test_key()
735 + {
736 + return (new self())->get_api()->get_bearer_token('test');
737 + }
738 +
739 + public static function check_mode()
740 + {
741 + return self::get_payplug_options()['mode'];
742 + }
743 +
744 + /**
745 + * Domain the Integrated Payment SDK should submit card-tokenization requests to. Depends
746 + * on whether the connected merchant account is QA or production, which is a build-time
747 + * distinction (see SECURE_DOMAIN in payplug-config.php), not something this can derive
748 + * from the Test/Live mode toggle at runtime.
749 + *
750 + * @return string
751 + */
752 + public static function get_secure_domain(): string
753 + {
754 + return SECURE_DOMAIN;
755 + }
756 +
757 + /**
758 + * URL of the official Oney widget loader script. Depends on whether the connected
759 + * merchant account is QA or production, which is a build-time distinction (see
760 + * ONEY_LOADER_URL in payplug-config.php), not something this can derive from the
761 + * Test/Live mode toggle at runtime.
762 + *
763 + * @return string
764 + */
765 + public static function get_oney_loader_url(): string
766 + {
767 + return ONEY_LOADER_URL;
768 + }
769 +
770 + public static function payplug_logout(): void
771 + {
772 + $helper = new self();
773 + $helper->get_service('configuration')->clean_option();
774 + set_transient(self::get_transient_key(self::get_payplug_options()), null);
775 + }
776 +
777 + public static function plugin_deactivation(): void
778 + {
779 + $option_name = 'woocommerce_payplug_settings';
780 + delete_option($option_name);
781 + // for site options in Multisite
782 + delete_site_option($option_name);
783 + \Payplug\PayplugWoocommerce\Model\Lock::delete_lock_table();
784 + }
785 +
786 + public static function available_shipping_methods($carriers = [])
787 + {
788 + // Build enabled shipping methods based on active Zone
789 + $enabled_method_types = [];
790 +
791 + if (class_exists('\\WC_Shipping_Zones')) {
792 + // Regular zones
793 + $zones = \WC_Shipping_Zones::get_zones();
794 + foreach ($zones as $zone) {
795 + $methods = isset($zone['shipping_methods']) ? $zone['shipping_methods'] : [];
796 + foreach ($methods as $m) {
797 + if (!empty($m->enabled)) {
798 + $enabled_method_types[$m->id] = true;
799 + }
800 + }
801 + }
802 +
803 + // Locations not covered by zones (zone 0)
804 + $defaultZone = new \WC_Shipping_Zone(0);
805 + foreach ($defaultZone->get_shipping_methods(true) as $m) {
806 + if (!empty($m->enabled)) {
807 + $enabled_method_types[$m->id] = true;
808 + }
809 + }
810 + }
811 +
812 + $shippings = WC()->shipping()->get_shipping_methods();
813 + $shippings_methods = [];
814 +
815 + foreach ($shippings as $shipping) {
816 + // Only keep shipping method types that are currently enabled in at least one zone
817 + if (!isset($enabled_method_types[$shipping->id])) {
818 + continue;
819 + }
820 + $shippings_methods[] = [
821 + 'id_carrier' => $shipping->id,
822 + 'name' => $shipping->method_title,
823 + 'checked' => in_array($shipping->id, $carriers, true),
824 + ];
825 + }
826 +
827 + return $shippings_methods;
828 + }
829 +
830 + public static function get_payplug_options()
831 + {
832 + $helper = new self();
833 +
834 + return $helper->get_service('configuration')->get_options();
835 + }
836 +
837 + public static function get_applepay_options()
838 + {
839 + $options = self::get_payplug_options();
840 + $applepay_configuration = $options['payment_methods']['configuration']['apple_pay'];
841 + $applepay_display = json_decode($applepay_configuration['display'], true);
842 + $applepay = [
843 + 'enabled' => (bool) $applepay_configuration['active'],
844 + 'checkout' => (bool) $applepay_display['checkout'],
845 + 'cart' => (bool) $applepay_display['cart'],
846 + 'carriers' => json_decode($applepay_configuration['carriers'], true),
847 + ];
848 +
849 + return $applepay;
850 + }
851 +
852 + public static function is_checkout_block()
853 + {
854 + return WC_Blocks_Utils::has_block_in_page(wc_get_page_id('checkout'), 'woocommerce/checkout');
855 + }
856 +
857 + public static function is_cart_block()
858 + {
859 + return WC_Blocks_Utils::has_block_in_page(wc_get_page_id('cart'), 'woocommerce/cart');
860 + }
861 +
862 + public static function is_product_block()
863 + {
864 + return WC_Blocks_Utils::has_block_in_page(wc_get_page_id('product'), 'woocommerce/product');
865 + }
866 +
867 + /**
868 + * Checks if subscriptions are enabled on the site.
869 + *
870 + * @return bool Whether subscriptions is enabled or not.
871 + *
872 + * @since 5.6.0
873 + */
874 + public static function is_subscriptions_enabled()
875 + {
876 + return class_exists('WC_Subscriptions') && class_exists('WC_Subscription') && version_compare(WC_Subscriptions::$version, '2.2.0', '>=');
877 + }
878 +
879 + /**
880 + * Cart has any subscriptions
881 + *
882 + * @return bool
883 + */
884 + public static function is_subscription()
885 + {
886 + if (is_null(WC()->cart)) {
887 + wc_load_cart();
888 + WC()->cart->get_cart_from_session();
889 + }
890 +
891 + if (empty(WC()->cart) || empty(WC()->cart->get_cart())) {
892 + return false;
893 + }
894 +
895 + foreach (WC()->cart->get_cart() as $prod) {
896 + if (empty($prod['product_id'])) {
897 + return false;
898 + }
899 +
900 + $pid = $prod['product_id'];
901 + $product = wc_get_product($pid);
902 +
903 + if ($product->is_type('subscription')) {
904 + return true;
905 + }
906 + }
907 +
908 + return false;
909 + }
910 +
911 + /**
912 + * Handling 400 errors from API (get_account, get_permissions) and return JSON rest response
913 + *
914 + * @param $title
915 + * @param $msg
916 + *
917 + * @return false
918 + */
919 + public static function exception_handler_400_logout($error_code, $title, $msg)
920 + {
921 + if (!empty($error_code) && ($error_code === 401 || $error_code === 403)) {
922 + self::payplug_logout();
923 + wp_send_json_error([
924 + 'title' => $title,
925 + 'msg' => $msg,
926 + 'close' => __('payplug_ok', 'payplug'),
927 + ]);
928 + }
929 +
930 + return false;
931 + }
430 932 }