hipay / hipay-fullservice-sdk-magento2

Official repository of the HiPay Fullservice extension for Magento v2.
https://developer.hipay.com/doc/hipay-fullservice-sdk-magento2/
Apache License 2.0
10 stars 16 forks source link

Partial capture from Magento #154

Closed Axel29 closed 1 year ago

Axel29 commented 1 year ago

Pré-conditions

  1. Magento 2.3.5 ou 2.4.3-p3 (pas testé sous d'autres versions)
  2. PHP 7.2 pour Magento 2.3.5 ou 7.4 pour Magento 2.4.3-p3
  3. Module HiPay installé (hipay/hipay-fullservice-sdk-magento2) dans sa dernière version (1.16.0 à date)
  4. [CRUCIAL] URL du site web accessible par HiPay pour retours (116, 117, 118)

Étapes pour reproduire

  1. Activer le mode de paiement HiPay Enterprise Hosted Page (Stores > Configuration > Sales > Order > Payment methods > HiPay Enterprise Hosted Page)
  2. Configurer HiPay Enterprise Hosted Page pour passer en capture manuelle (Stores > Configuration > Sales > Order > Payment methods > HiPay Enterprise Hosted Page > Capture)
  3. Configurer HiPay Enterprise Hosted Page pour utiliser le statut "Capture Requested" (code 117) pour valider la commande (Stores > Configuration > Sales > Payment method > HiPay Enterprise Hosted Page > Hipay status to validate order)
  4. Ajouter deux produits panier
  5. Accéder au checkout
  6. Valider la commande
  7. Attendre que le retour 116 (Authorized) se fasse
  8. Créer une facture en ne facturant qu'un seul des deux produits

Résultat attendu

  1. Une seule facture est créée avec le produit facturé manuellement
  2. La facture en question est en statut "Payée"
  3. La commande a bien le "total due" et le "total paid" actualisés

Résultat actuel

  1. Deux factures sont créées : une manuelle et une générée par HiPay lors du retour 117 (car configuration mise pour valider la commande sur le statut 117, cf étape n°3 pour reproduire).
  2. Le statut des factures ne correspond pas toujours aux items désirés (la facture créée par HiPay est en statut "Payée" mais celle crée par Magento est en statut "En attente").
  3. Les montants "total due" / "total paid" sont complètement erronés

Informations complémentaires

Le soucis vient du fait que lorsque la facture est créée, la capture se fait immédiatement par HiPay, sans le moindre délai, mais la facture n'est pas encore totalement validée / créée côté Magento.

De ce fait, lorsque la méthode \HiPay\FullserviceMagento\Model\Notify::_doTransactionCapture est appelée (via le retour HiPay 117), la ligne $invoiceFromDB = $this->getInvoiceForTransactionId($this->_order, $payment->getTransactionId()); (ligne 1030 sur version 1.16.0) ne trouve pas la facture et en crée donc une nouvelle.

Suite à un test assez basique en ayant mit un sleep(5); au début de la méthode \HiPay\FullserviceMagento\Controller\Notify\Index::execute, le processus revient à la normale, ce qui montre bien que le retour HiPay "trop rapide" est la cause de ce bug.

Le problème n'est pas reproduisible à 100% des tests puisqu'il faut vraiment que le retour HiPay se fasse extrêmement rapidement, avant même que Magento n'ait finalisé la sauvegarde de la facture.

legithubdeaymeric commented 1 year ago

Merci Axel pour votre retour détaillé. Je pense que l'on va essayer de faire un qwick fix sur ce point en réalisant un retry mais ça ne sera pas magique.

La capture peut venir d'Hipay sans que la facture n'ait été initiée depuis Magento et c'est pour ça qu'il y a ce système de création auto.

Nous allons bientôt intégrer la gestion des notifications Hipay par le biais d'une CRON qui permettra de résoudre ce genre de problème de couplage temporel.

Axel29 commented 1 year ago

Merci pour votre retour. Pourriez-vous m'en faire un une fois le quick fix prêt svp pour que je puisse l'appliquer à mon projet ?

Merci d'avance.

legithubdeaymeric commented 1 year ago

Re @Axel29 !

Si jamais vous voulez tester/intégrer rapidement un fix voici le patch: https://github.com/hipay/hipay-fullservice-sdk-magento2/commit/6d2b26157b7efc88e24be01471638d35923f3263

Un check a été ajouté pour vérifier si la demande de capture a été initiée depuis Magento ou depuis la console HiPay. Si la demande est issu de Magento ( via la création d'invoice ), la notification est rejetée tant que l'invoice n'est pas reellement trouvé en DB. Hipay effectue des retry de notifications par la suite. Si la demande est issu d'Hipay, un invoice est créé.

Nous intégrons d'autres fix et évolutions, nous aurons une release la semaine prochaine.

legithubdeaymeric commented 1 year ago

https://github.com/hipay/hipay-fullservice-sdk-magento2/releases/tag/1.17.0