/** * Verifies that a pending order is actually valid and has been paid for. * If the pending order is valid, it will return the order status that the * order should be set to. Returns false if the order is invalid. * * @param string The token for the pending order. * @return mixed Integer for the order status if the order is valid, false if invalid. */ function VerifyPendingOrder($pendingOrderToken) { $status = false; $orderData = LoadPendingOrdersByToken($pendingOrderToken); if($orderData === false) { return false; } // This order was paid for entirely using a gift certificate, it's automatically valid if($orderData['paymentmethod'] == "giftcertificate") { $status = ORDER_STATUS_AWAITING_FULFILLMENT; } // This order was paid for entirely using store credit, it's automatically valid else if($orderData['paymentmethod'] == "storecredit") { $status = ORDER_STATUS_AWAITING_FULFILLMENT; } // Don't have to pay for this order because the total is $0.00 else if($orderData['total'] == 0 && $orderData['paymentmethod'] == '') { $status = ORDER_STATUS_AWAITING_FULFILLMENT; } // Otherwise we went through a payment gateway else { // Invalid payment module - this is an invalid order if(!GetModuleById('checkout', $provider, $orderData['paymentmodule'])) { return false; } // If we have a payment provider that needs to validate the payment // do so. if($provider->GetPaymentType() != PAYMENT_PROVIDER_OFFLINE) { $provider->SetOrderData($orderData); // This module doesn't support the new VerifyOrderPayment method (kept for backwards compat.) if(method_exists($provider, 'VerifyOrder')) { // Grab the first order $order = current($orderData['orders']); // Order is invalid if(!$provider->VerifyOrder($order)) { return false; } if(isset($order['paymentstatus'])) { $paymentStatus = $order['paymentstatus']; } } // Otherwise, use the VerifyOrderPayment method to validate the entire order else { // Order is invalid if(!$provider->VerifyOrderPayment()) { return false; } // Get the payment status for this order if($provider->GetPaymentStatus() !== false) { $paymentStatus = $provider->GetPaymentStatus(); } } // Did we have a payment status? if(isset($paymentStatus)) { $status = GetOrderStatusFromPaymentStatus($paymentStatus); } } // Offline provider, so the payment is valid else { $status = ORDER_STATUS_AWAITING_PAYMENT; } } return $status; }
/** * Process details for a particular payment gateway inline. */ private function ProcessOrderPayment() { // ensure products are in stock $this->CheckStockLevels(); $order_token = ""; if(isset($_COOKIE['SHOP_ORDER_TOKEN'])) { $order_token = $_COOKIE['SHOP_ORDER_TOKEN']; } // If the order token is empty then something has gone wrong. if($order_token == '') { @ob_end_clean(); header("Location: ".$GLOBALS['ShopPathSSL']."/checkout.php?action=confirm_order"); die(); } // Load the pending order $orders = LoadPendingOrdersByToken($order_token); if(!is_array($orders)) { @ob_end_clean(); header("Location: ".$GLOBALS['ShopPathSSL']."/checkout.php?action=confirm_order"); die(); } if ($orders['status'] != ORDER_STATUS_INCOMPLETE) { // has this order already been completed? redirect to finish order @ob_end_clean(); header("Location: ".$GLOBALS['ShopPathSSL']."/finishorder.php"); die(); } // Get the payment module if(!GetModuleById('checkout', $provider, $orders['paymentmodule'])) { @ob_end_clean(); header("Location: ".$GLOBALS['ShopPathSSL']."/checkout.php?action=confirm_order"); die(); } $provider->SetOrderData($orders); if(isset($_SESSION['CHECKOUT']['ProviderListHTML']) && method_exists($provider, 'DoExpressCheckoutPayment')) { $provider->DoExpressCheckoutPayment(); die(); } // Does this method have it's own processing method? if(method_exists($provider, "ProcessPaymentForm")) { $result = $provider->ProcessPaymentForm(); if($result) { $paymentStatus = $provider->GetPaymentStatus(); $orderStatus = GetOrderStatusFromPaymentStatus($paymentStatus); if(CompletePendingOrder($order_token, $orderStatus)) { // Everything is fine, send the customer to the thank you page. redirect(getConfig('ShopPathSSL').'/finishorder.php'); } } // Otherwise there was an error $this->ShowPaymentForm($provider); } // If we're still here then something from the above has gone wrong. Show the confirm page again redirect(getConfig('ShopPathSSL').'/checkout.php?action=confirm_order'); }