/** * Process an initial subscription payment if the order contains a * subscription, otherwise use the parent::process_payment() method * * @since 1.4 * @param int $order_id the order identifier * @return array */ public function process_payment($order_id) { require_once 'class-wc-realex-api.php'; // processing subscription (which means we are ineligible for 3DSecure for now) if (SV_WC_Plugin_Compatibility::is_wc_subscriptions_version_gte_2_0() ? wcs_order_contains_subscription($order_id) : WC_Subscriptions_Order::order_contains_subscription($order_id)) { $order = wc_get_order($order_id); // redirect to payment page for payment if 3D secure is enabled if ($this->get_threedsecure()->is_3dsecure_available() && !SV_WC_Helper::get_post('woocommerce_pay_page')) { // empty cart before redirecting from Checkout page WC()->cart->empty_cart(); // redirect to payment page to continue payment return array('result' => 'success', 'redirect' => $order->get_checkout_payment_url(true)); } $order->payment_total = SV_WC_Helper::number_format(SV_WC_Plugin_Compatibility::is_wc_subscriptions_version_gte_2_0() ? $order->get_total() : WC_Subscriptions_Order::get_total_initial_payment($order)); // create the realex api client $realex_client = new Realex_API($this->get_endpoint_url(), $this->get_realvault_endpoint_url(), $this->get_shared_secret()); // create the customer/cc tokens, and authorize the initial payment amount, if any $result = $this->authorize($realex_client, $order); // subscription with initial payment, everything is now taken care of if (is_array($result)) { // for Subscriptions 2.0.x, save payment token to subscription object if (SV_WC_Plugin_Compatibility::is_wc_subscriptions_version_gte_2_0()) { // a single order can contain multiple subscriptions foreach (wcs_get_subscriptions_for_order($order->id) as $subscription) { // payment token update_post_meta($subscription->id, '_realex_cardref', get_post_meta($order->id, '_realex_cardref', true)); } } return $result; } // otherwise there was no initial payment, so we mark the order as complete, etc if ($order->payment_total == 0) { // mark order as having received payment $order->payment_complete(); WC()->cart->empty_cart(); return array('result' => 'success', 'redirect' => $this->get_return_url($order)); } } else { // processing regular product return parent::process_payment($order_id); } }
/** * Pay page tokenized payment method checkout process, adapted from * WooCommerce core * * @since 1.7.1 */ public function process_checkout() { $wc_gateway_realex = new WC_Gateway_Realex(); // Validate $wc_gateway_realex->validate_fields(); // Process if (SV_WC_Helper::wc_notice_count('error') == 0) { // Process Payment $result = $wc_gateway_realex->process_payment($_POST['order_id']); // Redirect to success/confirmation/payment page if ('success' == $result['result']) { $result = apply_filters('woocommerce_payment_successful_result', $result); if (is_ajax()) { echo '<!--WC_START-->' . json_encode($result) . '<!--WC_END-->'; exit; } else { wp_redirect($result['redirect']); exit; } } } // If we reached this point then there were errors if (is_ajax()) { ob_start(); wc_print_notices(); $messages = ob_get_clean(); $response = array('result' => 'failure', 'messages' => isset($messages) ? $messages : ''); wp_send_json($response); exit; } }