PluginProbe
PayPlug for WooCommerce (Official) / 1.0.20
PayPlug for WooCommerce (Official) v1.0.20
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 / Gateway / PayplugGateway.php

PayplugGateway.php in PayPlug for WooCommerce (Official) 1.0.20, at src/Gateway/PayplugGateway.php

1,385 lines 42.3 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\Gateway;
4
5 // Exit if accessed directly
6 if ( ! defined( 'ABSPATH' ) ) {
7 exit;
8 }
9
10 use Payplug\Authentication;
11 use Payplug\Exception\ConfigurationException;
12 use Payplug\Exception\HttpException;
13 use Payplug\Payplug;
14 use Payplug\PayplugWoocommerce\Admin\Ajax;
15 use Payplug\PayplugWoocommerce\PayplugWoocommerceHelper;
16 use Payplug\Resource\Payment as PaymentResource;
17 use Payplug\Resource\Refund as RefundResource;
18 use WC_Payment_Gateway_CC;
19 use WC_Payment_Tokens;
20
21 /**
22 * PayPlug WooCommerce Gateway.
23 *
24 * @package Payplug\PayplugWoocommerce\Gateway
25 */
26 class PayplugGateway extends WC_Payment_Gateway_CC {
27
28 /**
29 * @var PayplugGatewayRequirements
30 */
31 private $requirements;
32
33 /**
34 * @var PayplugPermissions
35 */
36 private $permissions;
37
38 /**
39 * @var PayplugResponse
40 */
41 public $response;
42
43 /**
44 * @var PayplugApi
45 */
46 public $api;
47
48 /**
49 * @var \WC_Logger
50 */
51 protected static $log;
52
53 /**
54 * @var bool
55 */
56 protected static $log_enabled;
57
58 /**
59 * Logging method.
60 *
61 * @param string $message Log message.
62 * @param string $level Optional. Default 'info'.
63 * emergency|alert|critical|error|warning|notice|info|debug
64 */
65 public static function log( $message, $level = 'info' ) {
66 if ( ! self::$log_enabled ) {
67 return;
68 }
69
70 if ( empty( self::$log ) ) {
71 self::$log = PayplugWoocommerceHelper::is_pre_30() ? new \WC_Logger() : wc_get_logger();
72 }
73
74 PayplugWoocommerceHelper::is_pre_30()
75 ? self::$log->add( 'payplug_gateway', $message )
76 : self::$log->log( $level, $message, array( 'source' => 'payplug_gateway' ) );
77 }
78
79 public function __construct() {
80 $this->id = 'payplug';
81 $this->icon = '';
82 $this->has_fields = false;
83 $this->method_title = _x( 'PayPlug', 'Gateway method title', 'payplug' );
84 $this->method_description = __( 'Enable PayPlug for your customers.', 'payplug' );
85 $this->supports = array(
86 'products',
87 'refunds',
88 'tokenization',
89 );
90 $this->new_method_label = __( 'Pay with another credit card', 'payplug' );
91
92 $this->init_settings();
93 $this->requirements = new PayplugGatewayRequirements( $this );
94 if ( $this->user_logged_in() ) {
95 $this->init_payplug();
96 }
97 $this->init_form_fields();
98
99 $this->title = $this->get_option( 'title' );
100 $this->description = $this->get_option( 'description' );
101 $this->mode = 'yes' === $this->get_option( 'mode', 'no' ) ? 'live' : 'test';
102 $this->debug = 'yes' === $this->get_option( 'debug', 'no' );
103 $this->email = $this->get_option( 'email' );
104 $this->payment_method = $this->get_option( 'payment_method' );
105 $this->oneclick = 'yes' === $this->get_option( 'oneclick', 'no' );
106
107 add_filter( 'woocommerce_get_customer_payment_tokens', [ $this, 'filter_tokens' ], 10, 3 );
108
109 self::$log_enabled = $this->debug;
110
111 // Ensure the description is not empty to correctly display users's save cards
112 if ( empty( $this->description ) && 0 !== count( $this->get_tokens() ) ) {
113 $this->description = ' ';
114 }
115
116 if ( 'test' === $this->mode ) {
117 $this->description .= " \n";
118
119 $this->description .= __( 'You are in TEST MODE. In test mode you can use the card 4242424242424242 with any valid expiration date and CVC.', 'payplug' );
120 $this->description = trim( $this->description );
121 }
122
123 add_filter( 'woocommerce_get_order_item_totals', [ $this, 'customize_gateway_title' ], 10, 2 );
124 add_action( 'wp_enqueue_scripts', [ $this, 'scripts' ] );
125 add_action( 'woocommerce_update_options_payment_gateways_' . $this->id, [ $this, 'process_admin_options' ] );
126 add_action( 'the_post', [ $this, 'validate_payment' ] );
127 }
128
129 /**
130 * Customize gateway title in emails.
131 *
132 * @param array $total_rows
133 * @param \WC_Order $order
134 *
135 * @return array
136 *
137 * @author Clément Boirie
138 */
139 public function customize_gateway_title( $total_rows, $order ) {
140
141 $payment_method = PayplugWoocommerceHelper::is_pre_30() ? $order->payment_method : $order->get_payment_method();
142 if (
143 $this->id !== $payment_method
144 || ! isset( $total_rows['payment_method'] )
145 ) {
146 return $total_rows;
147 }
148
149 $total_rows['payment_method']['value'] = __( 'Credit card', 'payplug' );
150
151 return $total_rows;
152 }
153
154 /**
155 * Validate order payment when the user is redirected to the success confirmation page.
156 *
157 * @throws \WC_Data_Exception
158 */
159 public function validate_payment() {
160 if ( ! is_wc_endpoint_url( 'order-received' ) || empty( $_GET['key'] ) ) {
161 return;
162 }
163
164 $order_id = wc_get_order_id_by_order_key( wc_clean( $_GET['key'] ) );
165 if ( empty( $order_id ) ) {
166 return;
167 }
168
169 $order = wc_get_order( $order_id );
170 if ( ! $order instanceof \WC_Order ) {
171 return;
172 }
173
174 $payment_method = PayplugWoocommerceHelper::is_pre_30() ? $order->payment_method : $order->get_payment_method();
175 if ( 'payplug' !== $payment_method ) {
176 return;
177 }
178
179 $transaction_id = PayplugWoocommerceHelper::is_pre_30() ? get_post_meta( $order_id, '_transaction_id', true ) : $order->get_transaction_id();
180 if ( empty( $transaction_id ) ) {
181 PayplugGateway::log( sprintf( 'Order #%s : Missing transaction id.', $order_id ), 'error' );
182
183 return;
184 }
185
186 try {
187 $payment = $this->api->payment_retrieve( $transaction_id );
188 } catch ( \Exception $e ) {
189 PayplugGateway::log(
190 sprintf( 'Order #%s : An error occurred while retrieving the payment data with the message : %s',
191 $order_id,
192 $e->getMessage()
193 )
194 );
195
196 return;
197 }
198
199 $this->response->process_payment( $payment );
200 }
201
202 /**
203 * Get payment icons.
204 *
205 * @return string
206 */
207 public function get_icon() {
208
209 $src = ( 'it_IT' === get_locale() )
210 ? PAYPLUG_GATEWAY_PLUGIN_URL . '/assets/images/logos_scheme_PostePay.svg'
211 : PAYPLUG_GATEWAY_PLUGIN_URL . '/assets/images/logos_scheme_CB.svg';
212
213 $icons = apply_filters( 'payplug_payment_icons', [
214 'payplug' => sprintf( '<img src="%s" alt="Visa & Mastercard" class="payplug-payment-icon" />', esc_url( $src ) ),
215 ] );
216
217 $icons_str = '';
218 foreach ( $icons as $icon ) {
219 $icons_str .= $icon;
220 }
221
222 return $icons_str;
223 }
224
225 /**
226 * Check if this gateway is enabled
227 */
228 public function is_available() {
229 if ( 'yes' === $this->enabled ) {
230 return $this->requirements->satisfy_requirements() && ! empty( $this->get_api_key( $this->get_current_mode() ) );
231 }
232
233 return parent::is_available();
234 }
235
236 /**
237 * Load gateway settings.
238 */
239 public function init_settings() {
240 parent::init_settings();
241 $this->enabled = ! empty( $this->settings['enabled'] ) && 'yes' === $this->settings['enabled'] ? 'yes' : 'no';
242 }
243
244 /**
245 * Register gateway settings.
246 */
247 public function init_form_fields() {
248 $fields = [
249 'enabled' => [
250 'title' => __( 'Enable/Disable', 'payplug' ),
251 'type' => 'checkbox',
252 'label' => __( 'Enable PayPlug', 'payplug' ),
253 'description' => __( 'Only Euro payments can be processed with PayPlug.', 'payplug' ),
254 'default' => 'no',
255 ],
256 'title' => [
257 'title' => __( 'Title', 'payplug' ),
258 'type' => 'text',
259 'description' => __( 'The payment solution title displayed during checkout.', 'payplug' ),
260 'default' => _x( 'Credit card checkout', 'Default gateway title', 'payplug' ),
261 'desc_tip' => true,
262 ],
263 'description' => [
264 'title' => __( 'Description', 'payplug' ),
265 'type' => 'text',
266 'description' => __( 'The payment solution description displayed during checkout.', 'payplug' ),
267 'default' => '',
268 'desc_tip' => true,
269 ],
270 'title_connexion' => [
271 'title' => __( 'Connection', 'payplug' ),
272 'type' => 'title',
273 ],
274 'email' => [
275 'type' => 'hidden',
276 'default' => '',
277 ],
278 'login' => [
279 'type' => 'login',
280 'default' => '',
281 ],
282 'payplug_test_key' => [
283 'type' => 'hidden',
284 'default' => '',
285 ],
286 'payplug_live_key' => [
287 'type' => 'hidden',
288 'default' => '',
289 ],
290 'payplug_merchant_id' => [
291 'type' => 'hidden',
292 'default' => '',
293 ],
294 'title_testmode' => [
295 'title' => __( 'Mode', 'payplug' ),
296 'type' => 'title',
297 ],
298 'mode' => [
299 'title' => '',
300 'label' => '',
301 'type' => 'yes_no',
302 'yes' => 'Live',
303 'no' => 'Test',
304 'description' => __( 'In TEST mode, all payments will be simulations and will not generate real transactions.', 'payplug' ),
305 'default' => 'no',
306 'hide_label' => true,
307 ],
308 'title_settings' => [
309 'title' => __( 'Settings', 'payplug' ),
310 'type' => 'title',
311 ],
312 'payment_method' => [
313 'title' => __( 'Payment page', 'payplug' ),
314 'type' => 'radio',
315 'description' => __( 'Customers will be redirected to a PayPlug payment page to finalize the transaction, or payments will be performed in an embeddable payment form on your website.', 'payplug' ),
316 'default' => 'redirect',
317 'desc_tip' => true,
318 'options' => array(
319 'redirect' => __( 'Redirect', 'payplug' ),
320 'embedded' => __( 'Integrated', 'payplug' ),
321 ),
322 ],
323 'debug' => [
324 'title' => __( 'Debug', 'payplug' ),
325 'type' => 'checkbox',
326 'description' => __( 'Debug mode saves additional information on your server for each operation done via the PayPlug plugin (Developer setting).', 'payplug' ),
327 'label' => __( 'Activate debug mode', 'payplug' ),
328 'default' => 'yes',
329 'desc_tip' => true,
330 ],
331 'title_advanced_settings' => [
332 'title' => __( 'Advanced Settings', 'payplug' ),
333 'description' => __( 'This feature is available to PREMIUM accounts only. You can try it in TEST mode.',
334 'payplug' ),
335 'type' => 'title',
336 ],
337 'oneclick' => [
338 'title' => __( 'One Click Payment', 'payplug' ),
339 'type' => 'checkbox',
340 'label' => __( 'Activate', 'payplug' ),
341 'description' => __( 'Allow your customers to save their credit card information for later purchases.', 'payplug' ),
342 'default' => 'no',
343 'desc_tip' => true,
344 ],
345 ];
346
347 // Disable One-Click checkbox if the user doesn't have the permission to use it.
348 if ( $this->user_logged_in() && 'live' === $this->get_current_mode() ) {
349 $fields['oneclick']['disabled'] = ! $this->permissions->has_permissions( PayplugPermissions::SAVE_CARD );
350 }
351
352 /**
353 * Filter PayPlug gateway settings.
354 *
355 * @param array $fields
356 */
357 $fields = apply_filters( 'payplug_gateway_settings', $fields );
358 $this->form_fields = $fields;
359 }
360
361 /**
362 * Set global configuration for PayPlug instance.
363 */
364 public function init_payplug() {
365 $this->api = new PayplugApi( $this );
366 $this->api->init();
367
368 $this->permissions = new PayplugPermissions( $this );
369 $this->response = new PayplugResponse( $this );
370
371 // Register IPN handler
372 new PayplugIpnResponse( $this );
373 }
374
375 /**
376 * Embedded payment form scripts.
377 *
378 * Register scripts and additionnal data needed for the
379 * embedded payment form.
380 */
381 public function scripts() {
382 if ( ! is_cart() && ! is_checkout() && ! isset( $_GET['pay_for_order'] ) && ! is_add_payment_method_page() && ! isset( $_GET['change_payment_method'] ) ) {
383 return;
384 }
385
386 // If PayPlug is not enabled bail.
387 if ( 'no' === $this->enabled ) {
388 return;
389 }
390
391 // If keys are not set bail.
392 if ( empty( $this->get_api_key( $this->mode ) ) ) {
393 PayplugGateway::log( 'Keys are not set correctly.' );
394
395 return;
396 }
397
398 // Register checkout styles.
399 wp_register_style( 'payplug-checkout', PAYPLUG_GATEWAY_PLUGIN_URL . 'assets/css/payplug-checkout.css', [], PAYPLUG_GATEWAY_VERSION );
400 wp_enqueue_style( 'payplug-checkout' );
401
402
403 // Register scripts for embedded payment form.
404 if ( 'embedded' !== $this->payment_method ) {
405 return;
406 }
407
408 wp_register_script( 'payplug', 'https://api.payplug.com/js/1/form.latest.js', [], null, true );
409 wp_register_script( 'payplug-checkout', PAYPLUG_GATEWAY_PLUGIN_URL . 'assets/js/payplug-checkout.js', [
410 'jquery',
411 'payplug'
412 ], PAYPLUG_GATEWAY_VERSION, true );
413 wp_localize_script( 'payplug-checkout', 'payplug_checkout_params', [
414 'ajax_url' => \WC_AJAX::get_endpoint( 'payplug_create_order' ),
415 'nonce' => [
416 'checkout' => wp_create_nonce( 'woocommerce-process_checkout' ),
417 ],
418 ] );
419 wp_enqueue_script( 'payplug-checkout' );
420 }
421
422 /**
423 * Filter saved tokens for the gateway.
424 *
425 * A token will be removed if :
426 * - it doesn't match the current merchant logged in,
427 * - or it doesn't match the current gateway mode,
428 * - or it is expired.
429 *
430 * @param array $tokens
431 * @param int $user_id
432 * @param string $gateway_id
433 *
434 * @return array
435 */
436 public function filter_tokens( $tokens, $user_id, $gateway_id ) {
437
438 if ( ! is_user_logged_in() || ! class_exists( 'WC_Payment_Gateway_CC' ) ) {
439 return $tokens;
440 }
441
442 /* @var \WC_Payment_Token_CC $token */
443 foreach ( $tokens as $k => $token ) {
444
445 if ( $this->id !== $token->get_gateway_id() ) {
446 continue;
447 }
448
449 // check if token is associated with a merchant id and if it match the current one
450 $token_merchant_id = $token->get_meta( 'payplug_account', true );
451 if ( empty( $token_merchant_id ) || $this->get_merchant_id() !== $token_merchant_id ) {
452 unset( $tokens[ $k ] );
453 continue;
454 }
455
456 // check if token is available for the current gateway mode
457 if ( $this->mode !== $token->get_meta( 'mode', true ) ) {
458 unset( $tokens[ $k ] );
459 continue;
460 }
461
462 // check if token is not expired
463 $current_month = \absint( date( 'n' ) );
464 $current_year = \absint( date( 'Y' ) );
465 if ( $current_year > (int) $token->get_expiry_year() ) {
466 unset( $tokens[ $k ] );
467 continue;
468 }
469
470 if ( $current_year === (int) $token->get_expiry_year() && $current_month >= (int) $token->get_expiry_month() ) {
471 unset( $tokens[ $k ] );
472 continue;
473 }
474 }
475
476 return $tokens;
477 }
478
479 public function payment_fields() {
480 $description = $this->get_description();
481 if ( ! empty( $description ) ) {
482 echo wpautop( wptexturize( $description ) );
483 }
484
485 if ( $this->oneclick_available() ) {
486 $this->tokenization_script();
487 $this->saved_payment_methods();
488 }
489 }
490
491 /**
492 * Handle admin display.
493 */
494 public function admin_options() {
495 wp_enqueue_style(
496 'payplug-gateway-style',
497 PAYPLUG_GATEWAY_PLUGIN_URL . 'assets/css/app.css',
498 [],
499 PAYPLUG_GATEWAY_VERSION
500 );
501
502 if ( $this->user_logged_in() && false === $this->has_api_key( 'live' ) ) {
503
504 wp_enqueue_script(
505 'payplug-gateway-admin',
506 PAYPLUG_GATEWAY_PLUGIN_URL . 'assets/js/payplug-admin.js',
507 [ 'jquery-ui-dialog' ],
508 PAYPLUG_GATEWAY_VERSION
509 );
510
511 wp_localize_script( 'payplug-gateway-admin', 'payplug_admin_config', array(
512 'ajax_url' => admin_url( 'admin-ajax.php' ),
513 'has_live_key' => ( false === $this->has_api_key( 'live' ) ) ? false : true,
514 'btn_ok' => _x( 'Ok', 'modal', 'payplug' ),
515 'btn_label' => _x( 'Cancel', 'modal', 'payplug' ),
516 'general_error' => _x( 'Something went wrong. Please refresh the page and retry.', 'modal', 'payplug' ),
517 ) );
518
519 add_action( 'admin_footer', function () {
520 $email = $this->get_option( 'email' );
521 ?>
522 <div id="payplug-refresh-keys-modal" title="<?php echo esc_attr_x( 'Mode LIVE', 'modal', 'payplug' ); ?>">
523 <form id="payplug-refresh-keys-modal__form">
524 <p id="dialog-msg"></p>
525 <p><?php echo esc_html_x( 'Please enter your PayPlug account password', 'modal', 'payplug' ); ?></p>
526 <input type="password"
527 name="password"
528 required
529 title="<?php echo esc_attr_x( 'Enter your PayPlug account password', 'modal', 'payplug' ); ?>"/>
530 <input type="hidden" name="email"
531 value="<?php echo esc_attr( $email ); ?>">
532 <input type="hidden" name="action"
533 value="<?php echo esc_attr( Ajax::REFRESH_KEY_ACTION ); ?>">
534 <?php wp_nonce_field( sprintf( '%s_%s', $email, Ajax::REFRESH_KEY_ACTION ) ); ?>
535 <input class="ui-dialog-sronly" type="submit" tabindex="-1">
536 </form>
537 </div>
538 <?php
539 } );
540 }
541
542 $payplug_requirements = new PayplugGatewayRequirements( $this ); ?>
543
544 <h2 class="title--logo"><?php esc_html( $this->get_method_title() ) ?></h2>
545 <p><?php _e( sprintf( 'Version %s', PAYPLUG_GATEWAY_VERSION ) ); ?></p>
546 <div class="payplug-requirements">
547 <?php echo $payplug_requirements->curl_requirement(); ?>
548 <?php echo $payplug_requirements->php_requirement(); ?>
549 <?php echo $payplug_requirements->openssl_requirement(); ?>
550 <?php echo $payplug_requirements->account_requirement(); ?>
551 <?php echo $payplug_requirements->currency_requirement(); ?>
552 </div>
553 <?php echo wp_kses_post( wpautop( $this->get_method_description() ) ); ?>
554
555 <?php if ( $this->user_logged_in() ) : ?>
556 <table class="form-table">
557 <?php $this->generate_settings_html( $this->get_form_fields() ); ?>
558 </table>
559 <?php else:
560 $GLOBALS['hide_save_button'] = true; ?>
561 <h3 class="wc-settings-sub-title"><?php _e( 'Connection', 'payplug' ); ?></h3>
562 <table class="form-table">
563 <tbody>
564 <tr valign="top">
565 <th scope="row" class="titledesc">
566 <label for="payplug_email"><?php _e( 'Email', 'payplug' ); ?></label>
567 </th>
568 <td class="forminp">
569 <fieldset>
570 <legend class="screen-reader-text"><span><?php _e( 'Email', 'payplug' ); ?></span></legend>
571 <input class="input-text regular-input" type="text" name="payplug_email" id="payplug_email"
572 value="" placeholder="<?php _e( 'your@email.com', 'payplug' ); ?>"/>
573 </fieldset>
574 </td>
575 </tr>
576 <tr valign="top">
577 <th scope="row" class="titledesc">
578 <label for="payplug_password"><?php _e( 'Password', 'payplug' ); ?></label>
579 </th>
580 <td class="forminp">
581 <fieldset>
582 <legend class="screen-reader-text"><span><?php _e( 'Password', 'payplug' ); ?></span>
583 </legend>
584 <input class="input-text regular-input" type="password" name="payplug_password"
585 id="payplug_password" value=""/>
586 </fieldset>
587 </td>
588 </tr>
589 <tr valign="top">
590 <td class="forminp">
591 <input class="button" type="submit" value="<?php _e( 'Login', 'payplug' ); ?>">
592 <input type="hidden" name="save" value="login">
593 <?php wp_nonce_field( 'payplug_user_login', '_loginaction' ); ?>
594 </td>
595 </tr>
596 </tbody>
597 </table>
598 <?php
599 endif;
600 }
601
602 /**
603 * Process admin options.
604 *
605 * @return bool
606 */
607 public function process_admin_options() {
608 $data = $this->get_post_data();
609
610 // Handle logout process
611 if (
612 isset( $data['submit_logout'] )
613 && false !== check_admin_referer( 'payplug_user_logout', '_logoutaction' )
614 ) {
615
616 $this->permissions->clear_permissions();
617
618 $data = get_option( $this->get_option_key() );
619 $data['payplug_test_key'] = '';
620 $data['payplug_live_key'] = '';
621 $data['payplug_merchant_id'] = '';
622 $data['enabled'] = 'no';
623 $data['mode'] = 'no';
624 $data['oneclick'] = 'no';
625 update_option( $this->get_option_key(),
626 apply_filters( 'woocommerce_settings_api_sanitized_fields_' . $this->id, $data ) );
627 \WC_Admin_Settings::add_message( __( 'Successfully logged out.', 'payplug' ) );
628
629 return true;
630 }
631
632 // Handle login process
633 if (
634 isset( $data['payplug_email'] )
635 && false !== check_admin_referer( 'payplug_user_login', '_loginaction' )
636 ) {
637 $email = $data['payplug_email'];
638 $password = wp_unslash( $data['payplug_password'] );
639 $response = $this->retrieve_user_api_keys( $email, $password );
640 if ( is_wp_error( $response ) ) {
641 \WC_Admin_Settings::add_error( $response->get_error_message() );
642
643 return false;
644 }
645
646 // try to use the api keys to retrieve the merchant id
647 $merchant_id = isset( $response['test'] ) ? $this->retrieve_merchant_id( $response['test'] ) : '';
648
649 $this->init_form_fields();
650 $fields = $this->get_form_fields();
651 $data = [];
652
653 // Load existing values if the user is re-login.
654 foreach ( $fields as $key => $field ) {
655 if ( in_array( $field['type'], [ 'title', 'login' ] ) ) {
656 continue;
657 }
658
659 switch ( $key ) {
660 case 'enabled':
661 $val = 'yes';
662 break;
663 case 'mode':
664 $val = 'no';
665 break;
666 case 'payplug_test_key':
667 $val = esc_attr( $response['test'] );
668 break;
669 case 'payplug_live_key':
670 $val = esc_attr( $response['live'] );
671 break;
672 case 'payplug_merchant_id':
673 $val = esc_attr( $merchant_id );
674 break;
675 case 'email':
676 $val = esc_html( $email );
677 break;
678 default:
679 $val = $this->get_option( $key );
680 }
681
682 $data[ $key ] = $val;
683 }
684
685 $this->set_post_data( $data );
686 update_option( $this->get_option_key(),
687 apply_filters( 'woocommerce_settings_api_sanitized_fields_' . $this->id, $data ) );
688 \WC_Admin_Settings::add_message( __( 'Successfully logged in.', 'payplug' ) );
689
690 return true;
691 }
692
693 // Don't let user without live key leave TEST mode.
694 $mode_fieldkey = $this->get_field_key( 'mode' );
695 $live_key_fieldkey = $this->get_field_key( 'payplug_live_key' );
696 if ( isset( $data[ $mode_fieldkey ] ) && '1' === $data[ $mode_fieldkey ] && empty( $data[ $live_key_fieldkey ] ) ) {
697 $data[ $mode_fieldkey ] = '0';
698 $this->set_post_data( $data );
699 \WC_Admin_Settings::add_error( __( 'Your account does not support LIVE mode at the moment, it must be validated first. If your account has already been validated, please log out and log in again.', 'payplug' ) );
700 }
701
702 // Check user permissions before activating one-click feature.
703 $oneclick_fieldkey = $this->get_field_key( 'oneclick' );
704 if (
705 isset( $data[ $oneclick_fieldkey ] )
706 && '1' === $data[ $oneclick_fieldkey ]
707 && (
708 ! $this->user_logged_in()
709 || false === $this->permissions->has_permissions( PayplugPermissions::SAVE_CARD )
710 )
711 ) {
712 $data[ $oneclick_fieldkey ] = '0';
713 \WC_Admin_Settings::add_error( __( 'Only PREMIUM accounts can enable the One Click option in LIVE mode.', 'payplug' ) );
714 }
715
716 parent::process_admin_options();
717 }
718
719 /**
720 * Process payment.
721 *
722 * @param int $order_id
723 *
724 * @return array
725 * @throws \Exception
726 */
727 public function process_payment( $order_id ) {
728
729 PayplugGateway::log( sprintf( 'Processing payment for order #%s', $order_id ) );
730
731 $order = wc_get_order( $order_id );
732 $customer_id = PayplugWoocommerceHelper::is_pre_30() ? $order->customer_user : $order->get_customer_id();
733 $amount = (int) PayplugWoocommerceHelper::get_payplug_amount( $order->get_total() );
734 $amount = $this->validate_order_amount( $amount );
735 if ( is_wp_error( $amount ) ) {
736 PayplugGateway::log( sprintf( 'Invalid amount %s for the order.', $order->get_total() ), 'error' );
737 throw new \Exception( $amount->get_error_message() );
738 }
739
740 $payment_token_id = ( isset( $_POST[ 'wc-' . $this->id . '-payment-token' ] ) && 'new' !== $_POST[ 'wc-' . $this->id . '-payment-token' ] )
741 ? wc_clean( $_POST[ 'wc-' . $this->id . '-payment-token' ] )
742 : false;
743
744 if ( $payment_token_id && $this->oneclick_available() && (int) $customer_id > 0 ) {
745 PayplugGateway::log( sprintf( 'Payment token found.', $amount ) );
746
747 return $this->process_payment_with_token( $order, $amount, $customer_id, $payment_token_id );
748 }
749
750 return $this->process_standard_payment( $order, $amount, $customer_id );
751 }
752
753 /**
754 * @param \WC_Order $order
755 * @param int $amount
756 * @param int $customer_id
757 *
758 * @return array
759 * @throws \Exception
760 */
761 public function process_standard_payment( $order, $amount, $customer_id ) {
762
763 $order_id = PayplugWoocommerceHelper::is_pre_30() ? $order->id : $order->get_id();
764
765 try {
766 $address_data = PayplugAddressData::from_order( $order );
767
768 $payment_data = [
769 'amount' => $amount,
770 'currency' => get_woocommerce_currency(),
771 'allow_save_card' => $this->oneclick_available() && (int) $customer_id > 0,
772 'billing' => $address_data->get_billing(),
773 'shipping' => $address_data->get_shipping(),
774 'hosted_payment' => [
775 'return_url' => esc_url_raw( $order->get_checkout_order_received_url() ),
776 'cancel_url' => esc_url_raw( $order->get_cancel_order_url_raw() ),
777 ],
778 'notification_url' => esc_url_raw( WC()->api_request_url( 'PayplugGateway' ) ),
779 'metadata' => [
780 'order_id' => $order_id,
781 'customer_id' => ( (int) $customer_id > 0 ) ? $customer_id : 'guest',
782 'domain' => $this->limit_length( esc_url_raw( home_url() ), 500 ),
783 ],
784 ];
785
786 /**
787 * Filter the payment data before it's used
788 *
789 * @param array $payment_data
790 * @param int $order_id
791 * @param array $customer_details
792 * @param PayplugAddressData $address_data
793 */
794 $payment_data = apply_filters( 'payplug_gateway_payment_data', $payment_data, $order_id, [], $address_data );
795 $payment = $this->api->payment_create( $payment_data );
796
797 // Save transaction id for the order
798 PayplugWoocommerceHelper::is_pre_30()
799 ? update_post_meta( $order_id, '_transaction_id', $payment->id )
800 : $order->set_transaction_id( $payment->id );
801
802 if ( is_callable( [ $order, 'save' ] ) ) {
803 $order->save();
804 }
805
806 /**
807 * Fires once a payment has been created.
808 *
809 * @param int $order_id Order ID
810 * @param PaymentResource $payment Payment resource
811 */
812 \do_action( 'payplug_gateway_payment_created', $order_id, $payment );
813
814 $metadata = PayplugWoocommerceHelper::extract_transaction_metadata( $payment );
815 PayplugWoocommerceHelper::save_transaction_metadata( $order, $metadata );
816
817 PayplugGateway::log( sprintf( 'Payment creation complete for order #%s', $order_id ) );
818
819 return [
820 'result' => 'success',
821 'redirect' => $payment->hosted_payment->payment_url,
822 'cancel' => $payment->hosted_payment->cancel_url,
823 ];
824 } catch ( HttpException $e ) {
825 PayplugGateway::log( sprintf( 'Error while processing order #%s : %s', $order_id, wc_print_r( $e->getErrorObject(), true ) ), 'error' );
826 throw new \Exception( __( 'Payment processing failed. Please retry.', 'payplug' ) );
827 } catch ( \Exception $e ) {
828 PayplugGateway::log( sprintf( 'Error while processing order #%s : %s', $order_id, $e->getMessage() ), 'error' );
829 throw new \Exception( __( 'Payment processing failed. Please retry.', 'payplug' ) );
830 }
831 }
832
833 /**
834 * @param \WC_Order $order
835 * @param int $amount
836 * @param int $customer_id
837 * @param string $token_id
838 *
839 * @return array
840 * @throws \Exception
841 */
842 public function process_payment_with_token( $order, $amount, $customer_id, $token_id ) {
843
844 $order_id = PayplugWoocommerceHelper::is_pre_30() ? $order->id : $order->get_id();
845 $payment_token = WC_Payment_Tokens::get( $token_id );
846 if ( ! $payment_token || (int) $customer_id !== (int) $payment_token->get_user_id() ) {
847 PayplugGateway::log( 'Could not find the payment token or the payment doesn\'t belong to the current user.', 'error' );
848 throw new \Exception( __( 'Invalid payment method.', 'payplug' ) );
849 }
850
851 try {
852 $address_data = PayplugAddressData::from_order( $order );
853
854 $payment_data = [
855 'amount' => $amount,
856 'currency' => get_woocommerce_currency(),
857 'payment_method' => $payment_token->get_token(),
858 'billing' => $address_data->get_billing(),
859 'shipping' => $address_data->get_shipping(),
860 'notification_url' => esc_url_raw( WC()->api_request_url( 'PayplugGateway' ) ),
861 'metadata' => [
862 'order_id' => $order_id,
863 'customer_id' => ( (int) $customer_id > 0 ) ? $customer_id : 'guest',
864 'domain' => $this->limit_length( esc_url_raw( home_url() ), 500 ),
865 ],
866 ];
867
868 /** This filter is documented in src/Gateway/PayplugGateway */
869 $payment_data = apply_filters( 'payplug_gateway_payment_data', $payment_data, $order_id, [], $address_data );
870 $payment = $this->api->payment_create( $payment_data );
871
872 /** This action is documented in src/Gateway/PayplugGateway */
873 \do_action( 'payplug_gateway_payment_created', $order_id, $payment );
874
875 $this->response->process_payment( $payment, true );
876
877 PayplugGateway::log( sprintf( 'Payment process complete for order #%s', $order_id ) );
878
879 return [
880 'result' => 'success',
881 'redirect' => $order->get_checkout_order_received_url(),
882 ];
883 } catch ( HttpException $e ) {
884 PayplugGateway::log( sprintf( 'Error while processing order #%s : %s', $order_id, wc_print_r( $e->getErrorObject(), true ) ), 'error' );
885 throw new \Exception( __( 'Payment processing failed. Please retry.', 'payplug' ) );
886 } catch ( \Exception $e ) {
887 PayplugGateway::log( sprintf( 'Error while processing order #%s : %s', $order_id, $e->getMessage() ), 'error' );
888 throw new \Exception( __( 'Payment processing failed. Please retry.', 'payplug' ) );
889 }
890 }
891
892 /**
893 * Process refund for an order paid with PayPlug gateway.
894 *
895 * @param int $order_id
896 * @param null $amount
897 * @param string $reason
898 *
899 * @return bool|\WP_Error
900 */
901 public function process_refund( $order_id, $amount = null, $reason = '' ) {
902
903 PayplugGateway::log( sprintf( 'Processing refund for order #%s', $order_id ) );
904
905 $order = wc_get_order( $order_id );
906 if ( ! $order instanceof \WC_Order ) {
907 PayplugGateway::log( sprintf( 'The order #%s does not exist.', $order_id ), 'error' );
908
909 return new \WP_Error( 'process_refund_error', sprintf( __( 'The order %s does not exist.', 'payplug' ), $order_id ) );
910 }
911
912 $transaction_id = PayplugWoocommerceHelper::is_pre_30() ? get_post_meta( $order_id, '_transaction_id', true ) : $order->get_transaction_id();
913 if ( empty( $transaction_id ) ) {
914 PayplugGateway::log( sprintf( 'The order does not have PayPlug transaction ID associated with it.', $order_id ), 'error' );
915
916 return new \WP_Error( 'process_refund_error', __( 'No PayPlug transaction was found for this order. The refund could not be processed.', 'payplug' ) );
917 }
918
919 $customer_id = PayplugWoocommerceHelper::is_pre_30() ? $order->customer_user : $order->get_customer_id();
920
921 $data = [
922 'metadata' => [
923 'order_id' => $order_id,
924 'customer_id' => ( (int) $customer_id > 0 ) ? $customer_id : 'guest',
925 ]
926 ];
927
928 if ( ! is_null( $amount ) ) {
929 $data['amount'] = PayplugWoocommerceHelper::get_payplug_amount( $amount );
930 }
931
932 if ( ! empty( $reason ) ) {
933 $data['metadata']['reason'] = $reason;
934 }
935
936 /**
937 * Filter the refund data before it's used.
938 *
939 * @param array $data
940 * @param int $order_id
941 * @param string $transaction_id
942 */
943 $data = apply_filters( 'payplug_gateway_refund_data', $data, $order_id, $transaction_id );
944
945 try {
946 $refund = $this->api->refund_create( $transaction_id, $data );
947
948 /**
949 * Fires once a refund has been created.
950 *
951 * @param int $order_id Order ID
952 * @param RefundResource $refund Refund resource
953 * @param string $transaction_id Transaction id
954 */
955 \do_action( 'payplug_gateway_refund_created', $order_id, $refund, $transaction_id );
956
957 $refund_meta_key = sprintf( '_pr_%s', wc_clean( $refund->id ) );
958 if ( PayplugWoocommerceHelper::is_pre_30() ) {
959 update_post_meta( $order_id, $refund_meta_key, $refund->id );
960 } else {
961 $order->add_meta_data( $refund_meta_key, $refund->id, true );
962 $order->save();
963 }
964
965 $note = sprintf( __( 'Refund %s : Refunded %s', 'payplug' ), wc_clean( $refund->id ), wc_price( ( (int) $refund->amount ) / 100 ) );
966 if ( ! empty( $refund->metadata['reason'] ) ) {
967 $note .= sprintf( ' (%s)', esc_html( $refund->metadata['reason'] ) );
968 }
969 $order->add_order_note( $note );
970
971 try {
972 $payment = $this->api->payment_retrieve( $transaction_id );
973 $metadata = PayplugWoocommerceHelper::extract_transaction_metadata( $payment );
974 PayplugWoocommerceHelper::save_transaction_metadata( $order, $metadata );
975 } catch ( \Exception $e ) {
976 }
977
978 PayplugGateway::log( 'Refund process complete for the order.' );
979
980 return true;
981 } catch ( HttpException $e ) {
982 PayplugGateway::log( sprintf( 'Refund request error for the order %s from PayPlug API : %s', $order_id, wc_print_r( $e->getErrorObject(), true ) ), 'error' );
983
984 return new \WP_Error( 'process_refund_error', __( 'The transaction could not be refunded. Please try again.', 'payplug' ) );
985 } catch ( \Exception $e ) {
986 PayplugGateway::log( sprintf( 'Refund request error for the order %s : %s', $order_id, wc_clean( $e->getMessage() ) ), 'error' );
987
988 return new \WP_Error( 'process_refund_error', __( 'The transaction could not be refunded. Please try again.', 'payplug' ) );
989 }
990 }
991
992 /**
993 * Check the order amount to ensure it's on the allowed range.
994 *
995 * @param int $amount
996 *
997 * @return int|\WP_Error
998 */
999 public function validate_order_amount( $amount ) {
1000 if (
1001 $amount < PayplugWoocommerceHelper::get_minimum_amount()
1002 || $amount > PayplugWoocommerceHelper::get_maximum_amount()
1003 ) {
1004 return new \WP_Error(
1005 'invalid order amount',
1006 sprintf( __( 'Payments for this amount (%s) are not authorised with this payment gateway.', 'payplug' ), \wc_price( $amount / 100 ) )
1007 );
1008 }
1009
1010 return $amount;
1011 }
1012
1013 /**
1014 * Limit string length.
1015 *
1016 * @param string $value
1017 * @param int $maxlength
1018 *
1019 * @return string
1020 */
1021 public function limit_length( $value, $maxlength = 100 ) {
1022 return ( strlen( $value ) > $maxlength ) ? substr( $value, 0, $maxlength ) : $value;
1023 }
1024
1025 /**
1026 * Get user's keys.
1027 *
1028 * @param string $email
1029 * @param string $password
1030 *
1031 * @return array|\WP_Error
1032 */
1033 public function retrieve_user_api_keys( $email, $password ) {
1034 if ( empty( $email ) || empty( $password ) ) {
1035 return new \WP_Error( 'missing_login_data', __( 'Please fill all login fields', 'payplug' ) );
1036 }
1037
1038 try {
1039 $response = Authentication::getKeysByLogin( $email, $password );
1040 if ( empty( $response ) || ! isset( $response['httpResponse'] ) ) {
1041 return new \WP_Error( 'invalid_credentials', __( 'Invalid credentials.', 'payplug' ) );
1042 }
1043
1044 return $response['httpResponse']['secret_keys'];
1045 } catch ( HttpException $e ) {
1046 return new \WP_Error( 'invalid_credentials', __( 'Invalid credentials.', 'payplug' ) );
1047 }
1048 }
1049
1050 /**
1051 * Get user merchant id.
1052 *
1053 * This method might be called during the login process before the global PayPlug
1054 * configuration is set. In that case you can pass a valid token to make the request.
1055 *
1056 * @param string|null $key
1057 *
1058 * @return string
1059 */
1060 public function retrieve_merchant_id( $key = null ) {
1061 try {
1062 $response = ! is_null( $key ) ? Authentication::getAccount( new Payplug( $key ) ) : Authentication::getAccount();
1063 $merchant_id = isset( $response['httpResponse']['id'] ) ? $response['httpResponse']['id'] : '';
1064 } catch ( ConfigurationException $e ) {
1065 PayplugGateway::log( sprintf( 'Missing API key for PayPlug client : %s', wc_print_r( $e->getMessage(), true ) ), 'error' );
1066
1067 $merchant_id = '';
1068 } catch ( HttpException $e ) {
1069 PayplugGateway::log( sprintf( 'Account request error from PayPlug API : %s', wc_print_r( $e->getErrorObject(), true ) ), 'error' );
1070
1071 $merchant_id = '';
1072 } catch ( \Exception $e ) {
1073 PayplugGateway::log( sprintf( 'Account request error : %s', wc_clean( $e->getMessage() ) ), 'error' );
1074
1075 $merchant_id = '';
1076 }
1077
1078 return $merchant_id;
1079 }
1080
1081 /**
1082 * Generate Hidden HTML.
1083 *
1084 * @param string $key
1085 * @param array $data
1086 *
1087 * @return string
1088 */
1089 public function generate_hidden_html( $key, $data ) {
1090 $field_key = $this->get_field_key( $key );
1091 $defaults = array(
1092 'title' => '',
1093 'disabled' => false,
1094 'class' => '',
1095 'css' => '',
1096 'placeholder' => '',
1097 'type' => 'text',
1098 'desc_tip' => false,
1099 'description' => '',
1100 'custom_attributes' => array(),
1101 );
1102
1103 $data = wp_parse_args( $data, $defaults );
1104
1105 ob_start();
1106 ?>
1107 <input
1108 type="<?php echo esc_attr( $data['type'] ); ?>" name="<?php echo esc_attr( $field_key ); ?>"
1109 id="<?php echo esc_attr( $field_key ); ?>"
1110 value="<?php echo esc_attr( $this->get_option( $key ) ); ?>"/>
1111 <?php
1112
1113 return ob_get_clean();
1114 }
1115
1116 /**
1117 * Generate Yes/No Input HTML.
1118 *
1119 * @param string $key
1120 * @param array $data
1121 *
1122 * @return string
1123 */
1124 public function generate_yes_no_html( $key, $data ) {
1125 $field_key = $this->get_field_key( $key );
1126 $defaults = array(
1127 'title' => '',
1128 'no' => 'No',
1129 'yes' => 'Yes',
1130 'disabled' => false,
1131 'class' => '',
1132 'css' => '',
1133 'placeholder' => '',
1134 'type' => 'text',
1135 'desc_tip' => false,
1136 'description' => '',
1137 'custom_attributes' => [],
1138 'hide_label' => false,
1139 );
1140
1141 $data = wp_parse_args( $data, $defaults );
1142 $checked = 'yes' === $this->get_option( $key ) ? '1' : '0';
1143
1144 ob_start();
1145 ?>
1146 <tr valign="top">
1147 <?php if ( ! $data['hide_label'] ) : ?>
1148 <th scope="row" class="titledesc">
1149 <label for="<?php echo esc_attr( $field_key ); ?>">
1150 <?php echo wp_kses_post( $data['title'] ); ?>
1151 <?php echo $this->get_tooltip_html( $data ); ?>
1152 </label>
1153 </th>
1154 <?php endif; ?>
1155 <td class="forminp">
1156 <fieldset>
1157 <legend class="screen-reader-text"><span><?php echo wp_kses_post( $data['title'] ); ?></span>
1158 </legend>
1159 <div class="radio--custom">
1160 <input class="radio radio-yes <?php echo esc_attr( $data['class'] ); ?>"
1161 type="radio"
1162 name="<?php echo esc_attr( $field_key ); ?>"
1163 id="<?php echo esc_attr( $field_key ); ?>-yes"
1164 value="1"
1165 <?php checked( '1', $checked ); ?>
1166 <?php disabled( $data['disabled'], true ); ?>
1167 <?php echo $this->get_custom_attribute_html( $data ); ?>>
1168 <label for="<?php echo esc_attr( $field_key ); ?>-yes"><?php echo esc_html( $data['yes'] ); ?></label>
1169 </div>
1170 <div class="radio--custom">
1171 <input class="radio radio-no <?php echo esc_attr( $data['class'] ); ?>"
1172 type="radio"
1173 name="<?php echo esc_attr( $field_key ); ?>"
1174 id="<?php echo esc_attr( $field_key ); ?>-no"
1175 value="0"
1176 <?php checked( '0', $checked ); ?>
1177 <?php disabled( $data['disabled'], true ); ?>
1178 <?php echo $this->get_custom_attribute_html( $data ); ?>>
1179 <label for="<?php echo esc_attr( $field_key ); ?>-no"><?php echo esc_html( $data['no'] ); ?></label>
1180 </div>
1181 <?php echo $this->get_description_html( $data ); ?>
1182 </fieldset>
1183 </td>
1184 </tr>
1185 <?php
1186
1187 return ob_get_clean();
1188 }
1189
1190 /**
1191 * Generate Radio Input HTML.
1192 *
1193 * @param string $key
1194 * @param array $data
1195 *
1196 * @return string
1197 */
1198 public function generate_radio_html( $key, $data ) {
1199 $field_key = $this->get_field_key( $key );
1200 $defaults = array(
1201 'title' => '',
1202 'disabled' => false,
1203 'class' => '',
1204 'css' => '',
1205 'placeholder' => '',
1206 'type' => 'text',
1207 'desc_tip' => false,
1208 'description' => '',
1209 'custom_attributes' => [],
1210 'options' => [],
1211 );
1212
1213 $data = wp_parse_args( $data, $defaults );
1214
1215 ob_start();
1216 ?>
1217 <tr valign="top">
1218 <th scope="row" class="titledesc">
1219 <label for="<?php echo esc_attr( $field_key ); ?>">
1220 <?php echo wp_kses_post( $data['title'] ); ?>
1221 <?php echo $this->get_tooltip_html( $data ); ?>
1222 </label>
1223 </th>
1224 <td class="forminp">
1225 <fieldset>
1226 <legend class="screen-reader-text"><span><?php echo wp_kses_post( $data['title'] ); ?></span>
1227 </legend>
1228 <?php foreach ( $data['options'] as $option_key => $option_value ) : ?>
1229 <input class="radio <?php echo esc_attr( $data['class'] ); ?>"
1230 type="radio"
1231 name="<?php echo esc_attr( $field_key ); ?>"
1232 id="<?php echo esc_attr( $field_key ); ?>-<?php echo esc_attr( $option_key ); ?>"
1233 value="<?php echo esc_attr( $option_key ); ?>"
1234 <?php checked( $option_key, $this->get_option( $key ) ); ?>
1235 <?php disabled( $data['disabled'], true ); ?>
1236 <?php echo $this->get_custom_attribute_html( $data ); ?>>
1237 <label for="<?php echo esc_attr( $field_key ); ?>-<?php echo esc_attr( $option_key ); ?>"><?php echo esc_html( $option_value ); ?></label>
1238 <?php endforeach; ?>
1239 </fieldset>
1240 </td>
1241 </tr>
1242 <?php
1243
1244 return ob_get_clean();
1245 }
1246
1247 /**
1248 * Generate Login HTML.
1249 *
1250 * @param string $key
1251 * @param array $data
1252 *
1253 * @return string
1254 */
1255 public function generate_login_html( $key, $data ) {
1256 $field_key = $this->get_field_key( $key );
1257 $defaults = [];
1258
1259 $data = wp_parse_args( $data, $defaults );
1260
1261 ob_start();
1262 ?>
1263 <tr valign="top">
1264 <td class="forminp">
1265 <p><?php echo $this->get_option( 'email' ); ?></p>
1266 <p>
1267 <input type="submit" name="submit_logout" value="<?php _e( 'Logout', 'payplug' ); ?>">
1268 <input type="hidden" name="save" value="logout">
1269 <?php wp_nonce_field( 'payplug_user_logout', '_logoutaction' ); ?>
1270 |
1271 <a href="https://portal.payplug.com"
1272 target="_blank"><?php _e( 'Go to your PayPlug Portal', 'payplug' ); ?></a>
1273 </p>
1274 </td>
1275 </tr>
1276 <?php
1277
1278 return ob_get_clean();
1279 }
1280
1281 /**
1282 * Validate Radio Field.
1283 *
1284 * Make sure the data is escaped correctly, etc.
1285 *
1286 * @param string $key
1287 * @param string|null $value Posted Value
1288 *
1289 * @return string
1290 */
1291 public function validate_radio_field( $key, $value ) {
1292 $value = is_null( $value ) ? '' : $value;
1293
1294 return wc_clean( stripslashes( $value ) );
1295 }
1296
1297 /**
1298 * Validate Yes/No Field.
1299 *
1300 * @param string $key
1301 * @param string $value Posted Value
1302 *
1303 * @return string
1304 */
1305 public function validate_yes_no_field( $key, $value ) {
1306 return ( '1' === (string) $value ) ? 'yes' : 'no';
1307 }
1308
1309 /**
1310 * Get PayPlug gateway mode.
1311 *
1312 * @return string
1313 */
1314 public function get_current_mode() {
1315 return ( 'yes' === $this->get_option( 'mode' ) ) ? 'live' : 'test';
1316 }
1317
1318 /**
1319 * Get user API key.
1320 *
1321 * @param string $mode
1322 *
1323 * @return string
1324 */
1325 public function get_api_key( $mode = 'test' ) {
1326
1327 switch ( $mode ) {
1328 case 'test':
1329 $key = $this->get_option( 'payplug_test_key' );
1330 break;
1331 case 'live':
1332 $key = $this->get_option( 'payplug_live_key' );
1333 break;
1334 default:
1335 $key = '';
1336 break;
1337 }
1338
1339 return $key;
1340 }
1341
1342 /**
1343 * Check if an api key exist for a mode.
1344 *
1345 * @param string $mode
1346 *
1347 * @return bool
1348 */
1349 public function has_api_key( $mode = 'test' ) {
1350 $key = $this->get_api_key( $mode );
1351 $key = trim( $key );
1352
1353 return ! empty( $key );
1354 }
1355
1356 /**
1357 * Get current merchant id.
1358 *
1359 * @return string
1360 */
1361 public function get_merchant_id() {
1362 return $this->get_option( 'payplug_merchant_id', '' );
1363 }
1364
1365 /**
1366 * Check if user is logged in and we have an API key for TEST mode.
1367 *
1368 * @return bool
1369 */
1370 public function user_logged_in() {
1371 return ! empty( $this->get_option( 'payplug_test_key' ) );
1372 }
1373
1374 /**
1375 * Check if oneclick payment is activated and merchant can use it.
1376 *
1377 * @return bool
1378 */
1379 public function oneclick_available() {
1380 return $this->user_logged_in()
1381 && $this->oneclick
1382 && $this->permissions->has_permissions( PayplugPermissions::SAVE_CARD );
1383 }
1384 }
1385