File "class-kco-confirmation.php"
Full Path: /home/siazco/grocery.siazco.se/wp-content/plugins/klarna-checkout-for-woocommerce/classes/class-kco-confirmation.php
File size: 4.29 KB
MIME-type: text/x-php
Charset: utf-8
<?php
/**
* Confirmation class.
*
* @package Klarna_Checkout/Classes
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
/**
* KCO_Confirmation class.
*
* Class that handles the confirmation step.
*/
class KCO_Confirmation {
/**
* The reference the *Singleton* instance of this class.
*
* @var $instance
*/
protected static $instance;
/**
* Returns the *Singleton* instance of this class.
*
* @return self::$instance The *Singleton* instance.
*/
public static function get_instance() {
if ( null === self::$instance ) {
self::$instance = new self();
}
return self::$instance;
}
/**
* Class constructor
*/
public function __construct() {
add_action( 'init', array( $this, 'confirm_order' ), 999 );
add_action( 'init', array( $this, 'check_if_external_payment' ) );
}
/**
* Redirects the customer to the proper thank you page.
*
* @return void
*/
public function confirm_order() {
$kco_confirm = filter_input( INPUT_GET, 'kco_confirm', FILTER_SANITIZE_FULL_SPECIAL_CHARS );
$klarna_order_id = filter_input( INPUT_GET, 'kco_order_id', FILTER_SANITIZE_FULL_SPECIAL_CHARS );
$order_id = filter_input( INPUT_GET, 'order_id', FILTER_SANITIZE_NUMBER_INT );
$order_key = filter_input( INPUT_GET, 'key', FILTER_SANITIZE_FULL_SPECIAL_CHARS );
// Return if we don't have our parameters set.
if ( empty( $kco_confirm ) || empty( $klarna_order_id ) || empty( $order_key ) ) {
return;
}
if ( ! empty( $order_id ) ) {
$order = wc_get_order( $order_id );
$order_id = ! empty( $order ) && hash_equals( $order->get_order_key(), $order_key ) ? absint( $order_id ) : wc_get_order_id_by_order_key( $order_key );
} else {
$order_id = wc_get_order_id_by_order_key( $order_key );
}
// Return if we cant find an order id.
if ( empty( $order_id ) ) {
return;
}
// Confirm the order.
KCO_Logger::log( $klarna_order_id . ': Confirm the klarna order from the confirmation page.' );
kco_confirm_klarna_order( $order_id, $klarna_order_id );
kco_unset_sessions();
}
/**
* Checks if we have an external payment method on page load.
*
* @return void
*/
public function check_if_external_payment() {
$epm = filter_input( INPUT_GET, 'kco-external-payment', FILTER_SANITIZE_FULL_SPECIAL_CHARS );
$order_id = filter_input( INPUT_GET, 'order_id', FILTER_SANITIZE_FULL_SPECIAL_CHARS );
$klarna_order_id = filter_input( INPUT_GET, 'kco_order_id', FILTER_SANITIZE_FULL_SPECIAL_CHARS );
if ( ! empty( $epm ) ) {
$this->run_kepm( $epm, $order_id, $klarna_order_id );
}
}
/**
* Initiates a Klarna External Payment Method payment.
*
* @param string $epm The name of the external payment method.
* @param string $order_id The WooCommerce order id.
* @param string $klarna_order_id The Klarna order id.
* @return void
*/
public function run_kepm( $epm, $order_id, $klarna_order_id ) {
$order = wc_get_order( $order_id );
// Try to retrieve the WC_Order using the Klarna order id.
if ( empty( $order ) && ! empty( $klarna_order_id ) ) {
$order = kco_get_order_by_klarna_id( $klarna_order_id, '2 day ago' );
if ( ! empty( $order ) ) {
$order_id = $order->get_id();
}
}
// Check if we have a order.
if ( empty( $order ) ) {
wc_print_notice( __( 'Failed getting the order for the external payment.', 'klarna-checkout-for-woocommerce' ), 'error' );
return;
}
$payment_methods = WC()->payment_gateways->get_available_payment_gateways();
// Check if the payment method is available.
if ( ! isset( $payment_methods[ $epm ] ) ) {
wc_print_notice( __( 'Failed to find the payment method for the external payment.', 'klarna-checkout-for-woocommerce' ), 'error' );
return;
}
// Everything is fine, redirect to the URL specified by the gateway.
WC()->session->set( 'chosen_payment_method', $epm );
$order->set_payment_method( $payment_methods[ $epm ] );
$order->save();
$result = $payment_methods[ $epm ]->process_payment( $order_id );
// Check if the result is good.
if ( ! isset( $result['result'] ) || 'success' !== $result['result'] ) {
wc_print_notice( __( 'Something went wrong with the external payment. Please try again', 'klarna-checkout-for-woocommerce' ), 'error' );
return;
}
wp_redirect( $result['redirect'] ); // phpcs:ignore
exit;
}
}
KCO_Confirmation::get_instance();