Adyen / adyen-magento2

Adyen Payment plugin for Magento2
MIT License
155 stars 210 forks source link

Postal code field empty throwing error in adyen "Error: Billing address is incomplete" #1096

Closed gauravharshranosys closed 2 years ago

gauravharshranosys commented 3 years ago

When doing payment with HPP, getting error below :

Invalid Request Unfortunately we were unable to process this request

Error: Billing address is incomplete

(Note: these error messages are not visible on the live platform)

To Reproduce Steps to reproduce the behavior:

  1. Make post code field optional
  2. Pay with HPP (Alipay or wechat)
  3. See error

Expected behavior Payment should be done as it gets complete with postal code

Magento version [e.g. 2.4.1]

Plugin version [e.g. 6.6.8]

Screenshots image

acampos1916 commented 3 years ago

Hello @gauravharshranosys thanks for opening this issue. I see you changed the title, what exactly do you mean with "Payment should be done as it gets complete with postal code"? Is the payment requests not including all address fields?

Please share the relevant request from info.log in order to verify.

gauravharshranosys commented 3 years ago

Hello @acampos1916 , Thanks for checking. I have made the zip code optional attribute in Magento, so my billing address contains a empty zip code so in that case the payment is failing, whereas the other store where zipcode is mandatory, the payment is working fine. Is Adyen doesn't handle empty zip code or from any configuration it is possible ?

Thanks

tnaber commented 2 years ago

Hi @gauravharshranosys,

I have looked into this issue and have not been able to reproduce it (in v8), it should be possible to make payments without a zipcode. Is this still an active problem for you? Updating to v7 or higher might resolve your problem. If you are determined to stay on your current version, could you provide me with the logs from adyen/info.log of the relevant payment.

Cheers, Titus

tnaber commented 2 years ago

I'm closing this. Feel free to reopen if the problem persists.

dimitriBouteille commented 11 months ago

Hello @tnaber

I reproduce this issue with 8.21.0, in my case zipcode is optional, so zipcode can be empty in shipping and billing addresses.

Capture d’écran du 2023-10-25 09-06-48

Capture d’écran du 2023-10-25 11-45-01

For billing and delivery addresses, zipcode is empty :(

Capture d’écran du 2023-10-25 09-08-10

Full request log for call /v70/payments :

{
   "merchantAccount" : "****",
   "shopperReference" : "***********************************************",
   "shopperEmail" : "************************************",
   "telephoneNumber" : "************",
   "shopperName" : {
      "firstName" : "****",
      "lastName" : "****"
   },
   "countryCode" : "HK",
   "shopperLocale" : "en_GB",
   "shopperIP" : "***************************************",
   "billingAddress" : {
      "street" : "**************",
      "postalCode" : "",
      "city" : "*******************",
      "houseNumberOrName" : "****",
      "country" : "**",
      "stateOrProvince" : "*****"
   },
   "deliveryAddress" : {
      "street" : "**************",
      "postalCode" : "",
      "city" : "*******************",
      "houseNumberOrName" : "****",
      "country" : "**",
      "stateOrProvince" : "*****"
   },
   "amount" : {
      "currency" : "HKD",
      "value" : 15390000
   },
   "reference" : "49000100126",
   "fraudOffset" : "0",
   "browserInfo" : {
      "userAgent" : "Mozilla\/5.0 (X11; Linux x86_64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/114.0.0.0 Safari\/537.36",
      "acceptHeader" : "\/"
   },
   "shopperInteraction" : "Ecommerce",
   "paymentMethod" : {
      "type" : "*********",
      "checkoutAttemptId" : "*****************************************************************************************************************"
   },
   "riskData" : {
      "clientData" : "eyJ2ZXJzaW9uIjoiMS4wLjAiLCJkZXZpY2VGaW5nZXJwcmludCI6IkRwcXdVNHpFZE4wMDUwMDAwMDAwMDAwMDAwS1piSVFqNmt6czAwODkxNDY3NzZjVkI5NGlLekJHNW5xajJHdUZqZkJpeDdSWDNhejgwMDJRaExsOEhjR3pOMDAwMDBUSXZqWDAwMDAwRGt1Ym9qeEI0VmZDd3E3ZkhJa2w6NDAiLCJwZXJzaXN0ZW50Q29va2llIjpbXSwiY29tcG9uZW50cyI6eyJ1c2VyQWdlbnQiOiJiOWQ3YzFhN2UzNjliODJmMjI1MWE0OTVlN2MwZGM1OSIsIndlYmRyaXZlciI6MCwibGFuZ3VhZ2UiOiJmci1GUiIsImNvbG9yRGVwdGgiOjI0LCJkZXZpY2VNZW1vcnkiOjgsInBpeGVsUmF0aW8iOjEsImhhcmR3YXJlQ29uY3VycmVuY3kiOjIwLCJzY3JlZW5XaWR0aCI6MjU2MCwic2NyZWVuSGVpZ2h0IjoxNDQwLCJhdmFpbGFibGVTY3JlZW5XaWR0aCI6MjU2MCwiYXZhaWxhYmxlU2NyZWVuSGVpZ2h0IjoxNDQwLCJ0aW1lem9uZU9mZnNldCI6LTEyMCwidGltZXpvbmUiOiJFdXJvcGUvUGFyaXMiLCJzZXNzaW9uU3RvcmFnZSI6MSwibG9jYWxTdG9yYWdlIjoxLCJpbmRleGVkRGIiOjEsImFkZEJlaGF2aW9yIjowLCJvcGVuRGF0YWJhc2UiOjEsInBsYXRmb3JtIjoiTGludXggeDg2XzY0IiwicGx1Z2lucyI6IjI5Y2Y3MWUzZDgxZDc0ZDQzYTViMGViNzk0MDViYTg3IiwiY2FudmFzIjoiMGNjOTZlNmIzZWMyZTEyNmIyNGZiMWEyZGEzMTk1NzciLCJ3ZWJnbCI6ImI1OTQ4YTg3ZmNlMTI2YWQyM2FjMjg3MDRlMDBiOWE4Iiwid2ViZ2xWZW5kb3JBbmRSZW5kZXJlciI6Ikdvb2dsZSBJbmMuIChJbnRlbCl+QU5HTEUgKEludGVsLCBNZXNhIEludGVsKFIpIEdyYXBoaWNzIChBREwgR1QyKSwgT3BlbkdMIDQuNikiLCJhZEJsb2NrIjowLCJoYXNMaWVkTGFuZ3VhZ2VzIjowLCJoYXNMaWVkUmVzb2x1dGlvbiI6MCwiaGFzTGllZE9zIjowLCJoYXNMaWVkQnJvd3NlciI6MCwiZm9udHMiOiI5MGU2NDRlZWJmODkwODQyNDcyNWU2NWI0MzYwYzYzYSIsImF1ZGlvIjoiOTAyZjBmZTk4NzE5Yjc3OWVhMzdmMjc1MjhkZmIwYWEiLCJlbnVtZXJhdGVEZXZpY2VzIjoiNWYzZmRhZjQ3NDNlYWE3MDdjYTZiN2RhNjU2MDM4OTIifX0="
   },
   "additionalData" : {
      "allow3DS2" : "true"
   },
   "returnUrl" : "https:\/\/my-site.com\/en-hk\/adyen\/process\/result?merchantReference=49000100126",
   "channel" : "web",
   "origin" : "https:\/\/my-site.com/en-hk\/",
   "applicationInfo" : {
      "adyenLibrary" : {
         "name" : "adyen-php-api-library",
         "version" : "15.3.0"
      },
      "externalPlatform" : {
         "version" : "2.4.5-p5",
         "name" : "Magento",
         "integrator" : "Adyen"
      },
      "merchantApplication" : {
         "version" : "8.21.0",
         "name" : "adyen-magento2"
      }
   }
}

The request response :

{
   "resultCode" : "RedirectShopper",
   "action" : {
      "paymentMethodType" : "alipay_hk",
      "url" : "https:\/\/test.adyen.com\/hpp\/checkout.shtml?u=skipDetails&p=eJytVltzosoW-jXJyy4taLzEBx9UkGACRkSQfplqoJWWbmAAL-Dr94KYmTnJTM2pU6eiBNe9v2*t7iacZ1dF3aJpVZzpI8lzzkJSsSw10kPWp7eKFinhb5xUh6wQRlrRY0GqrJjOopqmf3WwiKBTkxxpWmV-NXZpUYJuivqD-rCXD784cBYUpKi7oKTN38vjvEdy1rtr-uTxEVke9pW*9MVK0CKMSVrNfsp-ySHey0f-jdtHoqc*kiFRwDhn6XEWRQUty37Iqnq6gGAF4f*QNPrHo2ULwRe77Aw29fT55bMmzs4ltc4ioMW66GpEw8ngs1WelRXhiyyiU4w-K0FV0XXxVmQXloYUkvS*5imrgtJquiUiL7P0n23385ORU*eQ-hEATqMuF*EsJ-W3OHkMnYKENCcFrHUqST15PJEHozGiBzIejYdP0YAqKFJINJIVORrTHhpH4WgSHBCZDJ5oEPUk*TGMaZhk56pf-T*CvUPa1QnLDc8FhAs-fquPEeXsQov6r1R9MfzJ1WfVH8j6bPZ7Qr5a-Y6RT1Z3Sn40ZthVN10LeiQQ80P*McbQqf2qdVk8a4uX9c75pmuWZhuL31pe7r09ln6obXqgLY50OphIkiTDB41*0VbnIlVJRabO82T**vzm7gfzV*vl6WeJW3acesV6vnhBPKkf0HL2gOYi3KZrccXJCwiImr7YIKTe9zdG8Os5F*rsQVEfs8OhBESkR2g6AUzNRLdYeai0tUiPBc0pqXpZ2quYoNBI73sc4LSzX6dxVeXlgwLplvD56LUyzvKcFr0K2O534w8Ei68GIClpcWEhLeH17b0AIwVbmA*bRqygYQWaiwwPnoWwyb3bmLSKs*hBWX7iCBZ0Z*kBjYoOOKgSpO91omFb6bCtFR7QMUfI089ajyupoLi2EUU-Tjo9bFr3t24J3VteZFBs2b0DBGdetUGXX5hspeovbEI5v04zVPS-jmDByiSCZuiHnEGkri9ovUJ4v2qINzkbp4yZ28H19TRjr4tVgvc495GrE2*Ygs01FPwcLYyRkdjXcB*51nO*xNrgaqo7*M7*47uVc7Z1l98tUY3CZnZdq8nNUn3FavDJTYyhpfNXmqyeLW94I6fVc7TD33GyyqkabT3ViunpCHFWNtFu5VqLT7aSr99jz3fbPf7u3fPYeiX7YvKdaobkCqxGiqbgJF4RdB1ZareOa7e*vSVhbyht0ORCEOfGKQ-22yvz0aQK9cm51YW1MQI85BC59caLeJBu2Jqt2NrbKH6zjC20a6wTZ2t1JcyTIZueJq0dl1vIvGLdlNdbozTSiPvCrske85AZI3NxZYG*PGPFjTHatfFEyGR9x8BWWJdAn9S27l4j-cjWJ0P6BXcLe-IlTBOQHyHuPKe6W*7EUiLeE8g08I-jUNiKv19xWNfZV9w6FC78b32MK8RqfGXFYW174tkSAe7M0w61NYXIqrHnnre6m2MUS8A98LNpfeJILHOoGep2nT-5*3scE*8W**LGd3*OBbXKnArAdzcROLV42z*vjla3MSKdV3ifXwLR4bKM9qtLqO8uO30J*Jktdw3eW11v7hT7EoplirdQw7bFdHLyvZsTAX4*cNXmBPs8EDYHnBJbN*4YLROsrTjRlwji1GDX1gV53LOtLyXfW8Vhy0trm85Lf2*LQFlV7Sw4OvT7-nik6hHtG18yGOCm32SM*LntFeNkDH3kK6a3a7B6vGE1lLC6aXzHZabuMqtJJFN1me8cldbXR8szYNt0c6Zbp7WDuSWMBntmjQETeK8tHTPoqxrrWmM6iWw1YYuDgr1VGrSzJwx57WwGbUwsLG46BvK9TW2i5ck8HRVTtTnMCPSsNmhzRshlGN084DCBdc0Bn237DjPR9aeRRJcARSXezleBMM-GIl4Fqc2DBYctf7MbPjva7viiARLQfa*LuQWMxMb998vSyA0tqv39PCOe1YD33NauR1ve1C-b69FR5jxIItNQN2eLJe1KYmCjDJBV3JnI-L1lEs9NnB9T4jafdTvhNgG6ydAxl*A*VcBoAwxxrE2*2G-S1SVSrB8TiKEDo2cTuswYmjr0K6AEiArYlWBn2tSWGtaWB3LPkMzGv-oN-LXTLJYyhpwtY2tnVuPTXGAnGViNNvRPobL23NhsItgNQtk8xQkWxtX3tHadsHu40N0wTbqr3Se6Y97y-AYLO8anjWKpFgd7YC06*Q5mFrJjq50w1RysHYMd9lJ70JZwbrR3W7jfRe21CElI6clSDw0daQxHqDKBx3CAH**HY--AirLqLjwOnKM-xJz8TlpRTvM4S*83pSnw-jREygCNB6OR9GGmCcL4NGKCVQXrB3ASU7iM0oeBVNADp1UvYkcGl972GPzwaS8vcHK1l5epBvL2rKMfytf2UKZTmn7T5x*y315nDgShcahIPToeDHqDMRn3JlSmvUgJD09jEshoSD4C3O9fZcLS7maZn4P*BfX3zn6rqOPR5Fl9ehk-oX7V0-LM289lu3hdTzaRp4sBOcTj0jzMyNuLWs2uWTpc8jzz-wW24brq",
      "method" : "GET",
      "type" : "redirect"
   }
}
dimitriBouteille commented 11 months ago

Hi @gauravharshranosys How do you fix this issue ?


Fix: Send N/A value for postalCode field as street or city.

https://github.com/Adyen/adyen-magento2/blob/765ef4bc5ddc27f30436be45320ad8fbdbe9f8bc/Helper/Requests.php#L150

Create plugin or composer patch and change this variable :

$requestDeliveryDefaults = [
    "street" => "N/A",
    "postalCode" => ''N/A",
    "city" => "N/A",
    "houseNumberOrName" => '',
    "country" => "ZZ"
];
<?php
declare(strict_types=1);

namespace Project\Adyen\Plugin\Payment\Gateway\Request;

/**
 * Class AddressDataBuilder
 *
 * @package Project\Adyen\Plugin\Payment\Gateway\Request
 */
class AddressDataBuilder
{
    /**
     * @param \Adyen\Payment\Gateway\Request\AddressDataBuilder $subject
     * @param array $request
     * @param array $buildSubject
     * @return array
     */
    public function afterBuild(
        \Adyen\Payment\Gateway\Request\AddressDataBuilder $subject,
        array $request,
        array $buildSubject
    ): array {
        $paymentDataObject = \Magento\Payment\Gateway\Helper\SubjectReader::readPayment($buildSubject);
        /** @var \Magento\Sales\Model\Order\Payment $payment */
        $payment = $paymentDataObject->getPayment();
        if ($payment->getMethod() !== \Adyen\Payment\Model\Ui\AdyenHppConfigProvider::CODE) {
            return $request;
        }

        $adyenBrand = $payment->getAdditionalInformation('brand_code');
        if ($adyenBrand !== 'alipay_hk') {
            return $request;
        }

        /**
         * @see https://github.com/Adyen/adyen-magento2/issues/1096
         */
        $request['body'] = $this->filter($request['body'] ?? []);
        return $request;
    }

    /**
     * @param array $request
     * @return array
     */
    private function filter(array $request): array
    {
        $this->filterAddress($request, 'billingAddress');
        $this->filterAddress($request, 'deliveryAddress');
        return $request;
    }

    /**
     * @param array $request
     * @param string $rootPath
     * @return void
     */
    private function filterAddress(array &$request, string $rootPath): void
    {
        $path = $rootPath . '.postalCode';
        $zipCode = \Illuminate\Support\Arr::get($request, $path);
        if ($zipCode === null || $zipCode === '') {
            \Illuminate\Support\Arr::set($request, $path, 'N/A');
        }
    }
}