Projet

Général

Profil

Development #38405

Support PayFiP web-service

Ajouté par Benjamin Dauvergne il y a plus de 4 ans. Mis à jour il y a plus de 4 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Version cible:
-
Début:
11 décembre 2019
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

Description

Voir la doc en ligne sur le wiki pour la documentation.

Ça change pas mal de chose par rapport aux backend actuels :
  • une fois les données de la transaction obtenu: reference de la dette, objet (optionnel) , montant et email il faut appeler un web-service SOAP qui renvoie un UUID appelé idOp, cet UUID est le jeton qui permettra de rediriger l'utilisateur sur PayFiP
  • construire une URL vers PayFiP avec comme paramètre ?idOp=<xxx>
  • attendre le retour synchrone sur URLREDIRECT ou asynchrone sur URLNOTIF
  • sur retour faire un appel au web-service SOAP de contrôle de l'état de l'idOp

Il y a un appel SOAP de contrôle de l'état d'un idOp, on ne doit pas faire d'appels en séquence, uniquement ponctuellement.

Si on ne reçoit par de retour on doit au bout d'1h faire un appel de contrôle, puis toutes les heures.

Un idOp peut-être dans 4 états :
  • inconnu de payfip, cas P1 (inconnu car par encore envoyé et/ou car nettoyé par le batch de nettoyage nocturne coté PayFiP), un appel à recupererDetailPaiementSecurise retournera une erreur "idOp incorrect"
  • connu de payfip mais sans transaction ouverte avec un prestataire de paiement, cas P5 , un appel à recupererDetailPaiementSecurise retournera une erreur "Résultat de la transaction non connu."
  • connu de payfip avec une transaction ouverte avec un prestataire de paiement :
    • première 10 minutes, cas P5, voir plus haut,
    • ensuite, transaction abandonnée ou réussie ou refusée

Un idOp ne peut être utilisé que dans les 15 minutes suivant sa génération.

Question: peut-on réutiliser un idOp non encore envoyé à un prestataire de paiement durant ces 15 minutes ?
Réponse: non on ne peut pas, dès réception par PayFiP un idOp devient invalide, levant une erreur P3 « Votre transaction n’a pu aboutir, veuillez effectuer une nouvelle tentative. ».

A minima : il faut bloquer un paiement pour un refdet donné durant les 15 minutes suivant la génération de l'idOp, pendant ces 15 minutes on peut peut-être réutiliser le même idOp après avoir validé que que la transaction n'est pas dans un état abandonné ou refusé. La plate-forme de paiement ayant 10 minutes pour valider la transaction on peut considérer un temps d'attente de 30 minutes entre deux générations d'idOp pour chaque REFDET.


Fichiers

0001-start-support-for-PayFiP-Regie-web-service-38405.patch (41,8 ko) 0001-start-support-for-PayFiP-Regie-web-service-38405.patch Benjamin Dauvergne, 12 décembre 2019 15:18
0002-update-gitignore.patch (482 octets) 0002-update-gitignore.patch Benjamin Dauvergne, 26 décembre 2019 16:52
0001-start-support-for-PayFiP-Regie-web-service-38405.patch (43,4 ko) 0001-start-support-for-PayFiP-Regie-web-service-38405.patch Benjamin Dauvergne, 26 décembre 2019 16:52
0002-update-gitignore.patch (482 octets) 0002-update-gitignore.patch Benjamin Dauvergne, 26 décembre 2019 19:17
0001-start-support-for-PayFiP-Regie-web-service-38405.patch (60,7 ko) 0001-start-support-for-PayFiP-Regie-web-service-38405.patch Benjamin Dauvergne, 26 décembre 2019 19:17
0002-update-gitignore.patch (482 octets) 0002-update-gitignore.patch Benjamin Dauvergne, 02 janvier 2020 12:25
0003-debian-add-python-dependencies-to-debian-control-384.patch (1,27 ko) 0003-debian-add-python-dependencies-to-debian-control-384.patch Benjamin Dauvergne, 02 janvier 2020 12:25
0001-start-support-for-PayFiP-Regie-web-service-38405.patch (60,7 ko) 0001-start-support-for-PayFiP-Regie-web-service-38405.patch Benjamin Dauvergne, 02 janvier 2020 12:25
0002-update-gitignore.patch (482 octets) 0002-update-gitignore.patch Benjamin Dauvergne, 03 janvier 2020 15:00
0003-debian-add-python-dependencies-to-debian-control-384.patch (1,27 ko) 0003-debian-add-python-dependencies-to-debian-control-384.patch Benjamin Dauvergne, 03 janvier 2020 15:00
0001-start-support-for-PayFiP-Regie-web-service-38405.patch (60,8 ko) 0001-start-support-for-PayFiP-Regie-web-service-38405.patch Benjamin Dauvergne, 03 janvier 2020 15:00
0002-start-support-for-PayFiP-Regie-web-service-38405.patch (60,9 ko) 0002-start-support-for-PayFiP-Regie-web-service-38405.patch Benjamin Dauvergne, 03 janvier 2020 18:16
0001-common-add-a-base-exception-class-38405.patch (685 octets) 0001-common-add-a-base-exception-class-38405.patch Benjamin Dauvergne, 03 janvier 2020 18:16
0004-debian-add-python-dependencies-to-debian-control-384.patch (1,27 ko) 0004-debian-add-python-dependencies-to-debian-control-384.patch Benjamin Dauvergne, 03 janvier 2020 18:16
0003-update-gitignore.patch (482 octets) 0003-update-gitignore.patch Benjamin Dauvergne, 03 janvier 2020 18:16
0002-start-support-for-PayFiP-Regie-web-service-38405.patch (60,9 ko) 0002-start-support-for-PayFiP-Regie-web-service-38405.patch Benjamin Dauvergne, 07 janvier 2020 10:52
0001-common-add-a-base-exception-class-38405.patch (685 octets) 0001-common-add-a-base-exception-class-38405.patch Benjamin Dauvergne, 07 janvier 2020 10:52
0004-debian-add-python-dependencies-to-debian-control-384.patch (1,27 ko) 0004-debian-add-python-dependencies-to-debian-control-384.patch Benjamin Dauvergne, 07 janvier 2020 10:52
0003-update-gitignore.patch (482 octets) 0003-update-gitignore.patch Benjamin Dauvergne, 07 janvier 2020 10:52

Révisions associées

Révision 8ae9b712 (diff)
Ajouté par Benjamin Dauvergne il y a plus de 4 ans

common: add a base exception class (#38405)

Révision edb97113 (diff)
Ajouté par Benjamin Dauvergne il y a plus de 4 ans

start support for PayFiP Regie web-service (#38405)

Révision e21ea1f6 (diff)
Ajouté par Benjamin Dauvergne il y a plus de 4 ans

update gitignore (#38405)

Révision a95c6667 (diff)
Ajouté par Benjamin Dauvergne il y a plus de 4 ans

debian: add python dependencies to debian/control (#38405)

Historique

#1

Mis à jour par Benjamin Dauvergne il y a plus de 4 ans

  • Fichier PayFiP.wsdl supprimé
#5

Mis à jour par Benjamin Dauvergne il y a plus de 4 ans

  • Description mis à jour (diff)
#6

Mis à jour par Benjamin Dauvergne il y a plus de 4 ans

Travail en cours...

#7

Mis à jour par Benjamin Dauvergne il y a plus de 4 ans

  • Assigné à mis à Benjamin Dauvergne
#8

Mis à jour par Benjamin Dauvergne il y a plus de 4 ans

#9

Mis à jour par Benjamin Dauvergne il y a plus de 4 ans

  • Statut changé de Solution proposée à En cours
#11

Mis à jour par Emmanuel Cazenave il y a plus de 4 ans

Faire du script un entry point ?
zeep et click sont absents du debian/control.

#12

Mis à jour par Benjamin Dauvergne il y a plus de 4 ans

Emmanuel Cazenave a écrit :

Faire du script un entry point ?

On peut juste faire python -m eopayment.payfip_ws ; comme c'est plus un truc de test qu'un outil pour tous les jours je ne sais pas trop.

zeep et click sont absents du debian/control.

Fait.

#14

Mis à jour par Benjamin Dauvergne il y a plus de 4 ans

J'ai fixé la date dans les tests pour que ce soit déterministe.

commit 5561404fad758866251655adadbbec9de11665a9 (HEAD -> wip/38405-Support-PayFiP-web-service)
Author: Benjamin Dauvergne <bdauvergne@entrouvert.com>
Date:   Fri Jan 3 14:59:42 2020 +0100

    tomerge

diff --git tests/test_payfip_ws.py tests/test_payfip_ws.py
index 619c578..0076bc6 100644
--- tests/test_payfip_ws.py
+++ tests/test_payfip_ws.py
@@ -38,6 +38,12 @@ def xmlindent(content):
 NUMCLI = '090909'

+# freeze time to fix EXER field to 2019
+@pytest.fixture(autouse=True)
+def freezer(freezer):
+    freezer.move_to('2019-12-12')
+
+
 class PayFiPHTTMock(object):
     def __init__(self, request):
         history_path = 'tests/data/payfip-%s.json' % request.function.__name__
#15

Mis à jour par Emmanuel Cazenave il y a plus de 4 ans

Payment.request va lancer des PayFiPError si on arrive pas à obtenir d'IdOP auprès de Payfip. De son coté lingo n'attrape aucune exception à ce moment là, mais je me dis que ça évoluera forcément et que c'est peut-être l'occasion de commencer à uniformiser les exceptions lancées par eopayment dans cette situation, genre une RequestError ? (il y a déjà une ResponseError).

#16

Mis à jour par Benjamin Dauvergne il y a plus de 4 ans

Emmanuel Cazenave a écrit :

Payment.request va lancer des PayFiPError si on arrive pas à obtenir d'IdOP auprès de Payfip. De son coté lingo n'attrape aucune exception à ce moment là, mais je me dis que ça évoluera forcément et que c'est peut-être l'occasion de commencer à uniformiser les exceptions lancées par eopayment dans cette situation, genre une RequestError ? (il y a déjà une ResponseError).

Yep, c'est vrai que jusqu'à présent l'API suppose qu'aucune erreur n'est possible dans .request().

#17

Mis à jour par Benjamin Dauvergne il y a plus de 4 ans

Voilà.

commit b361311cfee7cb9f058ba6b10693be0647ea8baa
Author: Benjamin Dauvergne <bdauvergne@entrouvert.com>
Date:   Fri Jan 3 18:16:05 2020 +0100

    make PayFiPError inherit from PaymentException

diff --git eopayment/payfip_ws.py eopayment/payfip_ws.py
index a0a9799..817fb4a 100644
--- eopayment/payfip_ws.py
+++ eopayment/payfip_ws.py
@@ -34,7 +34,7 @@ import zeep.exceptions

 from .systempayv2 import isonow
 from .common import (PaymentCommon, PaymentResponse, URL, PAID, DENIED,
-                     CANCELLED, ERROR, ResponseError)
+                     CANCELLED, ERROR, ResponseError, PaymentException)

 WSDL_URL = 'https://www.tipi.budget.gouv.fr/tpa/services/mas_securite/contrat_paiement_securise/PaiementSecuriseService?wsdl'  # noqa: E501

@@ -55,7 +55,7 @@ def clear_namespace(element):
     return element

-class PayFiPError(Exception):
+class PayFiPError(PaymentException):
     def __init__(self, code, message, origin=None):
         self.code = code
         self.message = message

commit 4ddfe1fe5025b8b70d9cab6f72404f9bd0e59a7d
Author: Benjamin Dauvergne <bdauvergne@entrouvert.com>
Date:   Fri Jan 3 18:14:55 2020 +0100

    common: add a base exception class (#38405)

diff --git eopayment/common.py eopayment/common.py
index 258f856..37a00f6 100644
--- eopayment/common.py
+++ eopayment/common.py
@@ -63,7 +63,11 @@ def force_byte(s, encoding='utf-8'):
         return s.encode()

-class ResponseError(Exception):
+class PaymentException(Exception):
+    pass
+
+
+class ResponseError(PaymentException):
     pass

#18

Mis à jour par Benjamin Dauvergne il y a plus de 4 ans

Corrige la validation du montant jusqu'à 100 000 euros.

diff --git eopayment/payfip_ws.py eopayment/payfip_ws.py
index 817fb4a..eaeaeb3 100644
--- eopayment/payfip_ws.py
+++ eopayment/payfip_ws.py
@@ -196,8 +196,8 @@ class Payment(PaymentCommon):
             # MONTANT must be sent as centimes
             montant = montant * Decimal('100')
             montant = montant.to_integral_value(ROUND_DOWN)
-            if Decimal('0') > montant > Decimal('999999'):
-                raise ValueError('MONTANT > 9999.99 euros')
+            if not (Decimal('0') < montant <= Decimal('10000000')):
+                raise ValueError('MONTANT > 100000 euros or < 0')
             montant = str(montant)
         except ValueError:
             raise ValueError(
#19

Mis à jour par Emmanuel Cazenave il y a plus de 4 ans

  • Statut changé de Solution proposée à Solution validée
#20

Mis à jour par Benjamin Dauvergne il y a plus de 4 ans

  • Statut changé de Solution validée à Résolu (à déployer)
commit a95c666712f15123a033bfc55b153ffb7007ac59
Author: Benjamin Dauvergne <bdauvergne@entrouvert.com>
Date:   Thu Jan 2 12:24:01 2020 +0100

    debian: add python dependencies to debian/control (#38405)

commit e21ea1f64bc09f7e13bf05cb7508ce42657fa040
Author: Benjamin Dauvergne <bdauvergne@entrouvert.com>
Date:   Thu Dec 26 13:41:55 2019 +0100

    update gitignore (#38405)

commit edb97113d58ece215c3711369cfd52ecda1a26b1
Author: Benjamin Dauvergne <bdauvergne@entrouvert.com>
Date:   Thu Dec 12 10:50:38 2019 +0100

    start support for PayFiP Regie web-service (#38405)

commit 8ae9b712c4cf84b0d416069bf1c8b28c8bbb8220
Author: Benjamin Dauvergne <bdauvergne@entrouvert.com>
Date:   Fri Jan 3 18:14:55 2020 +0100

    common: add a base exception class (#38405)
#21

Mis à jour par Frédéric Péters il y a plus de 4 ans

  • Statut changé de Résolu (à déployer) à Solution déployée

Formats disponibles : Atom PDF