} fn_order_placement_routines('checkout_redirect'); } elseif ($mode == 'place_order' && !empty($_SESSION['pp_express_details'])) { fn_pp_save_mode($order_info); $token = $_SESSION['pp_express_details']['token']; fn_paypal_complete_checkout($token, $processor_data, $order_info); } elseif ($mode == 'place_order' || $mode == 'express' || $mode == 'repay') { if (!defined('BOOTSTRAP')) { require './init_payment.php'; $_SESSION['cart'] = empty($_SESSION['cart']) ? array() : $_SESSION['cart']; } $payment_id = empty($_REQUEST['payment_id']) ? $_SESSION['cart']['payment_id'] : $_REQUEST['payment_id']; if ($mode == 'express') { $result = fn_paypal_set_express_checkout($payment_id, 0, array(), $_SESSION['cart']); $useraction = 'continue'; } else { $result = fn_paypal_set_express_checkout($payment_id, $order_id, $order_info); $useraction = "commit"; } if (fn_paypal_ack_success($result) && !empty($result['TOKEN'])) { $processor_data = fn_get_payment_method_data($payment_id); fn_paypal_payment_form($processor_data, $result['TOKEN']); } else { fn_paypal_get_error($result); if ($mode == 'express') { fn_order_placement_routines('checkout.cart'); } else { fn_order_placement_routines('checkout_redirect'); } } }
function fn_paypal_do_express_checkout($processor_data, $paypal_checkout_details, $order_info) { $pp_order_id = $processor_data['processor_params']['order_prefix'] . ($order_info['repaid'] ? $order_info['order_id'] . '_' . $order_info['repaid'] : $order_info['order_id']); $request = array('PAYERID' => $paypal_checkout_details['PAYERID'], 'TOKEN' => $paypal_checkout_details['TOKEN'], 'PAYMENTREQUEST_0_PAYMENTACTION' => 'SALE', 'PAYMENTREQUEST_0_CURRENCYCODE' => $processor_data['processor_params']['currency'], 'PAYMENTREQUEST_0_AMT' => $order_info['total'], 'METHOD' => 'DoExpressCheckoutPayment', 'PAYMENTREQUEST_0_INVNUM' => $pp_order_id, 'BUTTONSOURCE' => 'ST_ShoppingCart_EC_US', 'PAYMENTREQUEST_0_CUSTOM' => $order_info['order_id'], 'PAYMENTREQUEST_0_NOTIFYURL' => fn_url("payment_notification.paypal_ipn", AREA, 'current')); fn_paypal_build_request($processor_data, $request, $post_url, $cert_file); $order_details = !empty($order_info) ? fn_paypal_build_details($order_info, $processor_data, false) : fn_paypal_build_details($cart, $processor_data); $request = array_merge($request, $order_details); if (!empty($order_info)) { //We need to minus taxes when it based on unit price because product subtotal already include this tax. if (Registry::get('settings.General.tax_calculation') == 'unit_price') { $sum_taxes = fn_paypal_sum_taxes($order_info); $request['PAYMENTREQUEST_0_ITEMAMT'] -= $sum_taxes['P']; $request['PAYMENTREQUEST_0_SHIPPINGAMT'] -= $sum_taxes['S']; } } $result = fn_paypal_request($request, $post_url, $cert_file); if (isset($result['L_ERRORCODE0']) && $result['L_ERRORCODE0'] == 10486 && (!isset($order_info['payment_info']['attempts_number']) || $order_info['payment_info']['attempts_number'] < 2)) { //According paypal documetation we should make two attempt and redirect customer back to paypal. $count = isset($order_info['payment_info']['attempts_number']) ? $order_info['payment_info']['attempts_number'] : 0; $count++; fn_update_order_payment_info($order_info['order_id'], array('attempts_number' => $count)); fn_paypal_payment_form($processor_data, $paypal_checkout_details['TOKEN']); } return $result; }