en Jump to content
  • 0
joseantgv

[MOD] Configuración de las divisas de Paypal por checkbox

Question

Por alguna razón la configuración de divisas de Paypal se hace mediante un radiobutton en vez de por un checkbox, lo que hace que a veces sea un poco difícil saber qué valor elegir:

 

2lF7vWP.png

 

En teoría aquí se define en que moneda se procesará el pago con Paypal. Si escoges "Moneda del cliente", aparecerá en todas las monedas configuradas en la tienda y se procesará con la moneda que el cliente haya seleccionado en la tienda. Si sólo escoges UNA moneda, el módulo sólo aparecerá para esa moneda.

 

Para poder configurar exactamente para que monedas queremos mostrar el módulo, hay que cambiar el fichero paypal/paypal.php, la línea:

$this->currencies_mode = 'radio';

por:

$this->currencies_mode = 'checkbox';

Con esta modificación ya podemos elegir las monedas una a una:

 

VOS0DkS.png

 

Pero cuidado! La operación se procesará con la moneda que el cliente haya elegido y Paypal todavía hay muchas monedas que no acepta.

 

Para modificar la moneda con la que procesar el pago, hay que modificar el fichero paypal/express_checkout/process.php, buscar la línea:

$this->currency = new Currency((int)$this->context->cart->id_currency);

Y substituirla por algo parecido a esto:

if ((int)$this->context->cart->id_currency==1 || (int)$this->context->cart->id_currency==2 || (int)$this->context->cart->id_currency==5)
	$this->currency = new Currency((int)$this->context->cart->id_currency);
else
	$this->currency = new Currency((int)$this->context->cart->id_currency=2);

En este caso, si el ID de la divisa es 1, 2 o 5 (divisas aceptadas por Paypal), procesar la operación con esa moneda; en caso contrario procesarla con la divisa 2.

 

En el mismo fichero, en la función initParameters(), habrá que dejarla así:

private function initParameters()
	{
		if (!$this->context->cart || !$this->context->cart->id)
			return false;

		$cart_currency = new Currency((int)$this->context->cart->id_currency);
		//$currency_module = $this->getCurrency((int)$this->context->cart->id_currency);


		/*
		if ($cart_currency !== $currency_module)
		{
			$this->context->cart->id_currency = $currency_module->id;
			$this->context->cart->update();
		}
		*/

		//$this->context->currency = $currency_module;
		$this->context->currency = $cart_currency;
		$this->product_list = $this->context->cart->getProducts();
		return (bool)count($this->product_list);
	}
Edited by joseantgv

Share this post


Link to post
Share on other sites

44 answers to this question

Recommended Posts

  • 0

Que tal joseantgv muchas gracias a ti a victor por mostrarme tu post jeje, hice lo que me dijiste pero ahora me sale una pagina el blanco cuando elijo paypal en el carrito (donde antes me salía error de moneda) http://puerta3.com/modules/paypal/express_checkout/payment.php

 

Yo puse tal cual el codigo tuyo porque no me doy cuenta bien que tendria que poner en mi caso, tengo solo 3 monedas y en este orden: 1 peso uruguayo que es con la que trabajo, 2 dollar y 3 euro.

 

Que tendría que modificar para que no me salga la pagina en blanco?

 

Desde ya muchas gracias :)

Share this post


Link to post
Share on other sites
  • 0

Que tal joseantgv muchas gracias a ti a victor por mostrarme tu post jeje, hice lo que me dijiste pero ahora me sale una pagina el blanco cuando elijo paypal en el carrito (donde antes me salía error de moneda) http://puerta3.com/modules/paypal/express_checkout/payment.php

 

Yo puse tal cual el codigo tuyo porque no me doy cuenta bien que tendria que poner en mi caso, tengo solo 3 monedas y en este orden: 1 peso uruguayo que es con la que trabajo, 2 dollar y 3 euro.

 

Que tendría que modificar para que no me salga la pagina en blanco?

 

Desde ya muchas gracias :)

 

Hola,

 

para empezar habilita errores a ver qué error aparece.

 

http://victor-rodenas.com/2013/05/11/guia-habilitar-el-reporte-de-errores-en-prestashop-1-5-y-prestashop-1-4/

Share this post


Link to post
Share on other sites
  • 0

Gracias por la pronta respuesta estos son los errores:

 

Fatal error: Uncaught exception 'PrestaShopException' with message 'Property Cart->id_currency is empty' in /home/puerta3/public_html/classes/ObjectModel.php:837 Stack trace: #0 /home/puerta3/public_html/classes/ObjectModel.php(255): ObjectModelCore->validateFields() #1 /home/puerta3/public_html/classes/ObjectModel.php(596): ObjectModelCore->getFields() #2 /home/puerta3/public_html/classes/Cart.php(195): ObjectModelCore->update() #3 /home/puerta3/public_html/modules/paypal/express_checkout/process.php(129): CartCore->update() #4 /home/puerta3/public_html/modules/paypal/express_checkout/process.php(143): PaypalExpressCheckout->initParameters(true) #5 /home/puerta3/public_html/modules/paypal/express_checkout/payment.php(134): PaypalExpressCheckout->setExpressCheckout() #6 {main} thrown in /home/puerta3/public_html/classes/ObjectModel.php on line 837

Share this post


Link to post
Share on other sites
  • 0

Justamente paypal no hacepta pesos uruguayos, mi idea es que la tienda esté en pesos porque basicamente es una tienda para uruguay, aunque no descarto que me compren del extranjero, pero tambien quiero mostrar paypal a los uruguayos porque aquí muchos lo usan con dolares, la idea es que se muestre paypal a todos pero cuando lo eligen el carrito cambia automaticamente a dolares o euros, como lo hacia el prestashop 1.4, antes era así y luego en el 1.5 cambió :(

Share this post


Link to post
Share on other sites
  • 0

Ok entonces la primera parte del manual no es necesario que la hagas, pero si la has hecho no pasa nada.

 

Luego, tienes claro que ids tienes que poner aquí?

if ((int)$this->context->cart->id_currency==1 || (int)$this->context->cart->id_currency==2 || (int)$this->context->cart->id_currency==5)
	$this->currency = new Currency((int)$this->context->cart->id_currency);
else
	$this->currency = new Currency((int)$this->context->cart->id_currency=2);

Por otra parte, no tengo muy claro que línea te está petando. Puedes hacer los pasos de 1 en 1 y decirme dónde te falla?

 

Gracias.

Edited by joseantgv

Share this post


Link to post
Share on other sites
  • 0

Que tal joseantgv, mil disculpas por no responder en tanto tiempo, pero tenía un familiar que sufrió un axidente laboral y se me complico por un tiempo :(

 

Estoy recien retomando con esto, no tengo muy claro no lo de los ids :( yo lo único que quiero es que la moneda por defecto de la tienda sea pesos uruguayos, además tengo creado dollar y euro, pero quiero que todos vean a opción de paypal no importa cual de las 3 monedas tengan seleccionada, y encaso de que alguien con la opción de pesos uruguayos pinche en pagar con paypal, lo lleve a la pasarela de paypal pero con dolares como pasaba con prestashop 1.4, que lo haga automático porque si no va a dar error de moneda ya que la misma no está soportada por paypal, pero la gracia es que el usuario no tenga que cambiar manualmente la moneda.

 

Gracias desde ya por la ayuda y disculpas por el délai

Share this post


Link to post
Share on other sites
  • 0

Ok entonces sigue el tutorial paso por paso y dime si te falla.

 

Donde pone

if ((int)$this->context->cart->id_currency==1 || (int)$this->context->cart->id_currency==2 || (int)$this->context->cart->id_currency==5)
	$this->currency = new Currency((int)$this->context->cart->id_currency);
else
	$this->currency = new Currency((int)$this->context->cart->id_currency=2);

Únicamente tendrás que poner

$this->currency = new Currency((int)$this->context->cart->id_currency=2);

Sustituyendo el 2 por el ID que tenga el dólar en tu tienda.

Edited by joseantgv

Share this post


Link to post
Share on other sites
  • 0

Perdon otra vez por a demora, hice los 2 pasos nuevamente y puse únicamente $this->currency = new Currency((int)$this->context->cart->id_currency=2); en el paso 2, ya que 2 es el id del dollar justamente, probe hacer la compra y cuando elijo paypal me sale pagina en blanco, habilité la vista de errores otra vez y salke esto:

 

 

Notice: Trying to get property of non-object in /home/puerta3/public_html/modules/paypal/express_checkout/process.php on line 125

Fatal error: Uncaught exception 'PrestaShopException' with message 'Property Cart->id_currency is empty' in /home/puerta3/public_html/classes/ObjectModel.php:837 Stack trace: #0 /home/puerta3/public_html/classes/ObjectModel.php(255): ObjectModelCore->validateFields() #1 /home/puerta3/public_html/classes/ObjectModel.php(596): ObjectModelCore->getFields() #2 /home/puerta3/public_html/classes/Cart.php(195): ObjectModelCore->update() #3 /home/puerta3/public_html/modules/paypal/express_checkout/process.php(126): CartCore->update() #4 /home/puerta3/public_html/modules/paypal/express_checkout/process.php(140): PaypalExpressCheckout->initParameters(true) #5 /home/puerta3/public_html/modules/paypal/express_checkout/payment.php(134): PaypalExpressCheckout->setExpressCheckout() #6 {main} thrown in /home/puerta3/public_html/classes/ObjectModel.php on line 837

Share this post


Link to post
Share on other sites
  • 0

Lo puse y ahora sale este error :(

 

Notice: Trying to get property of non-object in /home/puerta3/public_html/modules/paypal/express_checkout/process.php on line 126

Fatal error: Uncaught exception 'PrestaShopException' with message 'Property Cart->id_currency is empty' in /home/puerta3/public_html/classes/ObjectModel.php:837 Stack trace: #0 /home/puerta3/public_html/classes/ObjectModel.php(255): ObjectModelCore->validateFields() #1 /home/puerta3/public_html/classes/ObjectModel.php(596): ObjectModelCore->getFields() #2 /home/puerta3/public_html/classes/Cart.php(195): ObjectModelCore->update() #3 /home/puerta3/public_html/modules/paypal/express_checkout/process.php(127): CartCore->update() #4 /home/puerta3/public_html/modules/paypal/express_checkout/process.php(141): PaypalExpressCheckout->initParameters(true) #5 /home/puerta3/public_html/modules/paypal/express_checkout/payment.php(134): PaypalExpressCheckout->setExpressCheckout() #6 {main} thrown in /home/puerta3/public_html/classes/ObjectModel.php on line 837

Share this post


Link to post
Share on other sites
  • 0

Lo puse y ahora sale este error :(

 

Notice: Trying to get property of non-object in /home/puerta3/public_html/modules/paypal/express_checkout/process.php on line 126

 

Fatal error: Uncaught exception 'PrestaShopException' with message 'Property Cart->id_currency is empty' in /home/puerta3/public_html/classes/ObjectModel.php:837 Stack trace: #0 /home/puerta3/public_html/classes/ObjectModel.php(255): ObjectModelCore->validateFields() #1 /home/puerta3/public_html/classes/ObjectModel.php(596): ObjectModelCore->getFields() #2 /home/puerta3/public_html/classes/Cart.php(195): ObjectModelCore->update() #3 /home/puerta3/public_html/modules/paypal/express_checkout/process.php(127): CartCore->update() #4 /home/puerta3/public_html/modules/paypal/express_checkout/process.php(141): PaypalExpressCheckout->initParameters(true) #5 /home/puerta3/public_html/modules/paypal/express_checkout/payment.php(134): PaypalExpressCheckout->setExpressCheckout() #6 {main} thrown in /home/puerta3/public_html/classes/ObjectModel.php on line 837

 

Cuál es la versión de tu PS y del módulo de Paypal?

Edited by joseantgv

Share this post


Link to post
Share on other sites
  • 0

Lo puse y ahora sale este error :(

 

Notice: Trying to get property of non-object in /home/puerta3/public_html/modules/paypal/express_checkout/process.php on line 126

 

Fatal error: Uncaught exception 'PrestaShopException' with message 'Property Cart->id_currency is empty' in /home/puerta3/public_html/classes/ObjectModel.php:837 Stack trace: #0 /home/puerta3/public_html/classes/ObjectModel.php(255): ObjectModelCore->validateFields() #1 /home/puerta3/public_html/classes/ObjectModel.php(596): ObjectModelCore->getFields() #2 /home/puerta3/public_html/classes/Cart.php(195): ObjectModelCore->update() #3 /home/puerta3/public_html/modules/paypal/express_checkout/process.php(127): CartCore->update() #4 /home/puerta3/public_html/modules/paypal/express_checkout/process.php(141): PaypalExpressCheckout->initParameters(true) #5 /home/puerta3/public_html/modules/paypal/express_checkout/payment.php(134): PaypalExpressCheckout->setExpressCheckout() #6 {main} thrown in /home/puerta3/public_html/classes/ObjectModel.php on line 837

 

Lo he probado y funciona correctamente. En que función estás haciendo la modificación? Debería quedar algo así:

public function __construct($type = false)
{
	parent::__construct();

	// If type is sent, the cookie has to be delete
	if ($type)
	{
		unset($this->context->cookie->{self::$cookie_name});
		$this->setExpressCheckoutType($type);
	}

	// Store back the PayPal data if present under the cookie
	if (isset($this->context->cookie->{self::$cookie_name}))
	{
		$paypal = unserialize($this->context->cookie->{self::$cookie_name});

		foreach ($this->cookie_key as $key)
			$this->{$key} = $paypal[$key];
	}

	//$this->currency = new Currency((int)$this->context->cart->id_currency);
	$this->context->cart->id_currency = 2;
	$this->currency = new Currency((int)$this->context->cart->id_currency);

	if (!Validate::isLoadedObject($this->currency))
		$this->_errors[] = $this->l('Not a valid currency');

	if (count($this->_errors))
		return false;

	$currency_decimals = is_array($this->currency) ? (int)$this->currency['decimals'] : (int)$this->currency->decimals;
	$this->decimals = $currency_decimals * _PS_PRICE_DISPLAY_PRECISION_;
}

Share this post


Link to post
Share on other sites
  • 0

los cambios los estoy haciendo en process.php y no se que está mal, te copio todo el codigo entero por las dudas:

 

 

<?php
/*
* 2007-2013 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-2013 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(_PS_MODULE_DIR_.'paypal/paypal.php');
include_once(_PS_MODULE_DIR_.'paypal/api/paypal_lib.php');

class PaypalExpressCheckout extends Paypal
{
    public $logs = array();

    public $method_version = '84';

    public $method;

    /** @var currency Currency used for the payment process **/
    public $currency;

    /** @var decimals Used to set prices precision **/
    public $decimals;

    /** @var result Contains the last request result **/
    public $result;

    /** @var token Contains the last token **/
    public $token;

    // Depending of the type set, id_cart or id_product will be set
    public $id_cart;

    // Depending of the type set, id_cart or id_product will be set
    public $id_product;

    public $id_p_attr;

    public $quantity;

    public $payer_id;

    public $available_type = array('cart', 'product', 'payment_cart');

    public $total_different_product;

    public $product_list = array();

    // Used to know if user can validated his payment after shipping / address selection
    public $ready = false;

    // Take for now cart or product value
    public $type = false;

    static public $COOKIE_NAME = 'express_checkout';

    public $cookie_key = array(
        'token', 'id_product', 'id_p_attr',
        'quantity', 'type', 'total_different_product',
        'secure_key', 'ready', 'payer_id'
    );

    public function __construct($type = false)
    {
        parent::__construct();

        // If type is sent, the cookie has to be delete
        if ($type)
        {
            unset($this->context->cookie->{self::$COOKIE_NAME});
            $this->setExpressCheckoutType($type);
        }

        // Store back the PayPal data if present under the cookie
        if (isset($this->context->cookie->{self::$COOKIE_NAME}))
        {
            $paypal = unserialize($this->context->cookie->{self::$COOKIE_NAME});

            foreach ($this->cookie_key as $key)
                $this->{$key} = $paypal[$key];
        }

        $this->context->cart->id_currency=2;
        $this->currency = new Currency((int)$this->context->cart->id_currency);

        if (!Validate::isLoadedObject($this->currency))
            $this->_errors[] = $this->l('Not a valid currency');

        if (count($this->_errors))
            return false;

        $currency_decimals = is_array($this->currency) ? (int)$this->currency['decimals'] : (int)$this->currency->decimals;
        $this->decimals = $currency_decimals * _PS_PRICE_DISPLAY_PRECISION_;
    }

    // Will build the product_list depending of the type
    private function initParameters()
    {
        if (!$this->context->cart || !$this->context->cart->id)
            return false;

        $cart_currency = new Currency((int)$this->context->cart->id_currency);
        $currency_module = $this->getCurrency((int)$this->context->cart->id_currency);

        if ($cart_currency !== $currency_module)
        {
            $this->context->cart->id_currency = $currency_module->id;
            $this->context->cart->update();
        }

        $this->context->currency = $currency_module;
        $this->product_list = $this->context->cart->getProducts();
        return (bool)count($this->product_list);
    }

    public function setExpressCheckout()
    {
        $this->method = 'SetExpressCheckout';
        $this->setCancelUrl($fields);

        // Only this call need to get the value from the $_GET / $_POST array
        if (!$this->initParameters(true) || !$fields['CANCELURL'])
            return false;

        // Set payment detail (reference)
        $this->_setPaymentDetails($fields);
        $fields['SOLUTIONTYPE'] = 'Sole';
        $fields['LANDINGPAGE'] = 'Login';

        // Seller informations
        $fields['USER'] = Configuration::get('PAYPAL_API_USER');
        $fields['PWD'] = Configuration::get('PAYPAL_API_PASSWORD');
        $fields['SIGNATURE'] = Configuration::get('PAYPAL_API_SIGNATURE');

        $this->callAPI($fields);
        $this->_storeToken();
    }
    
    public function setCancelUrl(&$fields)
    {
        $url = urldecode(Tools::getValue('current_shop_url'));
        $parsed_data = parse_url($url);



        if (isset($parsed_data['path']))
        {
            $parsed_data['path'] .= '?paypal_ec_canceled=1&';
            $parsed_data['query'] = isset($parsed_data['query']) ? $parsed_data['query'] : null;
        }
        else
        {
            $parsed_data['path'] = '?paypal_ec_canceled=1&';
            $parsed_data['query'] = '/'.(isset($parsed_data['query']) ? $parsed_data['query'] : null);
        }

        $cancel_url = implode($parsed_data);

        if (!empty($cancel_url))
            $fields['CANCELURL'] = $cancel_url;
    }

    public function getExpressCheckout()
    {
        $this->method = 'GetExpressCheckoutDetails';
        $fields['TOKEN'] = $this->token;

        $this->initParameters();
        $this->callAPI($fields);

        // The same token of SetExpressCheckout
        $this->_storeToken();
    }

    public function doExpressCheckout()
    {
        $this->method = 'DoExpressCheckoutPayment';

        $fields['TOKEN'] = $this->token;
        $fields['PAYERID'] = $this->payer_id;

        if (count($this->product_list) <= 0)
            $this->initParameters();

        // Set payment detail (reference)
        $this->_setPaymentDetails($fields);
        $this->callAPI($fields);

        $this->result += $fields;
    }

    private function callAPI($fields)
    {
        $this->logs = array();
        $paypal_lib = new PaypalLib();

        $this->result = $paypal_lib->makeCall($this->getAPIURL(), $this->getAPIScript(), $this->method, $fields, $this->method_version);
        $this->logs = array_merge($this->logs, $paypal_lib->getLogs());

        $this->_storeToken();
    }

    private function _setPaymentDetails(&$fields)
    {
        // Required field
        $fields['RETURNURL'] = PayPal::getShopDomainSsl(true, true)._MODULE_DIR_.$this->name.'/express_checkout/payment.php';
        $fields['REQCONFIRMSHIPPING'] = '0';
        $fields['NOSHIPPING'] = '1';
        $fields['BUTTONSOURCE'] = $this->getTrackingCode();

        // Products
        $taxes = $total = 0;
        $index = -1;

        // Set cart products list
        $this->setProductsList($fields, $index, $total, $taxes);
        $this->setDiscountsList($fields, $index, $total, $taxes);
        $this->setGiftWrapping($fields, $index, $total);

        // Payment values
        $this->setPaymentValues($fields, $index, $total, $taxes);

        $id_address = (int)$this->context->cart->id_address_delivery;
        if (($id_address == 0) && ($this->context->customer))
            $id_address = Address::getFirstCustomerAddressId($this->context->customer->id);

        if ($id_address && method_exists($this->context->cart, 'isVirtualCart') && !$this->context->cart->isVirtualCart())
            $this->setShippingAddress($fields, $id_address);
        else
            $fields['NOSHIPPING'] = '0';

        foreach ($fields as &$field)
            if (is_numeric($field))
                $field = str_replace(',', '.', $field);
    }

    private function setShippingAddress(&$fields, $id_address)
    {
        $address = new Address($id_address);

        $fields['ADDROVERRIDE'] = '1';
        $fields['EMAIL'] = $this->context->customer->email;
        $fields['PAYMENTREQUEST_0_SHIPTONAME'] = $address->firstname.' '.$address->lastname;
        $fields['PAYMENTREQUEST_0_SHIPTOPHONENUM'] = (empty($address->phone)) ? $address->phone_mobile : $address->phone;
        $fields['PAYMENTREQUEST_0_SHIPTOSTREET'] = $address->address1;
        $fields['PAYMENTREQUEST_0_SHIPTOSTREET2'] = $address->address2;
        $fields['PAYMENTREQUEST_0_SHIPTOCITY'] = $address->city;

        if ($address->id_state)
        {
            $state    = new State((int)$address->id_state);
            $fields['PAYMENTREQUEST_0_SHIPTOSTATE'] = $state->iso_code;
        }

        $country    = new Country((int)$address->id_country);
        $fields['PAYMENTREQUEST_0_SHIPTOCOUNTRYCODE'] = $country->iso_code;
        $fields['PAYMENTREQUEST_0_SHIPTOZIP'] = $address->postcode;
    }

    private function setProductsList(&$fields, &$index, &$total)
    {
        foreach ($this->product_list as $product)
        {
            $fields['L_PAYMENTREQUEST_0_NUMBER'.++$index] = (int)$product['id_product'];

            $fields['L_PAYMENTREQUEST_0_NAME'.$index] = $product['name'];

            if (isset($product['attributes']) && (empty($product['attributes']) === false))
                $fields['L_PAYMENTREQUEST_0_NAME'.$index] .= ' - '.$product['attributes'];

            $fields['L_PAYMENTREQUEST_0_DESC'.$index] = substr(strip_tags($product['description_short']), 0, 120).'...';

            $fields['L_PAYMENTREQUEST_0_AMT'.$index] = Tools::ps_round($product['price_wt'], $this->decimals);
            $fields['L_PAYMENTREQUEST_0_QTY'.$index] = $product['quantity'];

            $total = $total + ($fields['L_PAYMENTREQUEST_0_AMT'.$index] * $product['quantity']);
        }
    }

    private function setDiscountsList(&$fields, &$index, &$total)
    {
        $discounts = (_PS_VERSION_ < '1.5') ? $this->context->cart->getDiscounts() : $this->context->cart->getCartRules();

        if (count($discounts) > 0)
            foreach ($discounts as $discount)
            {
                $fields['L_PAYMENTREQUEST_0_NUMBER'.++$index] = $discount['id_discount'];

                $fields['L_PAYMENTREQUEST_0_NAME'.$index] = $discount['name'];
                if (isset($discount['description']) && !empty($discount['description']))
                    $fields['L_PAYMENTREQUEST_0_DESC'.$index] = substr(strip_tags($discount['description']), 0, 120).'...';

                /* It is a discount so we store a negative value */
                $fields['L_PAYMENTREQUEST_0_AMT'.$index] = -1 * Tools::ps_round($discount['value_real'], $this->decimals);
                $fields['L_PAYMENTREQUEST_0_QTY'.$index] = 1;

                $total = Tools::ps_round($total + $fields['L_PAYMENTREQUEST_0_AMT'.$index], $this->decimals);
            }
    }

    private function setGiftWrapping(&$fields, &$index, &$total)
    {
        if ($this->context->cart->gift == 1)
        {
            $gift_wrapping_price = $this->getGiftWrappingPrice();

            $fields['L_PAYMENTREQUEST_0_NAME'.++$index]    = $this->l('Gift wrapping');

            $fields['L_PAYMENTREQUEST_0_AMT'.$index] = Tools::ps_round($gift_wrapping_price, $this->decimals);
            $fields['L_PAYMENTREQUEST_0_QTY'.$index] = 1;

            $total = Tools::ps_round($total + $gift_wrapping_price, $this->decimals);
        }
    }

    private function setPaymentValues(&$fields, &$index, &$total, &$taxes)
    {
        if (_PS_VERSION_ < '1.5')
            $shipping_cost_wt = $this->context->cart->getOrderShippingCost();
        else
            $shipping_cost_wt = $this->context->cart->getTotalShippingCost();

        if ((bool)Configuration::get('PAYPAL_CAPTURE'))
            $fields['PAYMENTREQUEST_0_PAYMENTACTION'] = 'Authorization';
        else
            $fields['PAYMENTREQUEST_0_PAYMENTACTION'] = 'Sale';
        
        $currency = new Currency((int)$this->context->cart->id_currency);
        $fields['PAYMENTREQUEST_0_CURRENCYCODE'] = $currency->iso_code;

        /**
         * If the total amount is lower than 1 we put the shipping cost as an item
         * so the payment could be valid.
         */
        if ($total <= 1)
        {
            $carrier = new Carrier($this->context->cart->id_carrier);
            $fields['L_PAYMENTREQUEST_0_NUMBER'.++$index] = $carrier->id_reference;
            $fields['L_PAYMENTREQUEST_0_NAME'.$index] = $carrier->name;
            $fields['L_PAYMENTREQUEST_0_AMT'.$index] = Tools::ps_round($shipping_cost_wt, $this->decimals);
            $fields['L_PAYMENTREQUEST_0_QTY'.$index] = 1;
            
            $fields['PAYMENTREQUEST_0_ITEMAMT'] = Tools::ps_round($total, $this->decimals) + Tools::ps_round($shipping_cost_wt, $this->decimals);
            $fields['PAYMENTREQUEST_0_AMT'] = $total + Tools::ps_round($shipping_cost_wt, $this->decimals);
        }
        else
        {
            $fields['PAYMENTREQUEST_0_SHIPPINGAMT'] = Tools::ps_round($shipping_cost_wt, $this->decimals);
            $fields['PAYMENTREQUEST_0_ITEMAMT'] = Tools::ps_round($total, $this->decimals);
            $fields['PAYMENTREQUEST_0_AMT'] = $total + $fields['PAYMENTREQUEST_0_SHIPPINGAMT'];
        }
    }

    public function rightPaymentProcess()
    {
        $total = $this->getTotalPaid();

        // float problem with php, have to use the string cast.
        if ((isset($this->result['AMT']) && ((string)$this->result['AMT'] != (string)$total)) ||
            (isset($this->result['PAYMENTINFO_0_AMT']) && ((string)$this->result['PAYMENTINFO_0_AMT'] != (string)$total)))
            return false;    
        return true;
    }

    /**
     * @return mixed
     */
    public function getTotalPaid()
    {
        $total = 0.00;

        foreach ($this->product_list as $product)
        {
            $price = Tools::ps_round($product['price_wt'], $this->decimals);
            $quantity = Tools::ps_round($product['quantity'], $this->decimals);
            $total = Tools::ps_round($total + ($price * $quantity), $this->decimals);
        }

        if ($this->context->cart->gift == 1)
            $total = Tools::ps_round($total + $this->getGiftWrappingPrice(), $this->decimals);
        
        if (_PS_VERSION_ < '1.5')
        {
            $discounts = $this->context->cart->getDiscounts();
            $shipping_cost = $this->context->cart->getOrderShippingCost();
        }
        else
        {
            $discounts = $this->context->cart->getCartRules();
            $shipping_cost = $this->context->cart->getTotalShippingCost();
        }
        
        if (count($discounts) > 0)
            foreach ($discounts as $product)
            {
                $price = -1 * Tools::ps_round($product['value_real'], $this->decimals);
                $total = Tools::ps_round($total + $price, $this->decimals);
            }
        
        return Tools::ps_round($shipping_cost, $this->decimals) + $total;
    }

    private function _storeToken()
    {
        if (is_array($this->result) && isset($this->result['TOKEN']))
            $this->token = (string)$this->result['TOKEN'];
    }

    // Store data for the next reloading page
    private function _storeCookieInfo()
    {
        $tab = array();

        foreach ($this->cookie_key as $key)
            $tab[$key] = $this->{$key};

        $this->context->cookie->{self::$COOKIE_NAME} = serialize($tab);
    }

    public function hasSucceedRequest()
    {
        if (is_array($this->result))
            foreach(array('ACK', 'PAYMENTINFO_0_ACK') as $key)
                if (isset($this->result[$key]) && strtoupper($this->result[$key]) == 'SUCCESS')
                    return true;

        return false;
    }

    private function getSecureKey()
    {
        if (!count($this->product_list))
            $this->initParameters();

        $key = array();

        foreach($this->product_list as $product)
        {
            $id_product = $product['id_product'];
            $id_product_attribute = $product['id_product_attribute'];
            $quantity = $product['quantity'];

            $key[] = $id_product.$id_product_attribute.$quantity._COOKIE_KEY_;
        }

        return md5(serialize($key));
    }

    public function isProductsListStillRight()
    {
        return $this->secure_key == $this->getSecureKey();
    }

    public function setExpressCheckoutType($type)
    {
        if (in_array($type, $this->available_type))
        {
            $this->type = $type;
            return true;
        }
        return false;
    }

    public function redirectToAPI()
    {
        $this->secure_key = $this->getSecureKey();
        $this->_storeCookieInfo();

        if ($this->useMobile())
            $url = '/cgi-bin/webscr?cmd=_express-checkout-mobile';
        else
            $url = '/websc&cmd=_express-checkout';
            

        exit(0);
    }

    public function redirectToCheckout($customer, $redirect = false)
    {
        $this->ready = true;
        $this->_storeCookieInfo();

        $this->context->cookie->id_customer = (int)$customer->id;
        $this->context->cookie->customer_lastname = $customer->lastname;
        $this->context->cookie->customer_firstname = $customer->firstname;
        $this->context->cookie->passwd = $customer->passwd;
        $this->context->cookie->email = $customer->email;
        $this->context->cookie->is_guest = $customer->isGuest();
        $this->context->cookie->logged = 1;

        if (_PS_VERSION_ < '1.5')
            Module::hookExec('authentication');
        else
            Hook::exec('authentication');

        if ($redirect)
        {
            $link = $this->context->link->getPageLink('order.php', false, null, array('step' => '3'));
            Tools::redirectLink($link);
            exit(0);
        }
    }
}
 

Share this post


Link to post
Share on other sites
  • 0

Quiero dar las gracias publicamente a José por tenerme tanta paciencia y solucionarme este problema, me pasó el modulo y ahora me anda todo perfecto con los pesos uruguayos, así que a las ordenes para el que tenga el mismo problema que yo, se lo paso con gusto!

 

Me alegro mucho que en ésta comunidad hayan personas que de verdad se preocupan y ayudan a los demás de forma desinteresada, ojalá algun día me haga experto y pueda devolver el favor a la comunidad! :)

Share this post


Link to post
Share on other sites
  • 0

Quiero dar las gracias publicamente a José por tenerme tanta paciencia y solucionarme este problema, me pasó el modulo y ahora me anda todo perfecto con los pesos uruguayos, así que a las ordenes para el que tenga el mismo problema que yo, se lo paso con gusto!

 

Me alegro mucho que en ésta comunidad hayan personas que de verdad se preocupan y ayudan a los demás de forma desinteresada, ojalá algun día me haga experto y pueda devolver el favor a la comunidad! :)

 

Hola,

 

las modificaciones indicadas en el primer post siguen siendo correctas!

Share this post


Link to post
Share on other sites
  • 0

Quiero dar las gracias publicamente a José por tenerme tanta paciencia y solucionarme este problema, me pasó el modulo y ahora me anda todo perfecto con los pesos uruguayos, así que a las ordenes para el que tenga el mismo problema que yo, se lo paso con gusto!

 

Me alegro mucho que en ésta comunidad hayan personas que de verdad se preocupan y ayudan a los demás de forma desinteresada, ojalá algun día me haga experto y pueda devolver el favor a la comunidad! :)

 

hola, neouy

 

tengo el mismo problema que usted, que paypal no acepta pesos dominicanos, pudo realizar la conversion automaticamente de pesos uruguayos a dolar ?

 

de ser asi por favor decirme como lo hizo para yo realizarlo tambien.

 

muchas gracias.

Share this post


Link to post
Share on other sites
  • 0

hola, neouy

 

tengo el mismo problema que usted, que paypal no acepta pesos dominicanos, pudo realizar la conversion automaticamente de pesos uruguayos a dolar ?

 

de ser asi por favor decirme como lo hizo para yo realizarlo tambien.

 

muchas gracias.

 

Al final a mi me envió el modulo ya modificado, no se bien como lo arregló, te lo puedo pasar si tu quieres

Share this post


Link to post
Share on other sites
  • 0

Al final a mi me envió el modulo ya modificado, no se bien como lo arregló, te lo puedo pasar si tu quieres

 

 

Si puede postearlo para bajarlo, asi tambien otros lo pueden bajar que esten en el mismo problema.

 

gracias de ante manos...

Share this post


Link to post
Share on other sites
  • 0

Hola,

 

las modificaciones a hacer están puestas en el primer post. No cuelgo el módulo ya que se va actualizando el módulo original de Paypal.

 

gracias por su respuesta,

 

yo tengo el modulo PayPal v3.7.2  con realizar la primera modificacion que publico se soluciona el problema ?

Share this post


Link to post
Share on other sites
  • 0

ya al fin pude resolver gracias al tutorial de joseantgv
 
asi lo solucione:
 
tengo dos monedas en mi tienda
1 DOLLAR (Apceptada por paypal)
2 PESOS DOMINICANOS (NO Apceptada por paypal)

 

if ((int)$this->context->cart->id_currency==1)
    $this->currency = new Currency((int)$this->context->cart->id_currency);
else
    $this->currency = new Currency((int)$this->context->cart->id_currency=1);

 

AGREGE LA MONEDA DOLAR ID 1 EN AMBOS CASO Y ME FUNCIONO PERFECTO

Share this post


Link to post
Share on other sites
  • 0

Hola a todos,

Tengo el mismo problema, hice todas las modificaciones mencionadas en los post y aun no me da resultado, no me esta haciendo la conversión de pesos colombianos a dolares, mi versión paypal es 3.8.2 y ps 1.5.3.

 

 

La moneda principal es dolares (1) la secundaria es pesos (3).

post-599465-0-58136600-1425474963_thumb.jpg

 

Share this post


Link to post
Share on other sites
  • 0

Hola a todos,

Tengo el mismo problema, hice todas las modificaciones mencionadas en los post y aun no me da resultado, no me esta haciendo la conversión de pesos colombianos a dolares, mi versión paypal es 3.8.2 y ps 1.5.3.

 

 

La moneda principal es dolares (1) la secundaria es pesos (3).

attachicon.gifpaypal.jpg

 

Hola!

 

Puedes pegar las modificaciones que hiciste para ver si hay algún error?

Share this post


Link to post
Share on other sites
  • 0

Hola de nuevo, adjunto el archivo modificado. subraye en color rojo los fragmentos de código modificados

Gracias

 

<?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:
* 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(_PS_MODULE_DIR_.'paypal/paypal.php');
include_once(_PS_MODULE_DIR_.'paypal/api/paypal_lib.php');
 
class PaypalExpressCheckout extends Paypal
{
public $logs = array();
 
public $method_version = '106';
 
public $method;
 
/** @var currency Currency used for the payment process **/
public $currency;
 
/** @var decimals Used to set prices precision **/
public $decimals;
 
/** @var result Contains the last request result **/
public $result;
 
/** @var token Contains the last token **/
public $token;
 
/* Depending of the type set, id_cart or id_product will be set */
public $id_cart;
 
// Depending of the type set, id_cart or id_product will be set
public $id_product;
 
public $id_p_attr;
 
public $quantity;
 
public $payer_id;
 
public $available_type = array('cart', 'product', 'payment_cart');
 
public $total_different_product;
 
public $product_list = array();
 
/* Used to know if user can validated his payment after shipping / address selection */
public $ready = false;
 
/* Take for now cart or product value */
public $type = false;
 
static public $cookie_name = 'express_checkout';
 
public $cookie_key = array(
'token', 'id_product', 'id_p_attr',
'quantity', 'type', 'total_different_product',
'secure_key', 'ready', 'payer_id'
);
 
public function __construct($type = false)
{
parent::__construct();
 
// If type is sent, the cookie has to be delete
if ($type)
{
unset($this->context->cookie->{self::$cookie_name});
$this->setExpressCheckoutType($type);
}
 
// Store back the PayPal data if present under the cookie
if (isset($this->context->cookie->{self::$cookie_name}))
{
$paypal = unserialize($this->context->cookie->{self::$cookie_name});
 
foreach ($this->cookie_key as $key)
$this->{$key} = $paypal[$key];
}
 
$this->currency = new Currency((int)$this->context->cart->id_currency=1);
 
if (!Validate::isLoadedObject($this->currency))
$this->_errors[] = $this->l('Not a valid currency');
 
if (count($this->_errors))
return false;
 
$currency_decimals = is_array($this->currency) ? (int)$this->currency['decimals'] : (int)$this->currency->decimals;
$this->decimals = $currency_decimals * _PS_PRICE_DISPLAY_PRECISION_;
}
 
// Will build the product_list depending of the type
private function initParameters()
{
if (!$this->context->cart || !$this->context->cart->id)
return false;
 
$cart_currency = new Currency((int)$this->context->cart->id_currency);
//$currency_module = $this->getCurrency((int)$this->context->cart->id_currency);
/*
if ($cart_currency !== $currency_module)
{
$this->context->cart->id_currency = $currency_module->id;
$this->context->cart->update();
}*/
 
//$this->context->currency = $currency_module;
$this->product_list = $this->context->cart->getProducts();
return (bool)count($this->product_list);
}
 
public function setExpressCheckout($access_token = false)
{
$this->method = 'SetExpressCheckout';
$this->setCancelUrl($fields);
 
// Only this call need to get the value from the $_GET / $_POST array
if (!$this->initParameters(true) || !$fields['CANCELURL'])
return false;
 
// Set payment detail (reference)
$this->_setPaymentDetails($fields);
$fields['SOLUTIONTYPE'] = 'Sole';
$fields['LANDINGPAGE'] = 'Login';
 
// Seller informations
$fields['USER'] = Configuration::get('PAYPAL_API_USER');
$fields['PWD'] = Configuration::get('PAYPAL_API_PASSWORD');
$fields['SIGNATURE'] = Configuration::get('PAYPAL_API_SIGNATURE');
 
if ($access_token)
$fields['IDENTITYACCESSTOKEN'] = $access_token;
 
$this->callAPI($fields);
$this->_storeToken();
}
 
public function setCancelUrl(&$fields)
{
$url = urldecode(Tools::getValue('current_shop_url'));
$parsed_data = parse_url($url);
 
 
if (isset($parsed_data['path']))
{
$parsed_data['path'] .= '?paypal_ec_canceled=1&';
$parsed_data['query'] = isset($parsed_data['query']) ? $parsed_data['query'] : null;
}
else
{
$parsed_data['path'] = '?paypal_ec_canceled=1&';
$parsed_data['query'] = '/'.(isset($parsed_data['query']) ? $parsed_data['query'] : null);
}
 
$cancel_url = implode($parsed_data);
 
if (!empty($cancel_url))
$fields['CANCELURL'] = $cancel_url;
}
 
public function getExpressCheckout()
{
$this->method = 'GetExpressCheckoutDetails';
$fields['TOKEN'] = $this->token;
 
$this->initParameters();
$this->callAPI($fields);
 
// The same token of SetExpressCheckout
$this->_storeToken();
}
 
public function doExpressCheckout()
{
$this->method = 'DoExpressCheckoutPayment';
 
$fields['TOKEN'] = $this->token;
$fields['PAYERID'] = $this->payer_id;
 
if (count($this->product_list) <= 0)
$this->initParameters();
 
// Set payment detail (reference)
$this->_setPaymentDetails($fields);
$this->callAPI($fields);
 
$this->result += $fields;
}
 
private function callAPI($fields)
{
$this->logs = array();
$paypal_lib = new PaypalLib();
 
$this->result = $paypal_lib->makeCall($this->getAPIURL(), $this->getAPIScript(), $this->method, $fields, $this->method_version);
$this->logs = array_merge($this->logs, $paypal_lib->getLogs());
 
$this->_storeToken();
}
 
private function _setPaymentDetails(&$fields)
{
// Required field
$fields['RETURNURL'] = PayPal::getShopDomainSsl(true, true)._MODULE_DIR_.$this->name.'/express_checkout/payment.php';
$fields['NOSHIPPING'] = '1';
$fields['BUTTONSOURCE'] = $this->getTrackingCode((int)Configuration::get('PAYPAL_PAYMENT_METHOD'));
 
// Products
$taxes = $total = 0;
$index = -1;
 
// Set cart products list
$this->setProductsList($fields, $index, $total, $taxes);
$this->setDiscountsList($fields, $index, $total, $taxes);
$this->setGiftWrapping($fields, $index, $total);
 
// Payment values
$this->setPaymentValues($fields, $index, $total, $taxes);
 
$id_address = (int)$this->context->cart->id_address_delivery;
if (($id_address == 0) && ($this->context->customer))
$id_address = Address::getFirstCustomerAddressId($this->context->customer->id);
 
if ($id_address && method_exists($this->context->cart, 'isVirtualCart') && !$this->context->cart->isVirtualCart())
$this->setShippingAddress($fields, $id_address);
else
$fields['NOSHIPPING'] = '0';
 
foreach ($fields as &$field)
if (is_numeric($field))
$field = str_replace(',', '.', $field);
}
 
private function setShippingAddress(&$fields, $id_address)
{
$address = new Address($id_address);
 
$fields['ADDROVERRIDE'] = '1';
$fields['EMAIL'] = $this->context->customer->email;
$fields['PAYMENTREQUEST_0_SHIPTONAME'] = $address->firstname.' '.$address->lastname;
$fields['PAYMENTREQUEST_0_SHIPTOPHONENUM'] = (empty($address->phone)) ? $address->phone_mobile : $address->phone;
$fields['PAYMENTREQUEST_0_SHIPTOSTREET'] = $address->address1;
$fields['PAYMENTREQUEST_0_SHIPTOSTREET2'] = $address->address2;
$fields['PAYMENTREQUEST_0_SHIPTOCITY'] = $address->city;
 
if ($address->id_state)
{
$state = new State((int)$address->id_state);
$fields['PAYMENTREQUEST_0_SHIPTOSTATE'] = $state->iso_code;
}
 
$country = new Country((int)$address->id_country);
$fields['PAYMENTREQUEST_0_SHIPTOCOUNTRYCODE'] = $country->iso_code;
$fields['PAYMENTREQUEST_0_SHIPTOZIP'] = $address->postcode;
}
 
private function setProductsList(&$fields, &$index, &$total)
{
foreach ($this->product_list as $product)
{
$fields['L_PAYMENTREQUEST_0_NUMBER'.++$index] = (int)$product['id_product'];
 
$fields['L_PAYMENTREQUEST_0_NAME'.$index] = $product['name'];
 
if (isset($product['attributes']) && (empty($product['attributes']) === false))
$fields['L_PAYMENTREQUEST_0_NAME'.$index] .= ' - '.$product['attributes'];
 
$fields['L_PAYMENTREQUEST_0_DESC'.$index] = Tools::substr(strip_tags($product['description_short']), 0, 50).'...';
 
$fields['L_PAYMENTREQUEST_0_AMT'.$index] = Tools::ps_round($product['price_wt'], $this->decimals);
$fields['L_PAYMENTREQUEST_0_QTY'.$index] = $product['quantity'];
 
$total = $total + ($fields['L_PAYMENTREQUEST_0_AMT'.$index] * $product['quantity']);
}
}
 
private function setDiscountsList(&$fields, &$index, &$total)
{
$discounts = (_PS_VERSION_ < '1.5') ? $this->context->cart->getDiscounts() : $this->context->cart->getCartRules();
 
if (count($discounts) > 0)
foreach ($discounts as $discount)
{
$fields['L_PAYMENTREQUEST_0_NUMBER'.++$index] = $discount['id_discount'];
 
$fields['L_PAYMENTREQUEST_0_NAME'.$index] = $discount['name'];
if (isset($discount['description']) && !empty($discount['description']))
$fields['L_PAYMENTREQUEST_0_DESC'.$index] = Tools::substr(strip_tags($discount['description']), 0, 50).'...';
 
/* It is a discount so we store a negative value */
$fields['L_PAYMENTREQUEST_0_AMT'.$index] = - 1 * Tools::ps_round($discount['value_real'], $this->decimals);
$fields['L_PAYMENTREQUEST_0_QTY'.$index] = 1;
 
$total = Tools::ps_round($total + $fields['L_PAYMENTREQUEST_0_AMT'.$index], $this->decimals);
}
}
 
private function setGiftWrapping(&$fields, &$index, &$total)
{
if ($this->context->cart->gift == 1)
{
$gift_wrapping_price = $this->getGiftWrappingPrice();
 
$fields['L_PAYMENTREQUEST_0_NAME'.++$index] = $this->l('Gift wrapping');
 
$fields['L_PAYMENTREQUEST_0_AMT'.$index] = Tools::ps_round($gift_wrapping_price, $this->decimals);
$fields['L_PAYMENTREQUEST_0_QTY'.$index] = 1;
 
$total = Tools::ps_round($total + $gift_wrapping_price, $this->decimals);
}
}
 
private function setPaymentValues(&$fields, &$index, &$total, &$taxes)
{
if (version_compare(_PS_VERSION_, '1.5', '<'))
$shipping_cost_wt = $this->context->cart->getOrderShippingCost();
else
$shipping_cost_wt = $this->context->cart->getTotalShippingCost();
 
if ((bool)Configuration::get('PAYPAL_CAPTURE'))
$fields['PAYMENTREQUEST_0_PAYMENTACTION'] = 'Authorization';
else
$fields['PAYMENTREQUEST_0_PAYMENTACTION'] = 'Sale';
 
$currency = new Currency((int)$this->context->cart->id_currency);
$fields['PAYMENTREQUEST_0_CURRENCYCODE'] = $currency->iso_code;
 
/**
* If the total amount is lower than 1 we put the shipping cost as an item
* so the payment could be valid.
*/ 
if ($total <= 1)
{
$carrier = new Carrier($this->context->cart->id_carrier);
$fields['L_PAYMENTREQUEST_0_NUMBER'.++$index] = $carrier->id_reference;
$fields['L_PAYMENTREQUEST_0_NAME'.$index] = $carrier->name;
$fields['L_PAYMENTREQUEST_0_AMT'.$index] = Tools::ps_round($shipping_cost_wt, $this->decimals);
$fields['L_PAYMENTREQUEST_0_QTY'.$index] = 1;
 
$fields['PAYMENTREQUEST_0_ITEMAMT'] = Tools::ps_round($total, $this->decimals) + Tools::ps_round($shipping_cost_wt, $this->decimals);
$fields['PAYMENTREQUEST_0_AMT'] = $total + Tools::ps_round($shipping_cost_wt, $this->decimals);
}
else
{
$fields['PAYMENTREQUEST_0_SHIPPINGAMT'] = sprintf('%.2f', $shipping_cost_wt);
$fields['PAYMENTREQUEST_0_ITEMAMT'] = Tools::ps_round($total, $this->decimals);
$fields['PAYMENTREQUEST_0_AMT'] = sprintf('%.2f', ($total + $fields['PAYMENTREQUEST_0_SHIPPINGAMT']));
}
}
 
public function rightPaymentProcess()
{
$total = $this->getTotalPaid();
 
// float problem with php, have to use the string cast.
if ((isset($this->result['AMT']) && ((string)$this->result['AMT'] != (string)$total)) ||
(isset($this->result['PAYMENTINFO_0_AMT']) && ((string)$this->result['PAYMENTINFO_0_AMT'] != (string)$total)))
return false;
return true;
}
 
/**
* @return mixed
*/
public function getTotalPaid()
{
$total = 0.00;
 
foreach ($this->product_list as $product)
{
$price = Tools::ps_round($product['price_wt'], $this->decimals);
$quantity = Tools::ps_round($product['quantity'], $this->decimals);
$total = Tools::ps_round($total + ($price * $quantity), $this->decimals);
}
 
if ($this->context->cart->gift == 1)
$total = Tools::ps_round($total + $this->getGiftWrappingPrice(), $this->decimals);
 
if (version_compare(_PS_VERSION_, '1.5', '<'))
{
$discounts = $this->context->cart->getDiscounts();
$shipping_cost = $this->context->cart->getOrderShippingCost();
}
else
{
$discounts = $this->context->cart->getCartRules();
$shipping_cost = $this->context->cart->getTotalShippingCost();
}
 
if (count($discounts) > 0)
foreach ($discounts as $product)
{
$price = - 1 * Tools::ps_round($product['value_real'], $this->decimals);
$total = Tools::ps_round($total + $price, $this->decimals);
}
 
return Tools::ps_round($shipping_cost, $this->decimals) + $total;
}
 
private function _storeToken()
{
if (is_array($this->result) && isset($this->result['TOKEN']))
$this->token = (string)$this->result['TOKEN'];
}
 
// Store data for the next reloading page
private function _storeCookieInfo()
{
$tab = array();
 
foreach ($this->cookie_key as $key)
$tab[$key] = $this->{$key};
 
$this->context->cookie->{self::$cookie_name} = serialize($tab);
}
 
public function hasSucceedRequest()
{
if (is_array($this->result))
foreach (array('ACK', 'PAYMENTINFO_0_ACK') as $key)
if (isset($this->result[$key]) && Tools::strtoupper($this->result[$key]) == 'SUCCESS')
return true;
 
return false;
}
 
private function getSecureKey()
{
if (!count($this->product_list))
$this->initParameters();
 
$key = array();
 
foreach ($this->product_list as $product)
{
$id_product = $product['id_product'];
$id_product_attribute = $product['id_product_attribute'];
$quantity = $product['quantity'];
 
$key[] = $id_product.$id_product_attribute.$quantity._COOKIE_KEY_;
}
 
return md5(serialize($key));
}
 
public function isProductsListStillRight()
{
return $this->secure_key == $this->getSecureKey();
}
 
public function setExpressCheckoutType($type)
{
if (in_array($type, $this->available_type))
{
$this->type = $type;
return true;
}
return false;
}
 
public function redirectToAPI()
{
$this->secure_key = $this->getSecureKey();
$this->_storeCookieInfo();
 
if ($this->useMobile())
$url = '/cgi-bin/webscr?cmd=_express-checkout-mobile';
else
$url = '/websc&cmd=_express-checkout';
 
exit(0);
}
 
public function redirectToCheckout($customer, $redirect = false)
{
$this->ready = true;
$this->_storeCookieInfo();
 
$this->context->cookie->id_customer = (int)$customer->id;
$this->context->cookie->customer_lastname = $customer->lastname;
$this->context->cookie->customer_firstname = $customer->firstname;
$this->context->cookie->passwd = $customer->passwd;
$this->context->cookie->email = $customer->email;
$this->context->cookie->is_guest = $customer->isGuest();
$this->context->cookie->logged = 1;
 
if (version_compare(_PS_VERSION_, '1.5', '<'))
Module::hookExec('authentication');
else
Hook::exec('authentication');
 
if ($redirect)
{
$link = $this->context->link->getPageLink('order.php', false, null, array('step' => '3'));
Tools::redirectLink($link);
exit(0);
}
}
}

Share this post


Link to post
Share on other sites
  • 0

La verdad es que la modificación es de hace un tiempo y no sé si todavía funciona. Has limpiado caché? Has puesto trazas en esa parte del código para confirmar que está pasando por ahí?

Share this post


Link to post
Share on other sites
  • 0

Hola de nuevo, ya limpie la cache y aun sigue igual, en cuanto a las trazas realmente no se como hacerlo, si depronto me puedes explicar como puedo realizar una traza en el código, te lo agradecería. No soy muy experto en php

 

Saludos

Share this post


Link to post
Share on other sites
  • 0

Antes de la línea 

$cart_currency = new Currency((int)$this->context->cart->id_currency);

Introduce el código

mail("tu dirección de correo electrónico", "Paypal", print_r($this->context->cart->id_currency, true));

añadiendo tu dirección de correo.

 

Haz una prueba y recibirás un correo. Dime el contenido de ese correo (será un número).

Share this post


Link to post
Share on other sites
  • 0

Buen Aporte joseantgv (el post es antiguo pero perfectamente operativo con PS 1.6.0.9 y Paypal 3.8.2)

 

Tu solución es muy buena, analizándola se me ha ocurrido otra variante para que funcione igual que tu módulo TPV, es decir que el cobro sea siempre en la divisa de la tienda.

 

1) el radio button no haría falta cambiarlo por un check, se puede quedar el radio y tendríamos que marcar la opción "divisa del cliente" para que paypal aparezca siempre

2) la segunda modificación la hacemos pero indicando directamente que divisa debe utilizar, cambiariamos

$this->currency = new Currency((int)$this->context->cart->id_currency);

por:

$this->currency = new Currency((int)$this->context->cart->id_currency=X);

Siendo X la divisa de la tienda (entonces debe ser una que paypal acepte) dolar, euro, libra etc

 

3) la tercera modificación la hacemos como dices.

 

 

De esta forma independientemente de la divisa que vea el cliente, el pago siempre nos lo hará en la que nos interese: Dolar, Euro... en este caso como el cliente va ha pagar en otra divisa diferente a la que vé, es interesante complementarlo con una modificación como esta para ver dos divisas en el carrito (https://www.prestashop.com/forums/topic/362605-aporte-mostrar-dos-divisas-en-el-carrito/)

 

 

Ventajas

 

1) Pues que de esta forma el artículo que vale 105,40 euros, siempre cobraremos por el 105,40 euros, según este el cambio de la divisa el cliente lo podrá ver en mas o menos (110,09$ o 100,102$) pero la tienda siempre ingresa lo mismo.

 

2) No volvemos loco al contable o asesor fiscal, ya que paypal redondea los decimales a 00 cuando usa otras divisas que no son la principal de la cuenta, y si le presentamos muchos cobros distintos a la factura se mosquea (por lo menos el mio).

 

Quizás para dos o tres divisas tu sistema es mejor, nosotros vendemos a todo el mundo, y siempre hemos pensado que los compradores se sienten más cómodos viendo la tienda en su moneda habitual, (tenemos la tienda en 15 divisas) y paypal con algunas hace cosas raras, por ejemplo al Franco suizo le pone la palabra "undefined" justo al lado del importe.

 

 

Se admiten críticas claro, lo que es cierto es que podemos adaptar paypal al gusto de cada uno.

Edited by moraira

Share this post


Link to post
Share on other sites
  • 0

Hola joseantgv,

El numero que recibí fue el numero 3.

 

Quedo atento a cualquier comentario.

Gracias

 

Hola,

 

por lo que parece no está haciendo el cambio de divisa.

 

Elimina esa traza y añádela antes de la línea que modificaste:

mail("tu dirección de correo electrónico", "Paypal 1", print_r($this->context->cart->id_currency, true));
$this->currency = new Currency((int)$this->context->cart->id_currency=1);
mail("tu dirección de correo electrónico", "Paypal 2", print_r($this->currency->id_currency, true));

Share this post


Link to post
Share on other sites
  • 0

Hola de nuevo, volví nuevamente a limpiar la cache a colocar el código de abajo y funciono sin problemas

 

$this->context->cart->id_currency=1;
$this->currency = new Currency((int)$this->context->cart->id_currency);

 

Quedo completamente agradecido con joseantgv y todos los que ayudaron en este problema.

Share this post


Link to post
Share on other sites
  • 0

Hola soy nuevo con muy poca experiencia en manejo de codigos, tengo el prestashop Cloud y tengo el mismo problema mi tienda esta en Nuevos soles y cuando le doy comprar sale esto

 

PayPal response:
TIMESTAMP -> 2015-06-02T15:46:28Z
L_ERRORCODE0 -> 10605
L_SHORTMESSAGE0 -> Transaction refused because of an invalid argument. See additional error messages for details.
L_LONGMESSAGE0 -> Currency is not supported
L_SEVERITYCODE0 -> Error

 

mi tienda esta por defecto en soles (PEN) pero paypal no acepta soles, quiero q mis clientes compren en soles pero q paypal facure en dolares.

segun lo que leo tengo que cambiar el Process.php pero no se como acceder a los codigos em prestashop cloud ni con q programa hacerlo espero me puedan ayudar

Share this post


Link to post
Share on other sites
  • 0

Hola soy nuevo con muy poca experiencia en manejo de codigos, tengo el prestashop Cloud y tengo el mismo problema mi tienda esta en Nuevos soles y cuando le doy comprar sale esto

 

PayPal response:

TIMESTAMP -> 2015-06-02T15:46:28Z

L_ERRORCODE0 -> 10605

L_SHORTMESSAGE0 -> Transaction refused because of an invalid argument. See additional error messages for details.

L_LONGMESSAGE0 -> Currency is not supported

L_SEVERITYCODE0 -> Error

 

mi tienda esta por defecto en soles (PEN) pero paypal no acepta soles, quiero q mis clientes compren en soles pero q paypal facure en dolares.

segun lo que leo tengo que cambiar el Process.php pero no se como acceder a los codigos em prestashop cloud ni con q programa hacerlo espero me puedan ayudar

 

Aunque estés en Cloud puedes acceder a la carpeta /modules por FTP. Busca en tu panel de control o pregunta a PS. No he utilizado el Cloud y no te puedo decir dónde puedes encontrar esos datos.

Share this post


Link to post
Share on other sites
  • 0

hola amigos,

 

gruacias a joseantgv por el aporte.

 

Con la modificaciones realizada me estaba trabajando perfecto en la version ps 1.5, pero ahora acutalize a ps 1.6, realize las modificaciones al modulo y hace las conversiones normalmente pero al final de la transacion lanza error de pago y  completa la transacion lo que causa confusion en el cliente  y realizia es pago nuevamente y se duplica. 

 

otra cosa es que cuando lanza el error de pago solo cobra al cliente los productos, si el cliente elije el envio a domicilio el costo del envio no lo realiza en la transacion.

 

alguna idea de como solucionar el problema.

 

gracias espero por su ayuda 

Share this post


Link to post
Share on other sites
  • 0

Hola a todos.

Alguno sabe cómo hacer para que el bloque de paypal se muestre SIEMPRE en el checkout (aunque todos los productos estén pesos uruguayos) ?

Quiero vender en Pesos Uruguayos y que el bloque de Paypal aparezca en el checkout y por supuesto haga la conversión a USD.

 

Tengo PS1.6 y estoy probando con Paypal Europa. Actualmente ya he verificado que hace la conversión pero sin que aparezca en el checkout pero obviamente necesito que para los clientes APAREZCA.

 

Muchas gracias y saludos desde Uruguay.

Share this post


Link to post
Share on other sites
  • 0

Hola a todos.

Alguno sabe cómo hacer para que el bloque de paypal se muestre SIEMPRE en el checkout (aunque todos los productos estén pesos uruguayos) ?

Quiero vender en Pesos Uruguayos y que el bloque de Paypal aparezca en el checkout y por supuesto haga la conversión a USD.

 

Tengo PS1.6 y estoy probando con Paypal Europa. Actualmente ya he verificado que hace la conversión pero sin que aparezca en el checkout pero obviamente necesito que para los clientes APAREZCA.

 

Muchas gracias y saludos desde Uruguay.

 

Tienes que hacer la asociación en "Módulos -> Pago".

Share this post


Link to post
Share on other sites
  • 0

Saludos.

Tengo el mismo problema que aqui se plantea.

Mis versiones son:

PrestaShop version: 1.7.3.1
PayPal v4.3.3

 

Por favor podría indicarme donde esta ubicado el archivo process.php para poder hacer los cambios sugeridos.

En mi instalación del modulo de paypal no esta el directorio modules/paypal/express_checkout/

Gracias.

Edited by principe3000

Share this post


Link to post
Share on other sites
  • 0
On 14/4/2018 at 11:40 AM, principe3000 said:

Saludos.

Tengo el mismo problema que aqui se plantea.

Mis versiones son:

PrestaShop version: 1.7.3.1
PayPal v4.3.3

 

Por favor podría indicarme donde esta ubicado el archivo process.php para poder hacer los cambios sugeridos.

En mi instalación del modulo de paypal no esta el directorio modules/paypal/express_checkout/

Gracias.

 

Yo también tengo el mismo problema.,   lo mas cercano que encontré es la función getPaymentCurrencyIso en "modules/paypal.php" pero no me funciona el cambio....... se agradecería alguien que tenga la info

PS: 1.7.3.2

 PayPal v4.4.1 - by PrestaShop

saludos

 

Share this post


Link to post
Share on other sites
  • 0

Hola Amigos

Tengo el mismo problema y no quisiera vender en otra moneda diferente a la local (no soportada por Paypal) .Mi version de PS es 1.7.4.2 y Paypal v4.4.1

 

saludos

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

Cookies ensure the smooth running of our services. Using these, you accept the use of cookies. Learn More