All posts tagged paypal

logo_paypal

Il y a un bug dans Paypal Standard pour Magento, après qu’un client a effectué le processus d’achat et validé son paiement sur Paypal. Le client ne reçoit pas l’email incluant sa facture. Il ne reçoit seulement qu’une confirmation de paiement et un message, après le processus de paiement, lui indiquant que sa commande va être traitée.

Pour résoudre ce problème, deux possibilités:

  • Soit ajouter dans la classe (en faisant une surcharge de cette classe dans un module à vous) Mage_Paypal_Model_Standard (app/code/core/Mage/Paypal/Model/) à la ligne 418 après $invoice->register()->pay();, la ligne suivante: $invoice->sendEmail();
  • Soit créer un évènement (event) à l’aide d’une classe Observer.php qui se déclenchera après l’évènement sales_order_invoice_pay, qui dans Paypal standard démarre à la ligne 418, après le traitement $invoice->register()->pay(). Pour cela, vous dever créer un module (il y a plein de tutoriaux sur Google pour savoir comment on fait) avec les fichiers suivants (remplacer Name par le nom de votre Module):
    • /app/code/local/Name/Sales/etc/config.xml
    • /app/code/local/Name/Sales/Model/Observer.php
    • /app/etc/modules/Name_All.xm
En voici le contenu:
/app/code/local/Name/Sales/etc/config.xml
<?xml version="1.0" encoding="UTF-8"?>
<config>
    <modules>
        <Name_Sales>
            <version>0.1.0</version>
        </Name_Sales>
    </modules>
    <global>
        <models>
            <sales>
                <rewrite>
                    <observer>Name_Sales_Model_Observer</observer>
                </rewrite>
            </sales>
        </models>
        <events>
            <sales_order_invoice_pay>
                <observers>
                    <sales_notification_observer>
                        <type>singleton</type>
                        <class>sales/observer</class>
                        <method>sendInvoiceEmail</method>
                    </sales_notification_observer>
                </observers>
            </sales_order_invoice_pay>
        </events>
    </global>
</config>

/app/code/local/Name/Sales/Model/Observer.php

<?php
/**
 * Event sales_order_invoice_pay
 *
 */
require_once 'Mage/Sales/Model/Observer.php';
class Name_Sales_Model_Observer extends Mage_Sales_Model_Observer {
 
    public function sendInvoiceEmail($observer) {
            $invoice = $observer->getEvent ()->getInvoice ();
 
            switch ($invoice->getState ()) {
                case Mage_Sales_Model_Order_Invoice::STATE_PAID :
 
		try {
			// Save first time the invoice to get an id and send the invoice to the customer with the correct id
			$invoice->save ();
			Mage::log ('Email sent to the customer by the Name/sales/observer - Invoice number ' . $invoice->getIncrementId(), Zend_Log::DEBUG );
			$invoice->sendEmail ();
			$invoice->setEmailSent ( true );
			// Save a second time to save the EmailSent value
			$invoice->save ();
		} catch ( Exception $e ) {
			$session = Mage::getSingleton ( 'core/session' );
			$exception = new Exception ( Mage::helper('Sales')->__('Error during the email sending.'), 0 );
			$session->addException ( $exception, Mage::helper('Sales')->__('Error to send invoice email. Please, contact the website administrator.') );
		}
            }
        return $this;
    }
}

/app/etc/modules/Name_All.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Name_Sales>
            <active>true</active>
            <codePool>local</codePool>
        </Name_Sales>
    </modules>
</config>

Dans Paypal Express, la ligne qui nous intéresse se situe dans le controller /app/code/core/Mage/Paypal/controllers/expressController.php, dans la méthode updateorderAction(){} ligne où ce code se situe: $invoice->register()->capture(); ajouté $invoice->sendEmail(); ou utiliser cet observer (non testé).

Pour plus d’informations concernant l’utilisation des évènements, je vous invite à visiter le site de Magento qui en fait une bonne explication: Customizing Magento using Event-Observer Method

S’il y a bien quelque chose qui m’a étonné, c’est de voir que le mode de paiement Paypal apparraissait lors d’une commande (processus onepage checkout par exemple) dont le montant du panier d’achat est de 0. Ce scénario peut effectivement arrivé pour certains sinon Varien ne proposerai pas dans les modes de paiement de Magento l’option « No payment information is required ». Je vous propose de changer ce comportement en ajoutant simplement trois fichiers dans votre installation de Magento.

Voici comment procéder:

  1. Créé un module Paypal dans Magento dans le dossier suivant, par exemple: /app/code/local/Yourname/Paypal/
  2. Créé un dossier « etc » dans le nouveau module créé: /app/code/local/Yourname/Paypal/etc/
  3. Créé un fichier config.xml avec le contenu affiché ci-dessous (remplacer yourname par le nom souhaité – nom de société ou autre)
  4. Créé un fichier system.xml avec le contenu affiché ci-dessous
  5. Activer votre nouveau module en créant le fichier /app/etc/modules/Yourname_All.xml avec les informations ci-dessous en n’oubliant pas de remplacer Yourname.

Ce code est pour les versions 1.5.x de Magento

Lisez jusqu’en bas de cet article pour avoir toutes les lignes de codes nécessaires. Plus bas vous trouverez le code pour Magento < 1.4
- Fichier etc/config.xml:

<?xml version="1.0"?>
<config>
    <modules>
        <Yourname_Paypal>
            <version>0.1.0</version>
        </Yourname_Paypal>
    </modules>
   
   <global>
        <models>
            <paypal>
                <rewrite>
                    <standard>Yourname_Paypal_Model_Overwrite_Standard</standard>
                </rewrite>
            </paypal>
        </models>
    </global>
   
       <default>
        <paypal>
            <wps>
                <min_order_total></min_order_total>
                <max_order_total></max_order_total>
            </wps>
        </paypal>
    </default>
</config>

- Fichier etc/system.xml

<?xml version="1.0"?>
<config>
   <sections>
        <paypal translate="label" module="paypal">
            <groups>
                <wps translate="label comment">
                    <fields>
                        <min_order_total translate="label">
                            <label>Minimum Order Total</label>
                            <frontend_type>text</frontend_type>
                            <sort_order>50</sort_order>
                            <show_in_default>1</show_in_default>
                            <show_in_website>1</show_in_website>
                            <show_in_store>0</show_in_store>
                        </min_order_total>
                        <max_order_total translate="label">
                            <label>Maximum Order Total</label>
                            <frontend_type>text</frontend_type>
                            <sort_order>60</sort_order>
                            <show_in_default>1</show_in_default>
                            <show_in_website>1</show_in_website>
                            <show_in_store>0</show_in_store>
                        </max_order_total>
                    </fields>
                </wps>
            </groups>
        </paypal>
    </sections>
</config>

- Fichier Model/Overwrite/Standard.php

<?php

class Yourname_Paypal_Model_Overwrite_Standard extends Mage_Paypal_Model_Standard
{
    /**
     * Check whether payment method can be used
     * @param Mage_Sales_Model_Quote
     * @return bool
     */
    public function isAvailable($quote = null)
    {
    	/**
         * Checking for min/max order total for assigned payment method
         */
        $total = $quote->getBaseGrandTotal();
        $minTotal = Mage::getStoreConfig('paypal/wps/min_order_total', ($quote ? $quote->getStoreId() : null));
        $maxTotal = Mage::getStoreConfig('paypal/wps/max_order_total', ($quote ? $quote->getStoreId() : null));

        $priceAuth = true;
        if((!empty($minTotal) && ($total < $minTotal)) || (!empty($maxTotal) && ($total > $maxTotal))) {
            $priceAuth = false;
        }
        
        if ($this->getConfig()->isMethodAvailable() && parent::isAvailable($quote) && $priceAuth) {
            return true;
        }
        return false;
    }
}

Ce code est pour les versions < 1.4.x de Magento

- Fichier config.xml:

<?xml version="1.0"?>
<config>
    <modules>
        <Yourname_Paypal>
            <version>0.1.0</version>
        </Yourname_Paypal>
    </modules>

    <default>
        <payment>
            <paypal_express>
                <min_order_total>0</min_order_total>
                <max_order_total>0</max_order_total>
            </paypal_express>
            <paypal_direct>
                <min_order_total>0</min_order_total>
                <max_order_total>0</max_order_total>
            </paypal_direct>
            <paypal_standard>
                <min_order_total>0</min_order_total>
                <max_order_total>0</max_order_total>
            </paypal_standard>
        </payment>
    </default>
</config>

- File system.xml:

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <sections>
        <payment>
            <groups>
                <paypal_direct>
                    <fields>
                        <min_order_total translate="label">
                            <label>Minimum Order Total</label>
                            <frontend_type>text</frontend_type>
                            <sort_order>98</sort_order>
                            <show_in_default>1</show_in_default>
                            <show_in_website>1</show_in_website>
                            <show_in_store>0</show_in_store>
                        </min_order_total>
                        <max_order_total translate="label">
                            <label>Maximum Order Total</label>
                            <frontend_type>text</frontend_type>
                            <sort_order>99</sort_order>
                            <show_in_default>1</show_in_default>
                            <show_in_website>1</show_in_website>
                            <show_in_store>0</show_in_store>
                        </max_order_total>
                    </fields>
                </paypal_direct>
                <paypal_express>
                    <fields>
                        <min_order_total translate="label">
                            <label>Minimum Order Total</label>
                            <frontend_type>text</frontend_type>
                            <sort_order>98</sort_order>
                            <show_in_default>1</show_in_default>
                            <show_in_website>1</show_in_website>
                            <show_in_store>0</show_in_store>
                        </min_order_total>
                        <max_order_total translate="label">
                            <label>Maximum Order Total</label>
                            <frontend_type>text</frontend_type>
                            <sort_order>99</sort_order>
                            <show_in_default>1</show_in_default>
                            <show_in_website>1</show_in_website>
                            <show_in_store>0</show_in_store>
                        </max_order_total>
                    </fields>
                </paypal_express>
                <paypal_standard>
                    <fields>
                        <min_order_total translate="label">
                            <label>Minimum Order Total</label>
                            <frontend_type>text</frontend_type>
                            <sort_order>98</sort_order>
                            <show_in_default>1</show_in_default>
                            <show_in_website>1</show_in_website>
                            <show_in_store>0</show_in_store>
                        </min_order_total>
                        <max_order_total translate="label">
                            <label>Maximum Order Total</label>
                            <frontend_type>text</frontend_type>
                            <sort_order>99</sort_order>
                            <show_in_default>1</show_in_default>
                            <show_in_website>1</show_in_website>
                            <show_in_store>0</show_in_store>
                        </max_order_total>
                    </fields>
                </paypal_standard>
            </groups>
        </payment>
    </sections>
</config>

- Fichier Yourname_All.xml:

<?xml version="1.0"?>
<config>
    <modules>
        <Yourname_Paypal>
            <active>true</active>
            <codePool>local</codePool>
        </Yourname_Paypal>
    </modules>
</config>

Code valable pour toutes les versions de Magento 1.x

- Fichier app/etc/modules/Yourname_Paypal.xml:

<?xml version="1.0"?>
<config>
    <modules>
        <Yourname_Paypal>
            <active>true</active>
            <codePool>local</codePool>
        </Yourname_Paypal>
    </modules>
</config>

Pour terminer, vous n’aurez plus qu’à aller dans votre backend, Configuration > Modes de paiement > Paypal (Express, standard ou direct) et fournir un montant minimum ou voir même maximum pour que ce mode de paiement soit affiché ou pas.

Bonne programmation.