Example #1
0
    }
    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;
}