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 +855 -612 1.10.0 → 3.1.0 View file →
@@ -2,688 +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;
10 11 use Payplug\Exception\ForbiddenException;
12 +use Payplug\Payplug;
11 13 use Payplug\PayplugWoocommerce\Gateway\PayplugGateway;
12 -use Payplug\Resource\APIResource;
13 -use Payplug\Payplug;
14 -use Payplug\Authentication;
15 14 use Payplug\PayplugWoocommerce\Gateway\PayplugGatewayOney3x;
16 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;
17 20
18 21 /**
19 22 * Helper class.
20 - *
21 - * @package Payplug\PayplugWoocommerce
22 23 */
23 -class PayplugWoocommerceHelper {
24 +class PayplugWoocommerceHelper
25 +{
26 + use ServiceGetter;
24 27
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'];
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'];
32 36
33 - return version_compare( $wc->version, '3.0.0', '<' );
34 - }
37 + return version_compare($wc->version, '3.0.0', '<');
38 + }
35 39
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' );
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');
44 49
45 - return admin_url( 'admin.php?page=wc-settings&tab=checkout&section=' . $section_slug );
46 - }
50 + return admin_url('admin.php?page=wc-settings&tab=checkout&section=' . $section_slug);
51 + }
47 52
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 - }
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 + }
310 316
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 - }
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 + }
324 332
325 - return in_array( strtoupper( $country ), self::get_supported_countries() );
326 - }
333 + return in_array(strtoupper($country), self::get_supported_countries());
334 + }
327 335
328 - /**
329 - * Get default country.
330 - *
331 - * @return string
332 - */
333 - public static function get_default_country() {
334 - $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();
335 344
336 - return ( self::is_country_supported( $country ) ) ? strtoupper( $country ) : 'FR';
337 - }
345 + return (self::is_country_supported($country)) ? strtoupper($country) : 'FR';
346 + }
338 347
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 - }
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 + }
349 359
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 + * 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 + }
360 371
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 + * 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 + }
372 384
373 - return absint( wc_format_decimal( ( (float) $amount * 100 ), wc_get_price_decimals() ) );
374 - }
385 + return absint(wc_format_decimal(((float) $amount * 100), wc_get_price_decimals()));
386 + }
375 387
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 - }
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 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 ) {
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 + }
408 417
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 - }
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 + }
415 433
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 ) {
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 + }
425 451
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 );
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 + }
430 466
431 - if ( is_callable( [ $order, 'save' ] ) ) {
432 - $order->save();
433 - }
434 - }
435 - }
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');
436 475
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 - }
476 + return $transient_key;
477 + }
450 478
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 - }
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 + }
461 488
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 - }
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 + }
473 500
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'] : '';
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);
488 511
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 - }
512 + if (empty($account) || !is_array($account)) {
513 + self::set_account_data_from_options();
514 + $account = get_transient($transient_key);
515 + }
497 516
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 - }
517 + return $account;
518 + }
506 519
507 - /**
508 - *
509 - * Retrieve the local oney threshold configration
510 - *
511 - * @return array
512 - */
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);
513 531
514 - public static function getOneySettings() {
515 - return get_option('woocommerce_payplug_settings', []);
516 - }
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 + }
517 537
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 - }
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 + }
531 543
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();}
544 + return $account;
545 + }
539 546
540 - }
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();
541 557
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 - }
558 + if (empty($options) || !isset($options['api_key']) || !isset($options['jwt'])) {
559 + return [];
560 + }
557 561
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 - }
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);
570 565
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 - }
566 + if (empty($key)) {
567 + return [];
568 + }
583 569
584 - return false;
585 - }
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 + }
586 581
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 ) {
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 + }
595 593
596 - $domain = 'payplug';
594 + $options = self::get_payplug_options();
595 + $oney_active = (bool) $options['payment_methods']['configuration']['oney']['active'];
597 596
598 - $locale = apply_filters( 'plugin_locale', is_admin() ? get_user_locale() : get_locale(), $domain );
597 + return $account && $account['permissions'][PayplugPermissions::USE_ONEY] == '1' && $oney_active;
598 + }
599 599
600 - $mofile = $domain . '-' . $locale . '.mo';
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 + }
601 612
602 - $path = WP_PLUGIN_DIR . '/' . trim( $plugin_rel_path, '/' );
613 + return false;
614 + }
603 615
604 - return load_textdomain( $domain, $path . '/' . $mofile );
605 - }
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 + }
606 624
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;
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 + }
618 800 }
619 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 + }
620 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;
621 828 }
622 829
623 - public static function getISOCountryCode()
624 - {
625 - preg_match( '([a-z-]+)', get_locale(), $country );
626 - return strtoupper($country[0]);
627 - }
830 + public static function get_payplug_options()
831 + {
832 + $helper = new self();
628 833
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');
834 + return $helper->get_service('configuration')->get_options();
835 + }
637 836
638 - //in order to reduce the getAccount calls
639 - if (isset($data['payplug_live_key'])) {
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 + ];
640 848
641 - if (!isset($data['payplug_merchant_country'])) {
642 - return self::UpdateCountryOption($data);
643 - }
849 + return $applepay;
850 + }
644 851
645 - return $data['payplug_merchant_country'];
646 - }
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 + }
647 856
648 - $country = wc_get_base_location();
649 - return $country['country'];
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 + }
650 861
651 - }
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 + }
652 866
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){
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 + }
661 878
662 - try {
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 + }
663 890
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 - }
891 + if (empty(WC()->cart) || empty(WC()->cart->get_cart())) {
892 + return false;
893 + }
670 894
671 - if (isset($key))
672 - $response = Authentication::getAccount(new Payplug($key));
895 + foreach (WC()->cart->get_cart() as $prod) {
896 + if (empty($prod['product_id'])) {
897 + return false;
898 + }
673 899
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 - }
900 + $pid = $prod['product_id'];
901 + $product = wc_get_product($pid);
678 902
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 - }
903 + if ($product->is_type('subscription')) {
904 + return true;
905 + }
906 + }
684 907
685 - return $options['payplug_merchant_country'];
908 + return false;
909 + }
686 910
687 - }
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 + }
688 929
930 + return false;
931 + }
689 932 }