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

737 lines 15.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 = PayplugGatewayOney3x::OPTION_NAME . (array_key_exists('mode', $options) && $options['mode'] === 'yes' ? "_live" : "_test");
459 return $transient_key;
460 }
461
462 /**
463 * Set transient data for payplug account
464 *
465 * @return string
466 */
467 public static function set_transient_data($data, $options = null)
468 {
469 $options = $options ? $options : get_option('woocommerce_payplug_settings', []);
470 $transient_key = PayplugWoocommerceHelper::get_transient_key($options);
471 set_transient($transient_key, isset($data['httpResponse']) ? $data['httpResponse'] : []);
472 }
473
474 /**
475 * Get current option from payplug settings
476 *
477 * @return array
478 */
479 public static function get_account_data_from_options()
480 {
481 $options = get_option('woocommerce_payplug_settings', []);
482 $transient_key = self::get_transient_key($options);
483 $account = get_transient($transient_key);
484 if (is_array($account)) {
485 $account['oneyEnabled'] = (isset($options['oney']) && !empty($options['oney'])) ? $options['oney'] : '';
486 $account['bancontact'] = !empty($options['bancontact']) ? $options['bancontact'] : '';
487 $account['american_express'] = !empty($options['american_express']) ? $options['american_express'] : '';
488
489 if ($account['payment_methods']['apple_pay']['enabled']) {
490 if (in_array(strtr(get_site_url(), array("http://" => "", "https://" => "")), $account['payment_methods']['apple_pay']['allowed_domain_names'])) {
491 $account['apple_pay'] = "yes";
492 } else {
493 $account['apple_pay'] = "no";
494 $options['apple_pay'] = "no";
495 update_option( 'woocommerce_payplug_settings', apply_filters('woocommerce_settings_api_sanitized_fields_payplug', $options) );
496 }
497
498 } else {
499 $account['apple_pay'] = "no";
500 $options['apple_pay'] = "no";
501 update_option( 'woocommerce_payplug_settings', apply_filters('woocommerce_settings_api_sanitized_fields_payplug', $options) );
502 }
503 }
504 return $account;
505 }
506
507 /**
508 *
509 * Retrieve the local oney threshold configration
510 *
511 * @return array
512 */
513
514 public static function getOneySettings() {
515 return get_option('woocommerce_payplug_settings', []);
516 }
517
518 /**
519 * Set current option from payplug settings and api call
520 *
521 * @return void
522 */
523 public static function set_account_data_from_options()
524 {
525 $options = get_option('woocommerce_payplug_settings', []);
526 $payplug_test_key = !empty($options['payplug_test_key']) ? $options['payplug_test_key'] : '';
527 $payplug_live_key = !empty($options['payplug_live_key']) ? $options['payplug_live_key'] : '';
528 if (empty($payplug_test_key) && empty($payplug_live_key)) {
529 return array();
530 }
531
532 try {
533 $parameters_account = Authentication::getAccount(new Payplug($options['mode'] === 'yes' ? $payplug_live_key : $payplug_test_key));
534 self::set_transient_data($parameters_account, $options);
535 } catch (\Payplug\Exception\UnauthorizedException $e) {
536 } catch (\Payplug\Exception\ConfigurationNotSetException $e) {
537 } catch( \Payplug\Exception\ForbiddenException $e){
538 } catch (\Payplug\Exception\ForbiddenException $e){return array();}
539
540 }
541
542 /**
543 * Get min and max for oney payment
544 *
545 * @return array
546 */
547 public static function get_min_max_oney() {
548 $account = self::get_account_data_from_options();
549 if (!$account) {
550 return array();
551 }
552 return [
553 'min' => floatval($account['configuration']['oney']['min_amounts']['EUR'])/100,
554 'max' => floatval($account['configuration']['oney']['max_amounts']['EUR'])/100
555 ];
556 }
557
558 /**
559 * Check if oney is available with current settings
560 *
561 * @return boolean
562 */
563 public static function is_oney_available() {
564 $account = self::get_account_data_from_options();
565 if (!$account) {
566 return false;
567 }
568 return ($account && $account['permissions'][PayplugPermissions::USE_ONEY] == "1" && $account['oneyEnabled'] === "yes");
569 }
570
571 /**
572 * Hide popup for if country_code != payplug country
573 * https://payplug-prod.atlassian.net/browse/WOOC-249
574 *
575 * @return bool
576 */
577 public static function show_oney_popup()
578 {
579 $account = self::get_account_data_from_options();
580 if( $account && $account['permissions'][PayplugPermissions::USE_ONEY] == true && $account["country"] == self::getISOCountryCode() ){
581 return true;
582 }
583
584 return false;
585 }
586
587 /**
588 * Load translations from plugin languages folder.
589 *
590 * @param string $plugin_rel_path
591 *
592 * @return bool
593 */
594 public static function load_plugin_textdomain( $plugin_rel_path ) {
595
596 $domain = 'payplug';
597
598 $locale = apply_filters( 'plugin_locale', is_admin() ? get_user_locale() : get_locale(), $domain );
599
600 $mofile = $domain . '-' . $locale . '.mo';
601
602 $path = WP_PLUGIN_DIR . '/' . trim( $plugin_rel_path, '/' );
603
604 return load_textdomain( $domain, $path . '/' . $mofile );
605 }
606
607 /**
608 * Check and update value for oney simulation
609 *
610 * @return void
611 */
612 public static function oney_simulation_values ($keys_array, &$array) {
613 foreach($keys_array as $key) {
614 if (array_key_exists($key, $array)) {
615 $array[$key]['down_payment_amount'] = floatval($array[$key]['down_payment_amount']) / 100;
616 foreach ($array[$key]['installments'] as $k => $value) {
617 $array[$key]['installments'][$k]['amount'] = floatval($value['amount']) / 100;
618 }
619 }
620 }
621 }
622
623 public static function getISOCountryCode()
624 {
625 preg_match( '([a-z-]+)', get_locale(), $country );
626 return strtoupper($country[0]);
627 }
628
629 /**
630 * Get country of the payplug merchant account and save it to the database
631 *
632 * @return string payplug merchant account country
633 */
634 public static function get_payplug_merchant_country()
635 {
636 $data = get_option('woocommerce_payplug_settings');
637
638 //in order to reduce the getAccount calls
639 if (isset($data['payplug_live_key'])) {
640
641 if (!isset($data['payplug_merchant_country'])) {
642 return self::UpdateCountryOption($data);
643 }
644
645 return $data['payplug_merchant_country'];
646 }
647
648 $country = wc_get_base_location();
649 return $country['country'];
650
651 }
652
653 /**
654 * Update payplug options and return the country
655 *
656 * @param $options
657 * @return string
658 * @throws \Payplug\Exception\ConfigurationException
659 */
660 public static function UpdateCountryOption($options){
661
662 try {
663
664 //fail safe for non activated account
665 if ((isset($options['mode'])) && $options['payplug_test_key'])
666 $key = $options['mode'] === "yes" && !empty($options['payplug_live_key']) ? $options['payplug_live_key'] : $options['payplug_test_key'];
667 if( empty($options['payplug_live_key'] )){
668 $options['mode'] = "no";
669 }
670
671 if (isset($key))
672 $response = Authentication::getAccount(new Payplug($key));
673
674 if (isset($response['httpResponse']['country'])) {
675 $options['payplug_merchant_country'] = $response['httpResponse']['country'];
676 update_option( 'woocommerce_payplug_settings', apply_filters('woocommerce_settings_api_sanitized_fields_payplug', $options) );
677 }
678
679 } catch (ForbiddenException $e) {
680 PayplugGateway::log('Error while getting account : ' . $e->getMessage(), 'error');
681 \WC_Admin_Settings::add_error($e->getMessage());
682 $options['payplug_merchant_country'] = 'FR';
683 }
684
685 return $options['payplug_merchant_country'];
686
687 }
688
689 public static function get_live_key()
690 {
691 return get_option('woocommerce_payplug_settings', [])['payplug_live_key'];
692 }
693
694 public static function get_test_key()
695 {
696 return get_option('woocommerce_payplug_settings', [])['payplug_test_key'];
697 }
698
699 /**
700 *
701 * Checks fi the user is logged in
702 *
703 * @return bool
704 */
705 public static function user_logged_in()
706 {
707 return !empty(get_option( 'woocommerce_payplug_settings', [] )['payplug_test_key']);
708 }
709
710 public static function check_mode(){
711 return get_option( 'woocommerce_payplug_settings', [] )['mode'] === "yes" ? true : false;
712 }
713
714 public static function payplug_logout($gateway) {
715
716 if ($gateway->user_logged_in()) {
717 $data = get_option($gateway->get_option_key());
718 $data['payplug_test_key'] = '';
719 $data['payplug_live_key'] = '';
720 $data['payplug_merchant_id'] = '';
721 $data['enabled'] = 'no';
722 $data['mode'] = 'no';
723 $data['oneclick'] = 'no';
724 update_option(
725 $gateway->get_option_key(),
726 apply_filters('woocommerce_settings_api_sanitized_fields_' . $gateway->id, $data)
727 );
728 if("payplug" === $gateway->id) {
729 return true;
730 }
731 } else {
732 return false;
733 }
734 }
735
736 }
737