PluginProbe
PayPlug for WooCommerce (Official) / 2.5.2
PayPlug for WooCommerce (Official) v2.5.2
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.5.2, at src/PayplugWoocommerceHelper.php

776 lines 16.5 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\Exception\ForbiddenException;
11 use Payplug\PayplugWoocommerce\Gateway\PayplugGateway;
12 use Payplug\Resource\APIResource;
13 use Payplug\Payplug;
14 use Payplug\Authentication;
15 use Payplug\PayplugWoocommerce\Gateway\PayplugGatewayOney3x;
16 use Payplug\PayplugWoocommerce\Gateway\PayplugPermissions;
17
18 /**
19 * Helper class.
20 *
21 * @package Payplug\PayplugWoocommerce
22 */
23 class PayplugWoocommerceHelper {
24
25 /**
26 * Check if current WooCommerce version is below 3.0.0
27 *
28 * @return bool
29 */
30 public static function is_pre_30() {
31 $wc = function_exists( 'WC' ) ? WC() : $GLOBALS['woocommerce'];
32
33 return version_compare( $wc->version, '3.0.0', '<' );
34 }
35
36 /**
37 * Get a URL to the PayPlug gateway settings page.
38 *
39 * @return string
40 */
41 public static function get_setting_link() {
42 $use_id_as_section = function_exists( 'WC' ) ? version_compare( WC()->version, '2.6', '>=' ) : false;
43 $section_slug = $use_id_as_section ? 'payplug' : strtolower( 'PayplugGateway' );
44
45 return admin_url( 'admin.php?page=wc-settings&tab=checkout&section=' . $section_slug );
46 }
47
48 /**
49 * Get all country code supported by PayPlug.
50 *
51 * Those are ISO 3166-1 alpha-2. You can find more information on https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2
52 *
53 * @return array
54 */
55 public static function get_supported_countries() {
56 return [
57 'AD',
58 'AO',
59 'AX',
60 'BG',
61 'BO',
62 'BY',
63 'CH',
64 'CR',
65 'DE',
66 'EE',
67 'FI',
68 'GB',
69 'GL',
70 'GT',
71 'HR',
72 'IN',
73 'JM',
74 'KM',
75 'KZ',
76 'LS',
77 'MD',
78 'MM',
79 'MT',
80 'NA',
81 'NO',
82 'PE',
83 'PN',
84 'RE',
85 'SC',
86 'SK',
87 'ST',
88 'TF',
89 'TN',
90 'UA',
91 'VC',
92 'WS',
93 'AE',
94 'AQ',
95 'AZ',
96 'BH',
97 'BQ',
98 'BZ',
99 'CI',
100 'CU',
101 'DJ',
102 'EG',
103 'FJ',
104 'GD',
105 'GM',
106 'GU',
107 'HT',
108 'IO',
109 'JO',
110 'KN',
111 'LA',
112 'LT',
113 'ME',
114 'MN',
115 'MU',
116 'NC',
117 'NP',
118 'PF',
119 'PR',
120 'RO',
121 'SD',
122 'SL',
123 'SV',
124 'TG',
125 'TO',
126 'UG',
127 'VE',
128 'YE',
129 'AM',
130 'AW',
131 'BF',
132 'BN',
133 'BW',
134 'CG',
135 'CO',
136 'AF',
137 'CZ',
138 'EC',
139 'EU',
140 'GA',
141 'GI',
142 'GS',
143 'HN',
144 'IM',
145 'JE',
146 'KI',
147 'KY',
148 'LR',
149 'MC',
150 'ML',
151 'MS',
152 'MZ',
153 'NL',
154 'PA',
155 'PM',
156 'QA',
157 'SB',
158 'SJ',
159 'SS',
160 'TD',
161 'TM',
162 'TZ',
163 'VA',
164 'WF',
165 'AR',
166 'BA',
167 'BI',
168 'BR',
169 'CA',
170 'CK',
171 'CV',
172 'DK',
173 'EH',
174 'FK',
175 'GE',
176 'GN',
177 'GW',
178 'HU',
179 'IQ',
180 'JP',
181 'KP',
182 'LB',
183 'LU',
184 'MF',
185 'MO',
186 'MV',
187 'NE',
188 'NR',
189 'PG',
190 'PS',
191 'RS',
192 'SE',
193 'SM',
194 'SX',
195 'TH',
196 'TR',
197 'UM',
198 'VG',
199 'YT',
200 'AL',
201 'AU',
202 'BE',
203 'BM',
204 'BV',
205 'CF',
206 'CN',
207 'CY',
208 'DZ',
209 'ET',
210 'FR',
211 'GH',
212 'GR',
213 'HM',
214 'IL',
215 'IT',
216 'KH',
217 'KW',
218 'LK',
219 'MA',
220 'MK',
221 'MR',
222 'MY',
223 'NI',
224 'OM',
225 'PL',
226 'PY',
227 'SA',
228 'SI',
229 'SR',
230 'TC',
231 'TL',
232 'TW',
233 'UZ',
234 'VU',
235 'ZW',
236 'AI',
237 'AT',
238 'BD',
239 'BL',
240 'BT',
241 'CD',
242 'CM',
243 'CX',
244 'DO',
245 'ES',
246 'FO',
247 'GG',
248 'GQ',
249 'HK',
250 'IE',
251 'IS',
252 'KG',
253 'KS',
254 'LI',
255 'LY',
256 'MH',
257 'MQ',
258 'MX',
259 'NG',
260 'NZ',
261 'PK',
262 'PW',
263 'RW',
264 'SH',
265 'SO',
266 'SZ',
267 'TK',
268 'TV',
269 'UY',
270 'VN',
271 'ZM',
272 'AG',
273 'AS',
274 'BB',
275 'BJ',
276 'BS',
277 'CC',
278 'CL',
279 'CW',
280 'DM',
281 'ER',
282 'FM',
283 'GF',
284 'GP',
285 'GY',
286 'ID',
287 'IR',
288 'KE',
289 'KR',
290 'LC',
291 'LV',
292 'MG',
293 'MP',
294 'MW',
295 'NF',
296 'NU',
297 'PH',
298 'PT',
299 'RU',
300 'SG',
301 'SN',
302 'SY',
303 'TJ',
304 'TT',
305 'US',
306 'VI',
307 'ZA'
308 ];
309 }
310
311 /**
312 * Ensure country code is supported by PayPlug.
313 *
314 * @param string $country The ISO 3166-1 alpha-2 code for the country
315 *
316 * @return bool
317 * @author Clément Boirie
318 */
319 public static function is_country_supported( $country ) {
320 $country = trim( $country );
321 if ( empty( $country ) ) {
322 return false;
323 }
324
325 return in_array( strtoupper( $country ), self::get_supported_countries() );
326 }
327
328 /**
329 * Get default country.
330 *
331 * @return string
332 */
333 public static function get_default_country() {
334 $country = \WC()->countries->get_base_country();
335
336 return ( self::is_country_supported( $country ) ) ? strtoupper( $country ) : 'FR';
337 }
338
339 /**
340 * Get minimum amount allowed by PayPlug.
341 *
342 * This amount is in cents.
343 *
344 * @return int
345 */
346 public static function get_minimum_amount() {
347 return 99;
348 }
349
350 /**
351 * Get maximum amount allowed by PayPlug.
352 *
353 * This amount is in cents.
354 *
355 * @return int
356 */
357 public static function get_maximum_amount() {
358 return 2000000;
359 }
360
361 /**
362 * Convert amount in cents.
363 *
364 * @param float $amount
365 *
366 * @return int
367 */
368 public static function get_payplug_amount( $amount ) {
369 if ( is_null( $amount ) ) {
370 return $amount;
371 }
372
373 return absint( wc_format_decimal( ( (float) $amount * 100 ), wc_get_price_decimals() ) );
374 }
375
376 /**
377 * Extract useful metadata from PayPlug response.
378 *
379 * @param APIResource $resource
380 *
381 * @return array
382 */
383 public static function extract_transaction_metadata( $resource ) {
384 return [
385 'transaction_id' => sanitize_text_field( $resource->id ),
386 'paid' => (bool) $resource->is_paid,
387 'refunded' => (bool) $resource->is_refunded,
388 'amount' => sanitize_text_field( $resource->amount ),
389 'amount_refunded' => sanitize_text_field( $resource->amount_refunded ),
390 '3ds' => (bool) $resource->is_3ds,
391 'live' => (bool) $resource->is_live,
392 'paid_at' => isset( $resource->hosted_payment->paid_at ) ? sanitize_text_field( $resource->hosted_payment->paid_at ) : sanitize_text_field( $resource->created_at ),
393 'card_last4' => sanitize_text_field( $resource->card->last4 ),
394 'card_exp_month' => sanitize_text_field( $resource->card->exp_month ),
395 'card_exp_year' => sanitize_text_field( $resource->card->exp_year ),
396 'card_brand' => sanitize_text_field( $resource->card->brand ),
397 'card_country' => sanitize_text_field( $resource->card->country ),
398 ];
399 }
400
401 /**
402 * @param \WC_Order $order
403 *
404 * @return array|bool
405 * @author Clément Boirie
406 */
407 public static function get_transaction_metadata( $order ) {
408
409 if ( PayplugWoocommerceHelper::is_pre_30() ) {
410 return get_post_meta( $order->id, '_payplug_metadata', true );
411 } else {
412 return $order->get_meta( '_payplug_metadata', true );
413 }
414 }
415
416 /**
417 * Save transaction metadata extracted from PayPlug response.
418 *
419 * @param \WC_Order $order
420 * @param array $metadata
421 *
422 * @return void
423 */
424 public static function save_transaction_metadata( $order, $metadata ) {
425
426 if ( PayplugWoocommerceHelper::is_pre_30() ) {
427 update_post_meta( $order->id, '_payplug_metadata', $metadata );
428 } else {
429 $order->add_meta_data( '_payplug_metadata', $metadata, true );
430
431 if ( is_callable( [ $order, 'save' ] ) ) {
432 $order->save();
433 }
434 }
435 }
436
437 /**
438 * Set flag ipn ( in progress / over ) on order
439 *
440 * @param \WC_Order $order
441 * @param array $metadata
442 * @param boolean $flag
443 *
444 * @return void
445 */
446 public static function set_flag_ipn_order ( $order, $metadata, $flag) {
447 $metadata['transaction_in_progress'] = $flag;
448 PayplugWoocommerceHelper::save_transaction_metadata($order, $metadata);
449 }
450
451 /**
452 * Get transient key from payplug option
453 *
454 * @return string
455 */
456 public static function get_transient_key($options)
457 {
458 $transient_key = PayplugGateway::OPTION_NAME . (array_key_exists('mode', $options) && $options['mode'] === 'yes' ? "_live" : "_test");
459 return $transient_key;
460 }
461
462
463 /**
464 * Get transient live key from payplug option
465 *
466 * @return string
467 */
468 public static function get_live_transient_key()
469 {
470 return PayplugGateway::OPTION_NAME . "_live";
471 }
472
473 /**
474 * Set transient data for payplug account
475 *
476 * @return string
477 */
478 public static function set_transient_data($data, $options = null)
479 {
480 $options = $options ? $options : get_option('woocommerce_payplug_settings', []);
481 $transient_key = PayplugWoocommerceHelper::get_transient_key($options);
482 set_transient($transient_key, isset($data['httpResponse']) ? $data['httpResponse'] : []);
483 }
484
485 /**
486 * Get current option from payplug settings
487 *
488 * @return array
489 */
490 public static function get_account_data_from_options()
491 {
492 $options = get_option('woocommerce_payplug_settings', []);
493 $transient_key = self::get_transient_key($options);
494 $account = get_transient($transient_key);
495 if (is_array($account)) {
496 $account['oneyEnabled'] = (isset($options['oney']) && !empty($options['oney'])) ? $options['oney'] : '';
497 $account['bancontact'] = !empty($options['bancontact']) ? $options['bancontact'] : '';
498 $account['american_express'] = !empty($options['american_express']) ? $options['american_express'] : '';
499 $apple_pay_enabled = !empty($options['apple_pay']) ? $options['apple_pay'] : '';
500
501 if( !isset($account['payment_methods']['apple_pay']) )
502 $account['payment_methods']['apple_pay'] = [ 'enabled' => false ];
503
504 if ($account['payment_methods']['apple_pay']['enabled']) {
505 if ($apple_pay_enabled == "yes" && in_array(strtr(get_site_url(), array("http://" => "", "https://" => "")), $account['payment_methods']['apple_pay']['allowed_domain_names'])) {
506 $account['apple_pay'] = "yes";
507 } else {
508 $account['apple_pay'] = "no";
509 $options['apple_pay'] = "no";
510 update_option( 'woocommerce_payplug_settings', apply_filters('woocommerce_settings_api_sanitized_fields_payplug', $options) );
511 }
512
513 } else {
514 $account['apple_pay'] = "no";
515 $options['apple_pay'] = "no";
516 update_option( 'woocommerce_payplug_settings', apply_filters('woocommerce_settings_api_sanitized_fields_payplug', $options) );
517 }
518 }
519 return $account;
520 }
521
522 /**
523 *
524 * Retrieve the local oney threshold configration
525 *
526 * @return array
527 */
528
529 public static function getOneySettings() {
530 return get_option('woocommerce_payplug_settings', []);
531 }
532
533 /**
534 * Set current option from payplug settings and api call
535 *
536 * @return void
537 */
538 public static function set_account_data_from_options()
539 {
540 $options = get_option('woocommerce_payplug_settings', []);
541 $payplug_test_key = !empty($options['payplug_test_key']) ? $options['payplug_test_key'] : '';
542 $payplug_live_key = !empty($options['payplug_live_key']) ? $options['payplug_live_key'] : '';
543 if (empty($payplug_test_key) && empty($payplug_live_key)) {
544 return array();
545 }
546
547 try {
548 $parameters_account = Authentication::getAccount(new Payplug($options['mode'] === 'yes' ? $payplug_live_key : $payplug_test_key));
549 self::set_transient_data($parameters_account, $options);
550 } catch (\Payplug\Exception\UnauthorizedException $e) {
551 } catch (\Payplug\Exception\ConfigurationNotSetException $e) {
552 } catch( \Payplug\Exception\ForbiddenException $e){
553 } catch (\Payplug\Exception\ForbiddenException $e){return array();}
554
555 }
556
557 /**
558 * Get min and max for oney payment
559 *
560 * @return array
561 */
562 public static function get_min_max_oney() {
563 $account = self::get_account_data_from_options();
564 if (!$account) {
565 return array();
566 }
567 return [
568 'min' => floatval($account['configuration']['oney']['min_amounts']['EUR'])/100,
569 'max' => floatval($account['configuration']['oney']['max_amounts']['EUR'])/100
570 ];
571 }
572
573 /**
574 * Check if oney is available with current settings
575 *
576 * @return boolean
577 */
578 public static function is_oney_available() {
579 $account = self::get_account_data_from_options();
580 if (!$account) {
581 return false;
582 }
583 return ($account && $account['permissions'][PayplugPermissions::USE_ONEY] == "1" && $account['oneyEnabled'] === "yes");
584 }
585
586 /**
587 * Hide popup for if country_code != payplug country
588 * https://payplug-prod.atlassian.net/browse/WOOC-249
589 *
590 * @return bool
591 */
592 public static function show_oney_popup()
593 {
594 $account = self::get_account_data_from_options();
595 if( $account && $account['permissions'][PayplugPermissions::USE_ONEY] == true && $account["country"] == self::getISOCountryCode() ){
596 return true;
597 }
598 return false;
599 }
600
601 /**
602 * @return bool
603 */
604 public static function check_order_max_amount($order_total){
605 if ($order_total < PayplugGatewayOney3x::MIN_AMOUNT || $order_total > PayplugGatewayOney3x::MAX_AMOUNT) {
606 return false;
607 }
608 return true;
609 }
610
611 /**
612 * Load translations from plugin languages folder.
613 *
614 * @param string $plugin_rel_path
615 *
616 * @return bool
617 */
618 public static function load_plugin_textdomain( $plugin_rel_path ) {
619
620 $domain = 'payplug';
621
622 $locale = apply_filters( 'plugin_locale', is_admin() ? get_user_locale() : get_locale(), $domain );
623
624 $mofile = $domain . '-' . $locale . '.mo';
625
626 $path = WP_PLUGIN_DIR . '/' . trim( $plugin_rel_path, '/' );
627
628 return load_textdomain( $domain, $path . '/' . $mofile );
629 }
630
631 /**
632 * Check and update value for oney simulation
633 *
634 * @return void
635 */
636 public static function oney_simulation_values ($keys_array, &$array) {
637 foreach($keys_array as $key) {
638 if (array_key_exists($key, $array)) {
639 $array[$key]['down_payment_amount'] = floatval($array[$key]['down_payment_amount']) / 100;
640 foreach ($array[$key]['installments'] as $k => $value) {
641 $array[$key]['installments'][$k]['amount'] = floatval($value['amount']) / 100;
642 }
643 }
644 }
645 }
646
647 public static function getISOCountryCode()
648 {
649 preg_match( '([a-z-]+)', get_locale(), $country );
650 return strtoupper($country[0]);
651 }
652
653 /**
654 * Get country of the payplug merchant account and save it to the database
655 *
656 * @return string payplug merchant account country
657 */
658 public static function get_payplug_merchant_country()
659 {
660 $data = get_option('woocommerce_payplug_settings');
661
662 //in order to reduce the getAccount calls
663 if (isset($data['payplug_live_key'])) {
664
665 if (!isset($data['payplug_merchant_country'])) {
666 return self::UpdateCountryOption($data);
667 }
668
669 return $data['payplug_merchant_country'];
670 }
671
672 $country = wc_get_base_location();
673 return $country['country'];
674
675 }
676
677 /**
678 * Update payplug options and return the country
679 *
680 * @param $options
681 * @return string
682 * @throws \Payplug\Exception\ConfigurationException
683 */
684 public static function UpdateCountryOption($options){
685
686 try {
687
688 //fail safe for non activated account
689 if ((isset($options['mode'])) && $options['payplug_test_key']){
690 $key = $options['mode'] === "yes" && !empty($options['payplug_live_key']) ? $options['payplug_live_key'] : $options['payplug_test_key'];
691 }
692
693 if( empty($options['payplug_live_key'] )){
694 $options['mode'] = "no";
695 }
696
697 if (isset($key)){
698 $response = Authentication::getAccount(new Payplug($key));
699 }
700
701 if (isset($response['httpResponse']['country'])) {
702 $options['payplug_merchant_country'] = $response['httpResponse']['country'];
703 update_option( 'woocommerce_payplug_settings', apply_filters('woocommerce_settings_api_sanitized_fields_payplug', $options) );
704 }else{
705
706 //default value for merchant country
707 $options['payplug_merchant_country'] = 'FR';
708 }
709
710 } catch (ForbiddenException $e) {
711 PayplugGateway::log('Error while getting account : ' . $e->getMessage(), 'error');
712 \WC_Admin_Settings::add_error($e->getMessage());
713 $options['payplug_merchant_country'] = 'FR';
714 }
715
716 return $options['payplug_merchant_country'];
717
718 }
719
720 public static function get_live_key()
721 {
722 return get_option('woocommerce_payplug_settings', [])['payplug_live_key'];
723 }
724
725 public static function get_test_key()
726 {
727 return get_option('woocommerce_payplug_settings', [])['payplug_test_key'];
728 }
729
730 /**
731 *
732 * Checks fi the user is logged in
733 *
734 * @return bool
735 */
736 public static function user_logged_in()
737 {
738 return !empty(get_option( 'woocommerce_payplug_settings', [] )['payplug_test_key']);
739 }
740
741 public static function check_mode(){
742 return get_option( 'woocommerce_payplug_settings', [] )['mode'] === "yes" ? true : false;
743 }
744
745 public static function payplug_logout($gateway) {
746
747 if ($gateway->user_logged_in()) {
748 $data = get_option($gateway->get_option_key());
749 $data['payplug_test_key'] = '';
750 $data['payplug_live_key'] = '';
751 $data['payplug_merchant_id'] = '';
752 $data['enabled'] = 'no';
753 $data['mode'] = 'no';
754 $data['oneclick'] = 'no';
755 update_option(
756 $gateway->get_option_key(),
757 apply_filters('woocommerce_settings_api_sanitized_fields_' . $gateway->id, $data)
758 );
759 if("payplug" === $gateway->id) {
760 return true;
761 }
762 } else {
763 return false;
764 }
765 }
766
767 public static function plugin_deactivation(){
768 $option_name = 'woocommerce_payplug_settings';
769 delete_option( $option_name );
770 // for site options in Multisite
771 delete_site_option( $option_name );
772 \Payplug\PayplugWoocommerce\Model\Lock::delete_lock_table();
773 }
774
775 }
776