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

817 lines 17.2 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
496 if(empty($account) || !is_array($account) ){
497 self::set_account_data_from_options();
498 $account = get_transient($transient_key);
499 }
500
501 return $account;
502 }
503
504 /**
505 * Get current option from payplug settings
506 *this should replace get_account_data_from_options
507 *
508 * @return array
509 */
510 public static function generic_get_account_data_from_options($gateway_id){
511 $options = get_option('woocommerce_payplug_settings', []);
512 $transient_key = self::get_transient_key($options);
513 $account = get_transient($transient_key);
514
515 //if transient is empty, it goes and get the permissions for the customer to populate it
516 if(empty($account) || !is_array($account) ){
517 self::set_account_data_from_options();
518 $account = get_transient($transient_key);
519 }
520
521 if( isset($options[$gateway_id]) && $options[$gateway_id] == "yes"){
522 $account['permissions'][$gateway_id] = true;
523 }
524
525 return $account;
526
527 }
528
529 /**
530 * Set current option from payplug settings and api call
531 *
532 * @return void
533 */
534 public static function set_account_data_from_options()
535 {
536 $options = get_option('woocommerce_payplug_settings', []);
537 $payplug_test_key = !empty($options['payplug_test_key']) ? $options['payplug_test_key'] : '';
538 $payplug_live_key = !empty($options['payplug_live_key']) ? $options['payplug_live_key'] : '';
539
540 if (empty($payplug_test_key) && empty($payplug_live_key)) {
541 return array();
542 }
543
544 if( $options['mode'] === 'yes' && empty($payplug_live_key) ){
545 return array();
546 }
547
548 if( $options['mode'] != 'yes' && empty($payplug_test_key)){
549 return array();
550 }
551
552 try {
553 $parameters_account = Authentication::getAccount(new Payplug($options['mode'] === 'yes' ? $payplug_live_key : $payplug_test_key));
554 self::set_transient_data($parameters_account, $options);
555 } catch (\Payplug\Exception\UnauthorizedException $e) {
556 } catch (\Payplug\Exception\ConfigurationNotSetException $e) {
557 } catch( \Payplug\Exception\ForbiddenException $e){
558 } catch (\Payplug\Exception\ForbiddenException $e){return array();}
559
560 }
561
562 /**
563 * Get min and max for oney payment
564 *
565 * @return array
566 */
567 public static function get_min_max_oney() {
568 $account = self::get_account_data_from_options();
569 if (!$account) {
570 return array();
571 }
572 return [
573 'min' => floatval($account['configuration']['oney']['min_amounts']['EUR'])/100,
574 'max' => floatval($account['configuration']['oney']['max_amounts']['EUR'])/100
575 ];
576 }
577
578 /**
579 * Check if oney is available with current settings
580 *
581 * @return boolean
582 */
583 public static function is_oney_available() {
584 $account = self::get_account_data_from_options();
585 if (!$account) {
586 return false;
587 }
588
589 $options = self::get_payplug_options();
590 $oney_active = (isset($options['oney']) && !empty($options['oney'])) ? $options['oney'] : '';
591
592 return ($account && $account['permissions'][PayplugPermissions::USE_ONEY] == "1" && $oney_active === "yes");
593 }
594
595 /**
596 * Hide popup for if country_code != payplug country
597 * https://payplug-prod.atlassian.net/browse/WOOC-249
598 *
599 * @return bool
600 */
601 public static function show_oney_popup()
602 {
603 $account = self::get_account_data_from_options();
604 if( $account && $account['permissions'][PayplugPermissions::USE_ONEY] == true && $account["country"] == self::getISOCountryCode() ){
605 return true;
606 }
607 return false;
608 }
609
610 /**
611 * @return bool
612 */
613 public static function check_order_max_amount($order_total){
614 if ($order_total < PayplugGatewayOney3x::MIN_AMOUNT || $order_total > PayplugGatewayOney3x::MAX_AMOUNT) {
615 return false;
616 }
617 return true;
618 }
619
620 /**
621 * Load translations from plugin languages folder.
622 *
623 * @param string $plugin_rel_path
624 *
625 * @return bool
626 */
627 public static function load_plugin_textdomain( $plugin_rel_path ) {
628
629 $domain = 'payplug';
630
631 $locale = apply_filters( 'plugin_locale', is_admin() ? get_user_locale() : get_locale(), $domain );
632
633 $mofile = $domain . '-' . $locale . '.mo';
634
635 $path = WP_PLUGIN_DIR . '/' . trim( $plugin_rel_path, '/' );
636
637 return load_textdomain( $domain, $path . '/' . $mofile );
638 }
639
640 /**
641 * Check and update value for oney simulation
642 *
643 * @return void
644 */
645 public static function oney_simulation_values ($keys_array, &$array) {
646 foreach($keys_array as $key) {
647 if (array_key_exists($key, $array)) {
648 $array[$key]['down_payment_amount'] = floatval($array[$key]['down_payment_amount']) / 100;
649 foreach ($array[$key]['installments'] as $k => $value) {
650 $array[$key]['installments'][$k]['amount'] = floatval($value['amount']) / 100;
651 }
652 }
653 }
654 }
655
656 public static function getISOCountryCode()
657 {
658 preg_match( '([a-z-]+)', get_locale(), $country );
659 return strtoupper($country[0]);
660 }
661
662 /**
663 * Get country of the payplug merchant account and save it to the database
664 *
665 * @return string payplug merchant account country
666 */
667 public static function get_payplug_merchant_country()
668 {
669 $data = get_option('woocommerce_payplug_settings');
670
671 //in order to reduce the getAccount calls
672 if (isset($data['payplug_live_key'])) {
673
674 if (!isset($data['payplug_merchant_country'])) {
675 return self::UpdateCountryOption($data);
676 }
677
678 return $data['payplug_merchant_country'];
679 }
680
681 $country = wc_get_base_location();
682 return $country['country'];
683
684 }
685
686 /**
687 * Update payplug options and return the country
688 *
689 * @param $options
690 * @return string
691 * @throws \Payplug\Exception\ConfigurationException
692 */
693 public static function UpdateCountryOption($options){
694
695 try {
696
697 //fail safe for non activated account
698 if ((isset($options['mode'])) && $options['payplug_test_key']){
699 $key = $options['mode'] === "yes" && !empty($options['payplug_live_key']) ? $options['payplug_live_key'] : $options['payplug_test_key'];
700 }
701
702 if( empty($options['payplug_live_key'] )){
703 $options['mode'] = "no";
704 }
705
706 if (isset($key) && !empty($key)){
707
708 //$response = Authentication::getAccount(new Payplug($key));
709 $response = self::get_account_data_from_options();
710 }
711
712 if (isset($response['httpResponse']['country'])) {
713 $options['payplug_merchant_country'] = $response['httpResponse']['country'];
714 update_option( 'woocommerce_payplug_settings', apply_filters('woocommerce_settings_api_sanitized_fields_payplug', $options) );
715 }else{
716
717 //default value for merchant country
718 $options['payplug_merchant_country'] = 'FR';
719 }
720
721 } catch (ForbiddenException $e) {
722 PayplugGateway::log('Error while getting account : ' . $e->getMessage(), 'error');
723 \WC_Admin_Settings::add_error($e->getMessage());
724 $options['payplug_merchant_country'] = 'FR';
725 }
726
727 return $options['payplug_merchant_country'];
728
729 }
730
731 public static function get_live_key()
732 {
733 return get_option('woocommerce_payplug_settings', [])['payplug_live_key'];
734 }
735
736 public static function get_test_key()
737 {
738 return get_option('woocommerce_payplug_settings', [])['payplug_test_key'];
739 }
740
741 /**
742 *
743 * Checks fi the user is logged in
744 *
745 * @return bool
746 */
747 public static function user_logged_in()
748 {
749 return !empty(get_option( 'woocommerce_payplug_settings', [] )['payplug_test_key']);
750 }
751
752 public static function check_mode(){
753 return get_option( 'woocommerce_payplug_settings', [] )['mode'] === "yes" ? true : false;
754 }
755
756 public static function payplug_logout($gateway) {
757
758 if ($gateway->user_logged_in()) {
759 $data = get_option($gateway->get_option_key());
760 $data['payplug_test_key'] = '';
761 $data['payplug_live_key'] = '';
762 $data['payplug_merchant_id'] = '';
763 $data['enabled'] = 'no';
764 $data['mode'] = 'no';
765 $data['oneclick'] = 'no';
766 update_option(
767 $gateway->get_option_key(),
768 apply_filters('woocommerce_settings_api_sanitized_fields_' . $gateway->id, $data)
769 );
770 if("payplug" === $gateway->id) {
771 return true;
772 }
773 } else {
774 return false;
775 }
776 }
777
778 public static function plugin_deactivation(){
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 $shippings = WC()->shipping()->get_shipping_methods();
788 $shippings_methods = [];
789 foreach ($shippings as $shipping) {
790 array_push($shippings_methods,[
791 "id_carrier" => $shipping->id,
792 "name" => $shipping->method_title,
793 "checked" => in_array($shipping->id, $carriers)
794 ]);
795 }
796 return $shippings_methods;
797 }
798
799 public static function get_payplug_options() {
800 return get_option('woocommerce_payplug_settings', []);
801 }
802
803 public static function get_applepay_options() {
804 $options = self::get_payplug_options();
805 $applepay = [
806 "enabled" => (!empty($options['apple_pay'])) ? $options['apple_pay'] : false,
807 "checkout" => (!empty($options['applepay_checkout'])) ? $options['applepay_checkout'] : false,
808 "cart" => (!empty($options['applepay_cart'])) ? $options['applepay_cart'] : false,
809 "carriers" => (!empty($options['applepay_carriers'])) ? $options['applepay_carriers'] : [],
810
811 ];
812
813 return $applepay;
814 }
815
816 }
817