505 lines
17 KiB
PHP
Executable File
505 lines
17 KiB
PHP
Executable File
<?php
|
|
/*
|
|
* 2007-2014 PrestaShop
|
|
*
|
|
* NOTICE OF LICENSE
|
|
*
|
|
* This source file is subject to the Academic Free License (AFL 3.0)
|
|
* that is bundled with this package in the file LICENSE.txt.
|
|
* It is also available through the world-wide-web at this URL:
|
|
* http://opensource.org/licenses/afl-3.0.php
|
|
* If you did not receive a copy of the license and are unable to
|
|
* obtain it through the world-wide-web, please send an email
|
|
* to license@prestashop.com so we can send you a copy immediately.
|
|
*
|
|
* DISCLAIMER
|
|
*
|
|
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
|
|
* versions in the future. If you wish to customize PrestaShop for your
|
|
* needs please refer to http://www.prestashop.com for more information.
|
|
*
|
|
* @author PrestaShop SA <contact@prestashop.com>
|
|
* @copyright 2007-2014 PrestaShop SA
|
|
* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
|
|
* International Registered Trademark & Property of PrestaShop SA
|
|
*/
|
|
|
|
include_once(dirname(__FILE__).'/../../../config/config.inc.php');
|
|
include_once(dirname(__FILE__).'/../../../init.php');
|
|
|
|
include_once(_PS_MODULE_DIR_.'paypal/express_checkout/process.php');
|
|
include_once(_PS_MODULE_DIR_.'paypal/express_checkout/submit.php');
|
|
include_once(_PS_MODULE_DIR_.'paypal/paypal_login/PayPalLoginUser.php');
|
|
|
|
/* Normal payment process */
|
|
$id_cart = Tools::getValue('id_cart');
|
|
$id_order = Tools::getValue('id_order');
|
|
$id_module = Tools::getValue('id_module');
|
|
$paypal_key = Tools::getValue('key');
|
|
|
|
|
|
if ($id_cart && $id_order && $id_module && $paypal_key)
|
|
{
|
|
// PRESTASHOP VERSION
|
|
/*
|
|
if (version_compare(_PS_VERSION_, '1.5', '<'))
|
|
new PayPalExpressCheckoutSubmit();
|
|
return;
|
|
*/
|
|
// PRESTASHOP VERSION END
|
|
|
|
// @ANTADIS : redirect to bebeboutik specific order-confirmation page
|
|
$paypal = new PayPal();
|
|
$cart = $paypal->context->cart;
|
|
$order = new Order((int)$id_order);
|
|
|
|
$redirect_after_payment = $paypal->context->link->getPageLink('order-confirmation.php')
|
|
.'?id_cart='.$cart->id
|
|
.'&key='.$order->secure_key
|
|
.'&id_module='.$paypal->id;
|
|
|
|
Tools::redirectLink($redirect_after_payment);
|
|
exit;
|
|
// @ANTADIS END
|
|
}
|
|
|
|
$request_type = Tools::getValue('express_checkout');
|
|
$ppec = new PaypalExpressCheckout($request_type);
|
|
|
|
$token = Tools::getValue('token');
|
|
$payer_id = Tools::getValue('PayerID');
|
|
|
|
function setContextData($ppec)
|
|
{
|
|
// Create new Cart to avoid any refresh or other bad manipulations
|
|
$ppec->context->cart = new Cart();
|
|
$ppec->context->cart->id_currency = (int)$ppec->context->currency->id;
|
|
$ppec->context->cart->id_lang = (int)$ppec->context->language->id;
|
|
|
|
// Customer settings
|
|
$ppec->context->cart->id_guest = (int)$ppec->context->cookie->id_guest;
|
|
$ppec->context->cart->id_customer = (int)$ppec->context->customer->id;
|
|
|
|
// Secure key information
|
|
$secure_key = isset($ppec->context->customer) ? $ppec->context->customer->secure_key : null;
|
|
$ppec->context->cart->secure_key = $secure_key;
|
|
}
|
|
|
|
/**
|
|
* Set customer information
|
|
* Used to create user account with PayPal account information
|
|
*/
|
|
function setCustomerInformation($ppec, $email)
|
|
{
|
|
$customer = new Customer();
|
|
$customer->email = $email;
|
|
$customer->lastname = $ppec->result['LASTNAME'];
|
|
$customer->firstname = $ppec->result['FIRSTNAME'];
|
|
$customer->passwd = Tools::encrypt(Tools::passwdGen());
|
|
return $customer;
|
|
}
|
|
|
|
|
|
/**
|
|
* Set customer address (when not logged in)
|
|
* Used to create user address with PayPal account information
|
|
*/
|
|
function setCustomerAddress($ppec, $customer, $id = null)
|
|
{
|
|
$address = new Address($id);
|
|
$address->id_country = Country::getByIso($ppec->result['PAYMENTREQUEST_0_SHIPTOCOUNTRYCODE']);
|
|
if ($id == null)
|
|
$address->alias = 'Paypal_Address';
|
|
|
|
$address->lastname = $customer->lastname;
|
|
$address->firstname = $customer->firstname;
|
|
$address->address1 = $ppec->result['PAYMENTREQUEST_0_SHIPTOSTREET'];
|
|
if (isset($ppec->result['PAYMENTREQUEST_0_SHIPTOSTREET2']))
|
|
$address->address2 = $ppec->result['PAYMENTREQUEST_0_SHIPTOSTREET2'];
|
|
$address->city = $ppec->result['PAYMENTREQUEST_0_SHIPTOCITY'];
|
|
if (Country::containsStates($address->id_country))
|
|
$address->id_state = (int)State::getIdByIso($ppec->result['PAYMENTREQUEST_0_SHIPTOSTATE'], $address->id_country);
|
|
$address->postcode = $ppec->result['PAYMENTREQUEST_0_SHIPTOZIP'];
|
|
if (isset($ppec->result['PAYMENTREQUEST_0_SHIPTOPHONENUM']))
|
|
$address->phone = $ppec->result['PAYMENTREQUEST_0_SHIPTOPHONENUM'];
|
|
$address->id_customer = $customer->id;
|
|
return $address;
|
|
}
|
|
|
|
|
|
if ($request_type && $ppec->type) {
|
|
$id_product = (int)Tools::getValue('id_product');
|
|
$product_quantity = (int)Tools::getValue('quantity');
|
|
$id_product_attribute = Tools::getValue('id_p_attr');
|
|
|
|
if (($id_product > 0) && $id_product_attribute !== false && ($product_quantity > 0))
|
|
{
|
|
setContextData($ppec);
|
|
|
|
if (!$ppec->context->cart->add())
|
|
{
|
|
$ppec->logs[] = $ppec->l('Cannot create new cart');
|
|
$display = (_PS_VERSION_ < '1.5') ? new BWDisplay() : new FrontController();
|
|
|
|
$ppec->context->smarty->assign(array(
|
|
'logs' => $ppec->logs,
|
|
'message' => $ppec->l('Error occurred:'),
|
|
'use_mobile' => (bool)$ppec->useMobile()
|
|
));
|
|
|
|
$template = 'error.tpl';
|
|
}
|
|
else
|
|
$ppec->context->cookie->id_cart = (int)$ppec->context->cart->id;
|
|
|
|
$ppec->context->cart->updateQty((int)$product_quantity, (int)$id_product, (int)$id_product_attribute);
|
|
$ppec->context->cart->update();
|
|
}
|
|
|
|
$login_user = PaypalLoginUser::getByIdCustomer((int)$ppec->context->customer->id);
|
|
|
|
if ($login_user && $login_user->expires_in <= time())
|
|
{
|
|
$obj = new PayPalLogin();
|
|
$login_user = $obj->getRefreshToken();
|
|
}
|
|
|
|
// @ANTADIS send data biling true for return information
|
|
$save_billing = Tools::getValue('save_billing', false);
|
|
|
|
$id_billing_to_use = 0;
|
|
if (Tools::getValue('id_billing')) {
|
|
$id_billing = Tools::getValue('id_billing');
|
|
$tmp_billing = $ppec->getBilingInfo($id_billing);
|
|
if ($tmp_billing['id_customer'] == $ppec->context->customer->id) {
|
|
$id_billing_to_use = (int) $tmp_billing['id_paypal_agreement'];
|
|
}
|
|
}
|
|
|
|
// @ANTADIS - if id_billing make transaction
|
|
if ($id_billing_to_use != 0) {
|
|
if($ppec->DoReferenceTransaction($id_billing_to_use) === false){
|
|
return Tools::redirectLink($ppec->context->link->getPageLink('order.php').'?step=3&cgv=1&paypal_amt=1');
|
|
}
|
|
$amount_match = $ppec->rightPaymentProcess();
|
|
|
|
// PAIEMENT REUSSI
|
|
if ($ppec->hasSucceedRequest() && $amount_match) {
|
|
if (isset($ppec->result['PAYMENTSTATUS']))
|
|
$payment_status = $ppec->result['PAYMENTSTATUS'];
|
|
else
|
|
$payment_status = 'Error';
|
|
|
|
if (strcmp($payment_status, 'Completed') === 0) {
|
|
$payment_type = (int)Configuration::get('PS_OS_PAYMENT');
|
|
$message = $ppec->l('Payment accepted.').'<br />';
|
|
} elseif (strcmp($payment_status, 'Pending') === 0) {
|
|
$payment_type = (int)Configuration::get('PS_OS_PAYPAL');
|
|
$message = $ppec->l('Pending payment confirmation.').'<br />';
|
|
}
|
|
|
|
$cart = $ppec->context->cart;
|
|
$customer = $ppec->context->customer;
|
|
|
|
$shipping_cost_wt = $cart->getOrderShippingCost();
|
|
$transaction = PayPalOrder::getTransactionDetailsForDoReference($ppec, $payment_status, $shipping_cost_wt);
|
|
$ppec->context->cookie->id_cart = $cart->id;
|
|
$order_total = (float)$cart->getOrderTotal(true, Cart::BOTH);
|
|
|
|
$ppec->validateOrder((int)$cart->id, $payment_type, $order_total, $ppec->displayName, $message, $transaction,
|
|
(int)$cart->id_currency, false, $customer->secure_key, $ppec->context->shop, $id_billing_to_use);
|
|
|
|
$order = new Order($ppec->currentOrder);
|
|
$module_tmp = new Paypal();
|
|
$redirect_after_payment = $ppec->context->link->getPageLink('order-confirmation.php').'?id_cart='.$cart->id.'&key='.$order->secure_key.'&id_module='.$module_tmp->id;
|
|
Tools::redirectLink($redirect_after_payment);
|
|
} else {
|
|
return Tools::redirectLink($ppec->context->link->getPageLink('order.php').'?step=3&cgv=1&paypal_error=1');
|
|
// $ppec->displayPayPalAPIError($ppec->l('Error during the preparation of the DoReferenceTransaction payment'), $ppec->logs);
|
|
}
|
|
|
|
} else {
|
|
/* Set details for a payment */
|
|
$ppec->setExpressCheckout(($login_user ? $login_user->access_token : false), ($save_billing ? true : false));
|
|
|
|
if ($ppec->hasSucceedRequest() && !empty($ppec->token))
|
|
$ppec->redirectToAPI();
|
|
/* Display Error and die with this method */
|
|
else
|
|
$ppec->displayPayPalAPIError($ppec->l('Error during the preparation of the Express Checkout payment'), $ppec->logs);
|
|
}
|
|
|
|
|
|
}
|
|
//If a token exist with payer_id, then we are back from the PayPal API
|
|
elseif (!empty($ppec->token) && ($ppec->token == $token) && ($ppec->payer_id = $payer_id))
|
|
{
|
|
/* Get payment infos from paypal */
|
|
$ppec->getExpressCheckout();
|
|
|
|
if ($ppec->hasSucceedRequest() && !empty($ppec->token))
|
|
{
|
|
// Check token validity
|
|
// if(isset($ppec->result['TIMESTAMP']) && !empty($ppec->result['TIMESTAMP'])){
|
|
// $validity_time = strtotime($ppec->result['TIMESTAMP']);
|
|
// $hours = time() + (3 * 60 * 60);
|
|
// if($validity_time < $hours){
|
|
// return Tools::redirectLink($ppec->context->link->getPageLink('order.php').'?step=3&cgv=1&paypal_expire=1');
|
|
// }
|
|
// }
|
|
|
|
$address = $customer = null;
|
|
$email = $ppec->result['EMAIL'];
|
|
|
|
/* Create Customer if not exist with address etc */
|
|
if ($ppec->context->cookie->logged)
|
|
{
|
|
$id_customer = Paypal::getPayPalCustomerIdByEmail($email);
|
|
if (!$id_customer)
|
|
PayPal::addPayPalCustomer($ppec->context->customer->id, $email);
|
|
$customer = $ppec->context->customer;
|
|
}
|
|
elseif ($id_customer = Customer::customerExists($email, true))
|
|
$customer = new Customer($id_customer);
|
|
else
|
|
{
|
|
$customer = setCustomerInformation($ppec, $email);
|
|
$customer->add();
|
|
|
|
PayPal::addPayPalCustomer($customer->id, $email);
|
|
}
|
|
|
|
if (!$customer->id)
|
|
$ppec->logs[] = $ppec->l('Cannot create customer');
|
|
|
|
// if (!isset($ppec->result['PAYMENTREQUEST_0_SHIPTOSTREET']) || !isset($ppec->result['PAYMENTREQUEST_0_SHIPTOCITY'])
|
|
// || !isset($ppec->result['SHIPTOZIP']) || !isset($ppec->result['COUNTRYCODE']))
|
|
// $ppec->redirectToCheckout($customer, ($ppec->type != 'payment_cart'));
|
|
|
|
// $addresses = $customer->getAddresses($ppec->context->language->id);
|
|
// foreach ($addresses as $address)
|
|
// if ($address['alias'] == 'Paypal_Address')
|
|
// {//If address has already been created
|
|
// $address = new Address($address['id_address']);
|
|
// break;
|
|
// }
|
|
|
|
// /* Create address */
|
|
// if (is_array($address) && isset($address['id_address']))
|
|
// $address = new Address($address['id_address']);
|
|
|
|
// if ((!$address || !$address->id) && $customer->id)
|
|
// {//If address does not exists, we create it
|
|
// $address = setCustomerAddress($ppec, $customer);
|
|
// $address->add();
|
|
// }
|
|
// else if ($customer->id)
|
|
// {//If address exists, we update it with new informations
|
|
// $address = setCustomerAddress($ppec, $customer, $address->id);
|
|
// $address->save();
|
|
// }
|
|
|
|
// if ($customer->id && !$address->id)
|
|
// $ppec->logs[] = $ppec->l('Cannot create Address');
|
|
|
|
// /* Create Order */
|
|
// if ($customer->id && $address->id)
|
|
// {
|
|
// $ppec->context->cart->id_customer = $customer->id;
|
|
// $ppec->context->cart->id_guest = $ppec->context->cookie->id_guest;
|
|
|
|
// if (!$ppec->context->cart->update())
|
|
// $ppec->logs[] = $ppec->l('Cannot update existing cart');
|
|
// else
|
|
// {
|
|
// $payment_cart = (bool)($ppec->type != 'payment_cart');
|
|
// $ppec->redirectToCheckout($customer, $payment_cart);
|
|
// }
|
|
// }
|
|
$payment_cart = (bool)($ppec->type != 'payment_cart');
|
|
$ppec->redirectToCheckout($customer, $payment_cart);
|
|
}
|
|
}
|
|
/**
|
|
* Check payment return
|
|
*/
|
|
function validateOrder($customer, $cart, $ppec)
|
|
{
|
|
$amount_match = $ppec->rightPaymentProcess();
|
|
$order_total = (float)$cart->getOrderTotal(true, Cart::BOTH);
|
|
|
|
// Payment succeed
|
|
if ($ppec->hasSucceedRequest() && !empty($ppec->token) && $amount_match)
|
|
{
|
|
if ((bool)Configuration::get('PAYPAL_CAPTURE'))
|
|
{
|
|
$payment_type = (int)Configuration::get('PS_OS_WS_PAYMENT');
|
|
$payment_status = 'Pending_capture';
|
|
$message = $ppec->l('Pending payment capture.').'<br />';
|
|
}
|
|
else
|
|
{
|
|
if (isset($ppec->result['PAYMENTINFO_0_PAYMENTSTATUS']))
|
|
$payment_status = $ppec->result['PAYMENTINFO_0_PAYMENTSTATUS'];
|
|
else
|
|
$payment_status = 'Error';
|
|
|
|
if (strcmp($payment_status, 'Completed') === 0)
|
|
{
|
|
$payment_type = (int)Configuration::get('PS_OS_PAYMENT');
|
|
$message = $ppec->l('Payment accepted.').'<br />';
|
|
}
|
|
elseif (strcmp($payment_status, 'Pending') === 0)
|
|
{
|
|
$payment_type = (int)Configuration::get('PS_OS_PAYPAL');
|
|
$message = $ppec->l('Pending payment confirmation.').'<br />';
|
|
}
|
|
}
|
|
}
|
|
// Payment error
|
|
else
|
|
{
|
|
//Check if error is 10486, if it is redirect user to paypal
|
|
if ($ppec->result['L_ERRORCODE0'] == 10486)
|
|
$ppec->redirectToAPI();
|
|
|
|
$payment_status = $ppec->result['PAYMENTINFO_0_PAYMENTSTATUS'];
|
|
$payment_type = (int)Configuration::get('PS_OS_ERROR');
|
|
|
|
if ($amount_match)
|
|
$message = implode('<br />', $ppec->logs).'<br />';
|
|
else
|
|
$message = $ppec->l('Price paid on paypal is not the same that on PrestaShop.').'<br />';
|
|
}
|
|
|
|
$transaction = PayPalOrder::getTransactionDetails($ppec, $payment_status);
|
|
$ppec->context->cookie->id_cart = $cart->id;
|
|
|
|
$ppec->validateOrder((int)$cart->id, $payment_type, $order_total, $ppec->displayName, $message, $transaction,
|
|
(int)$cart->id_currency, false, $customer->secure_key, $ppec->context->shop);
|
|
}
|
|
|
|
/* If Previous steps succeed, ready (means 'ready to pay') will be set to true */
|
|
if ($ppec->ready && !empty($ppec->token) && (Tools::isSubmit('confirmation') || $ppec->type == 'payment_cart'))
|
|
{
|
|
/* Check modification on the product cart / quantity */
|
|
if ($ppec->isProductsListStillRight())
|
|
{
|
|
$cart = $ppec->context->cart;
|
|
$customer = new Customer((int)$cart->id_customer);
|
|
|
|
// ANTADIS
|
|
$customer_info = array();
|
|
$customer_info['ID_CUSTOMER'] = $cart->id_customer;
|
|
$customer_info['EMAIL'] = $ppec->result['EMAIL'];
|
|
|
|
// When all information are checked before, we can validate the payment to paypal
|
|
// and create the prestashop order
|
|
$ppec->doExpressCheckout();
|
|
|
|
$customer_info['SHIPTOSTREET'] = $ppec->result['PAYMENTREQUEST_0_SHIPTOSTREET'];
|
|
$customer_info['SHIPTOCITY'] = $ppec->result['PAYMENTREQUEST_0_SHIPTOCITY'];
|
|
$customer_info['SHIPTONAME'] = $ppec->result['PAYMENTREQUEST_0_SHIPTONAME'];
|
|
|
|
// ANTADIS
|
|
// si on retourne le biling on le save
|
|
if (isset($ppec->result['BILLINGAGREEMENTID'])) {
|
|
$customer_info['BILLINGAGREEMENTID'] = $ppec->result['BILLINGAGREEMENTID'];
|
|
$ppec->saveBillingAgreement($customer_info);
|
|
}
|
|
|
|
validateOrder($customer, $cart, $ppec);
|
|
|
|
unset($ppec->context->cookie->{PaypalExpressCheckout::$cookie_name});
|
|
|
|
if (!$ppec->currentOrder)
|
|
$ppec->logs[] = $ppec->l('Cannot create order');
|
|
else
|
|
{
|
|
$id_order = (int)$ppec->currentOrder;
|
|
$order = new Order($id_order);
|
|
}
|
|
|
|
/* Check payment details to display the appropriate content */
|
|
if (isset($order) && ($ppec->result['ACK'] != "Failure"))
|
|
{
|
|
$values = array(
|
|
'key' => $customer->secure_key,
|
|
'id_module' => (int)$ppec->id,
|
|
'id_cart' => (int)$cart->id,
|
|
'id_order' => (int)$ppec->currentOrder
|
|
);
|
|
|
|
if (version_compare(_PS_VERSION_, '1.5', '<'))
|
|
{
|
|
$query = http_build_query($values, '', '&');
|
|
Tools::redirectLink(_MODULE_DIR_.$ppec->name.'/express_checkout/payment.php?'.$query);
|
|
}
|
|
else
|
|
{
|
|
$link = $ppec->context->link->getModuleLink('paypal', 'submit', $values);
|
|
Tools::redirect($link);
|
|
}
|
|
}
|
|
elseif ($ppec->result['ACK'] != 'Failure')
|
|
{
|
|
$ppec->context->smarty->assign(array(
|
|
'logs' => $ppec->logs,
|
|
'message' => $ppec->l('Error occurred:'),
|
|
));
|
|
|
|
$template = 'error.tpl';
|
|
}
|
|
}
|
|
else
|
|
{
|
|
/* If Cart changed, no need to keep the paypal data */
|
|
unset($ppec->context->cookie->{PaypalExpressCheckout::$cookie_name});
|
|
$ppec->logs[] = $ppec->l('Cart changed since the last checkout express, please make a new Paypal checkout payment');
|
|
}
|
|
}
|
|
|
|
$display = (_PS_VERSION_ < '1.5') ? new BWDisplay() : new FrontController();
|
|
$payment_confirmation = Tools::getValue('get_confirmation');
|
|
|
|
/* Display payment confirmation */
|
|
if ($ppec->ready && $payment_confirmation && (_PS_VERSION_ < '1.5'))
|
|
{
|
|
$shop_domain = PayPal::getShopDomainSsl(true, true);
|
|
$form_action = $shop_domain._MODULE_DIR_.$ppec->name.'/express_checkout/payment.php';
|
|
$order_total = $ppec->context->cart->getOrderTotal(true);
|
|
$currency = new Currency((int)$ppec->context->cart->id_currency);
|
|
|
|
$ppec->context->smarty->assign(array(
|
|
'form_action' => $form_action,
|
|
'total' => Tools::displayPrice($order_total, $currency),
|
|
'logos' => $ppec->paypal_logos->getLogos(),
|
|
));
|
|
|
|
$template = 'order-summary.tpl';
|
|
}
|
|
/* Display result if error occurred */
|
|
else
|
|
{
|
|
if (!$ppec->context->cart->id)
|
|
{
|
|
$ppec->context->cart->delete();
|
|
$ppec->logs[] = $ppec->l('Your cart is empty.');
|
|
}
|
|
$ppec->context->smarty->assign(array(
|
|
'logs' => $ppec->logs,
|
|
'message' => $ppec->l('Error occurred:'),
|
|
));
|
|
|
|
$template = 'error.tpl';
|
|
}
|
|
|
|
/**
|
|
* Detect if we are using mobile or not
|
|
* Check the 'ps_mobile_site' parameter.
|
|
*/
|
|
$ppec->context->smarty->assign('use_mobile', (bool)$ppec->useMobile());
|
|
|
|
$display->setTemplate(_PS_MODULE_DIR_.'paypal/views/templates/front/'.$template);
|
|
$display->run();
|