PluginProbe
PayPlug for WooCommerce (Official) / 2.18.0
PayPlug for WooCommerce (Official) v2.18.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 1.2.6 All 101 releases
payplug / src / PayplugWoocommerceHelper.php

PayplugWoocommerceHelper.php in PayPlug for WooCommerce (Official) 2.18.0, at src/PayplugWoocommerceHelper.php

969 lines 25.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace Payplug\PayplugWoocommerce;
4
5 // Exit if accessed directly
6 if (!defined('ABSPATH')) {
7 exit;
8 }
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;
17 use Payplug\Resource\APIResource;
18 use WC_Blocks_Utils;
19 use WC_Subscriptions;
20
21 /**
22 * Helper class.
23 */
24 class PayplugWoocommerceHelper
25 {
26 use ServiceGetter;
27
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'];
36
37 return version_compare($wc->version, '3.0.0', '<');
38 }
39
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');
49
50 return admin_url('admin.php?page=wc-settings&tab=checkout&section=' . $section_slug);
51 }
52
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 }
316
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 }
332
333 return in_array(strtoupper($country), self::get_supported_countries());
334 }
335
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();
344
345 return (self::is_country_supported($country)) ? strtoupper($country) : 'FR';
346 }
347
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 }
359
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 }
371
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 }
384
385 return absint(wc_format_decimal(((float) $amount * 100), wc_get_price_decimals()));
386 }
387
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;
400
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 }
417
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 }
433
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)
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 }
451
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)
462 {
463 $metadata['transaction_in_progress'] = $flag;
464 self::save_transaction_metadata($order, $metadata);
465 }
466
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 $api_key = json_decode($options['api_key'], true);
563 $jwt = json_decode($options['jwt'], true);
564
565 $test_key = !empty($api_key['test']) ? $api_key['test'] : '';
566 $live_key = !empty($api_key['live']) ? $api_key['live'] : '';
567
568 if (empty($test_key) && isset($jwt['test']['access_token'])) {
569 $test_key = $jwt['test']['access_token'];
570 }
571 if (empty($live_key) && isset($jwt['live']['access_token'])) {
572 $live_key = $jwt['live']['access_token'];
573 }
574 if (empty($test_key) && empty($live_key)) {
575 return [];
576 }
577
578 if ((bool) $options['mode'] && empty($live_key)) {
579 return [];
580 }
581
582 if (!(bool) $options['mode'] && empty($test_key)) {
583 return [];
584 }
585
586 try {
587 $parameters_account = Authentication::getAccount(new Payplug((bool) $options['mode'] ? $live_key : $test_key));
588 self::set_transient_data($parameters_account, $options);
589 } catch (\Payplug\Exception\UnauthorizedException $e) {
590 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)));
591 } catch (\Payplug\Exception\ConfigurationNotSetException $e) {
592 } catch (\Payplug\Exception\ForbiddenException $e) {
593 } catch (\Payplug\Exception\ForbiddenException $e) {
594 return [];
595 }
596 }
597
598 /**
599 * Get min and max for oney payment
600 *
601 * @return array
602 */
603 public static function get_min_max_oney()
604 {
605 $account = self::get_account_data_from_options();
606 if (!$account) {
607 return [];
608 }
609
610 return [
611 'min' => floatval($account['configuration']['oney']['min_amounts']['EUR']) / 100,
612 'max' => floatval($account['configuration']['oney']['max_amounts']['EUR']) / 100,
613 ];
614 }
615
616 /**
617 * Check if oney is available with current settings
618 *
619 * @return bool
620 */
621 public static function is_oney_available()
622 {
623 $account = self::get_account_data_from_options();
624 if (!$account) {
625 return false;
626 }
627
628 $options = self::get_payplug_options();
629 $oney_active = (bool) $options['payment_methods']['configuration']['oney']['active'];
630
631 return $account && $account['permissions'][PayplugPermissions::USE_ONEY] == '1' && $oney_active;
632 }
633
634 /**
635 * Hide popup for if country_code != payplug country
636 * https://payplug-prod.atlassian.net/browse/WOOC-249
637 *
638 * @return bool
639 */
640 public static function show_oney_popup()
641 {
642 $account = self::get_account_data_from_options();
643 if ($account && $account['permissions'][PayplugPermissions::USE_ONEY] == true && $account['country'] == self::getISOCountryCode()) {
644 return true;
645 }
646
647 return false;
648 }
649
650 /**
651 * @return bool
652 */
653 public static function check_order_max_amount($order_total)
654 {
655 if ($order_total < PayplugGatewayOney3x::MIN_AMOUNT || $order_total > PayplugGatewayOney3x::MAX_AMOUNT) {
656 return false;
657 }
658
659 return true;
660 }
661
662 /**
663 * Load translations from plugin languages folder.
664 *
665 * @param string $plugin_rel_path
666 *
667 * @return bool
668 */
669 public static function load_plugin_textdomain($plugin_rel_path)
670 {
671 $domain = 'payplug';
672
673 $locale = apply_filters('plugin_locale', is_admin() ? get_user_locale() : get_locale(), $domain);
674
675 $mofile = $domain . '-' . $locale . '.mo';
676
677 $path = WP_PLUGIN_DIR . '/' . trim($plugin_rel_path, '/');
678
679 return load_textdomain($domain, $path . '/' . $mofile);
680 }
681
682 /**
683 * Check and update value for oney simulation
684 *
685 * @return void
686 */
687 public static function oney_simulation_values($keys_array, &$array)
688 {
689 foreach ($keys_array as $key) {
690 if (array_key_exists($key, $array)) {
691 $array[$key]['down_payment_amount'] = floatval($array[$key]['down_payment_amount']) / 100;
692 foreach ($array[$key]['installments'] as $k => $value) {
693 $array[$key]['installments'][$k]['amount'] = floatval($value['amount']) / 100;
694 }
695 }
696 }
697 }
698
699 public static function getISOCountryCode()
700 {
701 preg_match('([a-z-]+)', get_locale(), $country);
702
703 return strtoupper($country[0]);
704 }
705
706 /**
707 * Get country of the payplug merchant account and save it to the database
708 *
709 * @return string payplug merchant account country
710 */
711 public static function get_payplug_merchant_country()
712 {
713 $data = self::get_payplug_options();
714
715 //in order to reduce the getAccount calls
716 if (isset($data['payplug_live_key'])) {
717 if (!isset($data['payplug_merchant_country'])) {
718 return self::UpdateCountryOption($data);
719 }
720
721 return $data['payplug_merchant_country'];
722 }
723
724 $country = wc_get_base_location();
725
726 return $country['country'];
727 }
728
729 /**
730 * Update payplug options and return the country
731 *
732 * @param $options
733 *
734 * @throws \Payplug\Exception\ConfigurationException
735 *
736 * @return string
737 */
738 public static function UpdateCountryOption($options)
739 {
740 if (!isset($options['api_key'])) {
741 $options['company_iso'] = 'FR';
742
743 return $options['company_iso'];
744 }
745
746 try {
747 $api_key = json_decode($options['api_key'], true);
748
749 //fail safe for non activated account
750 if ((isset($options['mode'])) && $api_key['test']) {
751 $key = $options['mode'] && !empty($api_key['live']) ? $api_key['live'] : $api_key['test'];
752 }
753
754 if (empty($api_key['live'])) {
755 $options['mode'] = false;
756 }
757
758 if (isset($key) && !empty($key)) {
759 $response = self::get_account_data_from_options();
760 }
761
762 if (isset($response['httpResponse']['country'])) {
763 $options['company_iso'] = $response['httpResponse']['country'];
764 update_option('woocommerce_payplug_settings', apply_filters('woocommerce_settings_api_sanitized_fields_payplug', $options));
765 } else {
766
767 //default value for merchant country
768 $options['company_iso'] = 'FR';
769 }
770 } catch (ForbiddenException $e) {
771 PayplugGateway::log('Error while getting account : ' . $e->getMessage(), 'error');
772 \WC_Admin_Settings::add_error($e->getMessage());
773 $options['company_iso'] = 'FR';
774 }
775
776 return $options['company_iso'];
777 }
778
779 public static function get_live_key()
780 {
781 $options = self::get_payplug_options();
782 $jwt = json_decode($options['jwt'], true);
783 $api_key = json_decode($options['api_key'], true);
784
785 return isset($jwt['live']) && isset($jwt['live']['access_token'])
786 ? $jwt['live']['access_token']
787 : $api_key['live'];
788 }
789
790 public static function get_test_key()
791 {
792 $options = self::get_payplug_options();
793 $jwt = json_decode($options['jwt'], true);
794 $api_key = json_decode($options['api_key'], true);
795
796 return isset($jwt['test']) && isset($jwt['test']['access_token'])
797 ? $jwt['test']['access_token']
798 : $api_key['test'];
799 }
800
801 public static function check_mode()
802 {
803 return self::get_payplug_options()['mode'];
804 }
805
806 public static function payplug_logout()
807 {
808 $helper = new self();
809 $helper->get_service('configuration')->clean_option();
810 set_transient(self::get_transient_key(self::get_payplug_options()), null);
811 }
812
813 public static function plugin_deactivation()
814 {
815 $option_name = 'woocommerce_payplug_settings';
816 delete_option($option_name);
817 // for site options in Multisite
818 delete_site_option($option_name);
819 \Payplug\PayplugWoocommerce\Model\Lock::delete_lock_table();
820 }
821
822 public static function available_shipping_methods($carriers = [])
823 {
824 // Build enabled shipping methods based on active Zone
825 $enabled_method_types = [];
826
827 if (class_exists('\\WC_Shipping_Zones')) {
828 // Regular zones
829 $zones = \WC_Shipping_Zones::get_zones();
830 foreach ($zones as $zone) {
831 $methods = isset($zone['shipping_methods']) ? $zone['shipping_methods'] : [];
832 foreach ($methods as $m) {
833 if (!empty($m->enabled)) {
834 $enabled_method_types[$m->id] = true;
835 }
836 }
837 }
838
839 // Locations not covered by zones (zone 0)
840 $defaultZone = new \WC_Shipping_Zone(0);
841 foreach ($defaultZone->get_shipping_methods(true) as $m) {
842 if (!empty($m->enabled)) {
843 $enabled_method_types[$m->id] = true;
844 }
845 }
846 }
847
848 $shippings = WC()->shipping()->get_shipping_methods();
849 $shippings_methods = [];
850
851 foreach ($shippings as $shipping) {
852 // Only keep shipping method types that are currently enabled in at least one zone
853 if (!isset($enabled_method_types[$shipping->id])) {
854 continue;
855 }
856 $shippings_methods[] = [
857 'id_carrier' => $shipping->id,
858 'name' => $shipping->method_title,
859 'checked' => in_array($shipping->id, $carriers, true),
860 ];
861 }
862
863 return $shippings_methods;
864 }
865
866 public static function get_payplug_options()
867 {
868 $helper = new self();
869
870 return $helper->get_service('configuration')->get_options();
871 }
872
873 public static function get_applepay_options()
874 {
875 $options = self::get_payplug_options();
876 $applepay_configuration = $options['payment_methods']['configuration']['apple_pay'];
877 $applepay_display = json_decode($applepay_configuration['display'], true);
878 $applepay = [
879 'enabled' => (bool) $applepay_configuration['active'],
880 'checkout' => (bool) $applepay_display['checkout'],
881 'cart' => (bool) $applepay_display['cart'],
882 'carriers' => json_decode($applepay_configuration['carriers'], true),
883 ];
884
885 return $applepay;
886 }
887
888 public static function is_checkout_block()
889 {
890 return WC_Blocks_Utils::has_block_in_page(wc_get_page_id('checkout'), 'woocommerce/checkout');
891 }
892
893 public static function is_cart_block()
894 {
895 return WC_Blocks_Utils::has_block_in_page(wc_get_page_id('cart'), 'woocommerce/cart');
896 }
897
898 public static function is_product_block()
899 {
900 return WC_Blocks_Utils::has_block_in_page(wc_get_page_id('product'), 'woocommerce/product');
901 }
902
903 /**
904 * Checks if subscriptions are enabled on the site.
905 *
906 * @return bool Whether subscriptions is enabled or not.
907 *
908 * @since 5.6.0
909 */
910 public static function is_subscriptions_enabled()
911 {
912 return class_exists('WC_Subscriptions') && class_exists('WC_Subscription') && version_compare(WC_Subscriptions::$version, '2.2.0', '>=');
913 }
914
915 /**
916 * Cart has any subscriptions
917 *
918 * @return bool
919 */
920 public static function is_subscription()
921 {
922 if (is_null(WC()->cart)) {
923 wc_load_cart();
924 WC()->cart->get_cart_from_session();
925 }
926
927 if (empty(WC()->cart) || empty(WC()->cart->get_cart())) {
928 return false;
929 }
930
931 foreach (WC()->cart->get_cart() as $prod) {
932 if (empty($prod['product_id'])) {
933 return false;
934 }
935
936 $pid = $prod['product_id'];
937 $product = wc_get_product($pid);
938
939 if ($product->is_type('subscription')) {
940 return true;
941 }
942 }
943
944 return false;
945 }
946
947 /**
948 * Handling 400 errors from API (get_account, get_permissions) and return JSON rest response
949 *
950 * @param $title
951 * @param $msg
952 *
953 * @return false
954 */
955 public static function exception_handler_400_logout($error_code, $title, $msg)
956 {
957 if (!empty($error_code) && ($error_code === 401 || $error_code === 403)) {
958 self::payplug_logout();
959 wp_send_json_error([
960 'title' => $title,
961 'msg' => $msg,
962 'close' => __('payplug_ok', 'payplug'),
963 ]);
964 }
965
966 return false;
967 }
968 }
969