Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Closed
pixelsmill opened this issue Mar 16, 2015 · 5 comments
Closed

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

pixelsmill opened this issue Mar 16, 2015 · 5 comments

Comments

@pixelsmill
Copy link

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
Copy link
Author

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
Copy link
Contributor

bibich commented Jun 2, 2015

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
Copy link
Author

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
Copy link
Contributor

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

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

@pixelsmill
Copy link
Author

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.

@pixelsmill pixelsmill changed the title Paypal US Account > State is required ! [resolu] Paypal US Account > State is required ! Jun 3, 2015
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants