/**
  * Cancel a pending order.
  */
 public function cancel_order()
 {
     if (isset($_GET['cancel_order']) && isset($_GET['order']) && isset($_GET['order_id'])) {
         $order_key = $_GET['order'];
         $order_id = absint($_GET['order_id']);
         $order = new WC_Order($order_id);
         $user_can_cancel = current_user_can('cancel_order', $order_id);
         $order_can_cancel = in_array($order->status, apply_filters('woocommerce_valid_order_statuses_for_cancel', array('pending', 'failed')));
         $redirect = $_GET['redirect'];
         if ($order->status == 'cancelled') {
             // Already cancelled - take no action
         } elseif ($user_can_cancel && $order_can_cancel && $order->id == $order_id && $order->order_key == $order_key && isset($_GET['_wpnonce']) && wp_verify_nonce($_GET['_wpnonce'], 'woocommerce-cancel_order')) {
             // Cancel the order + restore stock
             $order->cancel_order(__('Order cancelled by customer.', 'woocommerce'));
             // Message
             wc_add_notice(apply_filters('woocommerce_order_cancelled_notice', __('Your order was cancelled.', 'woocommerce')), apply_filters('woocommerce_order_cancelled_notice_type', 'notice'));
             do_action('woocommerce_cancelled_order', $order->id);
         } elseif ($user_can_cancel && !$order_can_cancel) {
             wc_add_notice(__('Your order can no longer be cancelled. Please contact us if you need assistance.', 'woocommerce'), 'error');
         } else {
             wc_add_notice(__('Invalid order.', 'woocommerce'), 'error');
         }
         if ($redirect) {
             wp_safe_redirect($redirect);
             exit;
         }
     }
 }
/**
 * Cancel a pending order.
 *
 * @access public
 * @return void
 */
function woocommerce_cancel_order()
{
    global $woocommerce;
    if (isset($_GET['cancel_order']) && isset($_GET['order']) && isset($_GET['order_id'])) {
        $order_key = urldecode($_GET['order']);
        $order_id = (int) $_GET['order_id'];
        $order = new WC_Order($order_id);
        if ($order->id == $order_id && $order->order_key == $order_key && in_array($order->status, array('pending', 'failed')) && $woocommerce->verify_nonce('cancel_order', '_GET')) {
            // Cancel the order + restore stock
            $order->cancel_order(__('Order cancelled by customer.', 'woocommerce'));
            // Message
            $woocommerce->add_message(__('Your order was cancelled.', 'woocommerce'));
            do_action('woocommerce_cancelled_order', $order->id);
        } elseif ($order->status != 'pending') {
            $woocommerce->add_error(__('Your order is no longer pending and could not be cancelled. Please contact us if you need assistance.', 'woocommerce'));
        } else {
            $woocommerce->add_error(__('Invalid order.', 'woocommerce'));
        }
        wp_safe_redirect($woocommerce->cart->get_cart_url());
        exit;
    }
}
/**
 * EBANX notification action - gets called when a payment is updated
 * @return void
 */
function ebanx_notify_response()
{
    $ebanxWC = new WC_Gateway_Ebanx();
    $hashes = isset($_REQUEST['hash_codes']) ? $_REQUEST['hash_codes'] : null;
    if (!isset($hashes)) {
        echo 'NOK: no hashes were sent.';
        return;
    }
    $hashes = explode(',', $hashes);
    foreach ($hashes as $hash) {
        try {
            $response = \Ebanx\Ebanx::doQuery(array('hash' => $hash));
            if (isset($response->status) && $response->status == 'SUCCESS') {
                $orderId = (int) $response->payment->order_number;
                $order = new WC_Order($orderId);
                if ($order) {
                    if ($response->payment->status == 'CA') {
                        $order->add_order_note('Payment cancelled via IPN.');
                        $order->cancel_order();
                        echo "OK: Payment {$hash} was cancelled via IPN";
                    } elseif ($response->payment->status == 'CO') {
                        $order->add_order_note(__('EBANX payment completed, Hash: ' . $response->payment->hash, 'woocommerce'));
                        $order->payment_complete($response->payment->order_number);
                        echo "OK: Payment {$hash} was completed";
                    } elseif ($response->payment->status == 'OP' || $response->payment->status == 'PE') {
                        echo "SKIP: Payment {$hash} is pending.";
                    }
                } else {
                    echo "NOK: payment {$hash} was not found.";
                }
            }
        } catch (Exception $e) {
            echo "NOK: payment {$hash} threw an exception => " . $e->getMessage();
        }
    }
    exit;
}
 /**
  * Expires a single subscription on a users account.
  *
  * @param $user_id int The id of the user who owns the expiring subscription. 
  * @param $subscription_key string A subscription key of the form obtained by @see get_subscription_key( $order_id, $product_id )
  * @since 1.0
  */
 public static function process_subscription_payment_failure($user_id, $subscription_key)
 {
     // Store a record of the subscription payment date
     $subscription = self::get_users_subscription($user_id, $subscription_key);
     $subscription['failed_payments'] = $subscription['failed_payments']++;
     self::update_users_subscriptions($user_id, array($subscription_key => $subscription));
     $order = new WC_Order($subscription['order_id']);
     // We've reached the maximum failed payments allowed on the subscription
     if ($subscription['failed_payments'] >= get_option(WC_Subscriptions_Admin::$option_prefix . '_max_failed_payments')) {
         self::cancel_subscription($user_id, $subscription_key);
         $order->cancel_order(__('Maximum number of failed payments reached.', WC_Subscriptions::$text_domain));
         if ('yes' == get_option(WC_Subscriptions_Admin::$option_prefix . '_generate_renewal_order')) {
             WC_Subscriptions_Order::generate_renewal_order($subscription['order_id'], $subscription['product_id']);
         }
     } else {
         // Log payment failure on order
         $order->add_order_note(sprintf(__('Payment failed for subscription %s', WC_Subscriptions::$text_domain), $subscription_key));
     }
     do_action('processed_subscription_payment_failure', $user_id, $subscription_key);
 }
 /**
  *   This is the callback we declared
  *   For sanity we respond HTTP Status 200
  *   You should only print if necesary
  */
 function check_response()
 {
     global $woocommerce;
     global $wpdb;
     error_log("check_response");
     // Load the settings.
     $this->init_settings();
     if ($_POST) {
         error_log("check_response... " . $_POST['action']);
         if ($_POST['action'] === 'openpay_pay_creditcard') {
             $this->openpay_pay_creditcard();
             $order = new WC_Order($_POST["order-id"]);
             $order->update_status('on-hold', 'En espera de pago');
             $order->reduce_order_stock();
             $woocommerce->cart->empty_cart();
             //exit();
             wp_redirect($this->get_return_url($order));
         } elseif ($_POST['action'] === 'openpay_pay_store') {
             $this->openpay_pay_store();
             $order = new WC_Order($_POST["order-id"]);
             $order->update_status('on-hold', 'En espera de pago');
             $order->reduce_order_stock();
             $woocommerce->cart->empty_cart();
             exit;
             wp_redirect($this->get_return_url($order));
         } elseif ($_POST['action'] === 'openpay_pay_transfer') {
             $this->openpay_pay_transfer();
             $order = new WC_Order($_POST["order-id"]);
             $order->update_status('on-hold', 'En espera de pago');
             $order->reduce_order_stock();
             $woocommerce->cart->empty_cart();
             exit;
             wp_redirect($this->get_return_url($order));
         }
     } else {
         header('Content-Type: application/json;charset=utf-8;');
         $data = json_decode(file_get_contents('php://input'));
         $order = new WC_Order($data->transaction->order_id);
         $fetchOption = get_option('openpay_code_private');
         if (update_option('openpay_code_private', $data->verification_code)) {
             $fetchOption2 = " Yes | ";
         } else {
             $fetchOption2 = " No | ";
         }
         $fetchOption2 .= get_option('openpay_code_private');
         $comma_delmited_list = "Response: " . print_r($data, true) . "\n Data:" . print_r($fetchOption, true) . " " . print_r($fetchOption2, true);
         $fp = fopen("array.txt", "a");
         if ($fp == false) {
             //do debugging or logging here
         } else {
             fwrite($fp, $comma_delmited_list);
             fclose($fp);
         }
         if ($data->verification_code) {
             wp_die("Openpay IPN Request Verification Code ->" . $data->verification_code, "Openpay IPN", array('response' => 200));
         } else {
             $status = "";
             $note = "";
             $flag = 0;
             switch ($data->type) {
                 case "charge.succeeded":
                     $order->update_status('processing', "Pago recibido por " . $data->transaction->amount . " id de transacción Openpay " . $data->transaction->id, false);
                     //$order->payment_complete();
                     break;
                 case "charge.cancelled":
                     $order->cancel_order("La orden se cancelo por falta de pago, id Openpay  " . $data->transaction->id);
                     break;
                 case "charge.refunded":
                     $order->add_order_note("El pago se devolcio en Openpay, favor de marcar la orden como cancelada", false);
                     //No se hace nada ya que se tiene que registrar el refund en woocomerce de forma manual
                     break;
             }
             $pays_table = $wpdb->prefix . 'woocommerce_openpay_pays';
             $wpdb->insert($pays_table, array('ID_ORDER' => $data->transaction->order_id, 'ID_OPENPAY_CHARGE' => $data->transaction->id, 'METHOD' => $data->transaction->method, 'STATUS' => $data->transaction->status, 'TYPE' => $data->type, 'CREATED' => $data->event_date), array('%d', '%s', '%s', '%s', '%s'));
             wp_die("Openpay IPN Request Failure", "Openpay IPN", array('response' => 200));
         }
     }
 }
 private static function cancelOrder($order_id)
 {
     if (function_exists('wc_get_order')) {
         $order = wc_get_order($order_id);
     } else {
         $order = new WC_Order($order_id);
     }
     $order->cancel_order('Coupon Error');
 }
 /**
  * PayU Error response
  *
  * @access public
  * @param $_GET
  * @return void
  */
 function payu_error()
 {
     $posted = stripslashes_deep($_GET);
     $order_ref = explode("-", $posted['order_ref']);
     $order_id = $order_ref[0];
     $order = new WC_Order($order_id);
     $order->cancel_order(__('Cancelled payment.', 'wc-payu'));
     wc_add_notice(__('You rejected the payment or the transaction has expired.', 'wc-payu'), 'error');
     if ($this->debug == 'yes') {
         $this->log->add('payu', sprintf(__('Cancelled payment. ID: %s', 'wc-payu'), $order_id));
     }
     $url = $order->get_cancel_order_url();
     wp_redirect($url);
 }