thelia-modules / PayPal

Paypal module for Thelia ecommerce solution
8 stars 28 forks source link

[resolu] Paypal US Account > State is required ! #17

Closed pixelsmill closed 9 years ago

pixelsmill commented 9 years ago

Bonjour, Faisant un test de paiement Paypal en tant que faux client américain, j'ai rencontré une erreur, cad l'apparition de la page "gotopaypalfail.html".

Les log de Paypal informe que l'état est manquant : 17: INFO [PaypalApiLogManager.php:logTransaction()] {59} 2015-03-16 17:04:00: 2015-03-16 16:04:00 Transaction Failure correlationId: 3da19670a1a2c error: [10729] The field Shipping Address State is required

Le pb est le même que ce soit "USA - New York" ou "USA - Alabama", etc... Le fameux champ state si cher aux ricains doit aussi poser problème pour les clients canadiens... Oups, ça ne semble pas être un bug mais une lacune, state est laissé vide...

Thelia 2.1.2 Module Paypal/Controller/GotoPaypal.php ligne 137 :

  $address->getLastname(),
  $address->getAddress1(),
  $address->getAddress2(),
  $address->getCity(),
  "", // State
  $address->getZipcode(),
  CountryQuery::create()->findPk($address->getCountryId())->getIsoalpha2()
pixelsmill commented 9 years ago

Bonjour, Est-ce que quelqu'un saurait corriger ce problème ? Aujourd'hui la boutique est en production et toutes les ventes usa échouent... Help !!

bibich commented 9 years ago

Effectivement, c'est une lacune de Thelia. Le problème va être corrigé mais pas rapidement. Pour un module que je suis en train de faire, j'ai aussi rencontré le problème. J'ai fait un fix temporaire (pas trop testé) pour retrouver le code de l'état ou de la province. C'est pas trop jolie mais tant que la modif n'est pas fait au niveau de Thelia, c'est mieux que rien. Par contre, il faudra adapter le module Paypal pour que ça fonctionne :

...
$this->getProvince($address->getCountry()), // state
...

la fonction à ajouter

/**
     * fixme: waiting for province in Thelia
     */
    protected function getProvince(Country $country)
    {
        $provinces = [
            'CAN' => [
                'AB' => ['alberta'],
                'BC' => ['british columbia', 'colombie britannique'],
                'PE' => ['prince edward island', 'ile du prince edouard'],
                'MB' => ['manitoba'],
                'NB' => ['new brunswick', 'nouveau brunswick'],
                'NS' => ['nova scotia', 'nouvelle ecosse'],
                'ON' => ['ontario'],
                'QC' => ['quebec'],
                'SK' => ['saskatchewan'],
                'NL' => ['newfoundland and labrador', 'terre neuve et labrador'],
                'NU' => ['nunavut'],
                'NT' => ['northwest territories', 'territoires du nord ouest'],
                'YT' => ['yukon'],
            ],
            'USA' => [
                'AL' => ['alabama'],
                'AK' => ['alaska'],
                'AZ' => ['arizona'],
                'AR' => ['arkansas'],
                'CA' => ['california'],
                'NC' => ['north carolina'],
                'SC' => ['south carolina'],
                'CO' => ['colorado'],
                'CT' => ['connecticut'],
                'ND' => ['north dakota'],
                'SD' => ['south dakota'],
                'DE' => ['delaware'],
                'FL' => ['florida'],
                'GA' => ['georgia'],
                'HI' => ['hawaii'],
                'ID' => ['idaho'],
                'IL' => ['illinois'],
                'IN' => ['indiana'],
                'IA' => ['iowa'],
                'KS' => ['kansas'],
                'KY' => ['kentucky'],
                'LA' => ['louisiana'],
                'ME' => ['maine'],
                'MD' => ['maryland'],
                'MA' => ['massachusetts'],
                'MI' => ['michigan'],
                'MN' => ['minnesota'],
                'MS' => ['mississippi'],
                'MO' => ['missouri'],
                'MT' => ['montana'],
                'NE' => ['nebraska'],
                'NV' => ['nevada'],
                'NH' => ['new hampshire'],
                'NJ' => ['new jersey'],
                'NM' => ['new mexico'],
                'NY' => ['new york'],
                'OH' => ['ohio'],
                'OK' => ['oklahoma'],
                'OR' => ['oregon'],
                'PA' => ['pennsylvania'],
                'RI' => ['rhode island'],
                'TN' => ['tennessee'],
                'TX' => ['texas'],
                'UT' => ['utah'],
                'VT' => ['vermont'],
                'VA' => ['virginia '],
                'WV' => ['west virginia'],
                'WA' => ['washington'],
                'WI' => ['wisconsin'],
                'WY' => ['wyoming'],
            ]
        ];

        $transliterator = Transliterator::create('NFD; [:Nonspacing Mark:] Remove; NFC;');

        if (null !== $country) {
            $name = $country->getTitle();
            $name = $transliterator->transliterate($name);
            $name = strtolower($name);
            $name = preg_replace('#\s+#', ' ', $name);

            if (array_key_exists($country->getIsoalpha3(), $provinces)) {

                foreach ($provinces[$country->getIsoalpha3()] as $code => $provinceNames) {
                    foreach ($provinceNames as $provinceName) {
                        if (false !== strpos($name, $provinceName)) {
                            return $code;
                        }
                    }
                }
            }
        }

        return null;
    }
pixelsmill commented 9 years ago

Merci ;) Et bien, voilà une piste intéressante. J'ai tenté d'intégrer le fonction dans la classe GotoPaypal mais j'ai quelques erreurs qui apparaissent... J'ai notament ajouté "use Thelia\Model\Base\Country;" dans l'entete.

Maintenant l'erreur est : ClassNotFoundException: Attempted to load class "Transliterator" from namespace "Paypal\Controller" in /home/orgohiqo/www-shop/local/modules/Paypal/Controller/GotoPaypal.php line 327. Do you need to "use" it from another namespace?

Une idée ?

roadster31 commented 9 years ago

Transliterator est une classe standard : http://php.net/manual/fr/class.transliterator.php

Essaie ça : $transliterator = \Transliterator::create(....

pixelsmill commented 9 years ago

Nickel, merci ça marche ;) Pour info, j'ai dû corriger les coordonnées de mon compte client pour avoir une adresse américaine valide, puisque Paypal a rejeté mes premiers tests. En effet, Paypal vérifie la cohérence entre le pays, l'état le code postal et la ville et me renvoyais l'erreur suivante dans les logs : A match of the Shipping Address City, State, and Postal Code failed.