Projet

Général

Profil

0001-paybox-handle-CANCELLED-and-DENIED-situations-47582.patch

Benjamin Dauvergne, 22 octobre 2020 13:34

Télécharger (6,71 ko)

Voir les différences:

Subject: [PATCH] paybox: handle CANCELLED and DENIED situations (#47582)

 eopayment/paybox.py | 107 +++++++++++++++++++++++++-------------------
 1 file changed, 61 insertions(+), 46 deletions(-)
eopayment/paybox.py
21 21
import logging
22 22
import hashlib
23 23
import hmac
24
import re
24 25
import requests
25 26
import uuid
26 27

  
......
36 37

  
37 38
import base64
38 39
from gettext import gettext as _
39
import string
40 40
import warnings
41 41

  
42
from .common import (PaymentCommon, PaymentResponse, FORM, PAID, ERROR, Form,
43
                     ORDERID_TRANSACTION_SEPARATOR, ResponseError, force_text,
42
from .common import (PaymentCommon, PaymentResponse, FORM, PAID, CANCELLED,
43
                     DENIED, ERROR, Form, ResponseError, force_text,
44 44
                     force_byte)
45
from . import cb
45 46

  
46 47
__all__ = ['sign', 'Payment']
47 48

  
......
67 68
}
68 69

  
69 70
PAYBOX_ERROR_CODES = {
70
    '00000': 'Opération réussie.',
71
    '00001': 'La connexion au centre d’autorisation a échoué ou une '
72
    'erreur interne est survenue. Dans ce cas, il est souhaitable de faire '
73
    'une tentative sur le site secondaire : tpeweb1.paybox.com.',
74
    '001xx': 'Paiement refusé par le centre d’autorisation [voir '
75
    '§12.112.1 Codes réponses du centre d’autorisationCodes réponses du '
76
    'centre d’autorisation]. En cas d’autorisation de la transaction par '
77
    'le centre d’autorisation de la banque ou de l’établissement financier '
78
    'privatif, le code erreur “00100” sera en fait remplacé directement '
79
    'par “00000”.',
80
    '00003': 'Erreur Paybox. Dans ce cas, il est souhaitable de faire une '
81
    'tentative sur le site secondaire FQDN tpeweb1.paybox.com.',
82
    '00004': 'Numéro de porteur ou cryptogramme visuel invalide.',
83
    '00006': 'Accès refusé ou site/rang/identifiant incorrect.',
84
    '00008': 'Date de fin de validité incorrecte.',
85
    '00009': 'Erreur de création d’un abonnement.',
86
    '00010': 'Devise inconnue.',
87
    '00011': 'Montant incorrect.',
88
    '00015': 'Paiement déjà effectué.',
89
    '00016': 'Abonné déjà existant (inscription nouvel abonné). Valeur '
90
    '‘U’ de la variable PBX_RETOUR.',
91
    '00021': 'Carte non autorisée.',
92
    '00029': 'Carte non conforme. Code erreur renvoyé lors de la '
93
    'documentation de la variable « PBX_EMPREINTE ».',
94
    '00030': 'Temps d’attente > 15 mn par l’internaute/acheteur au niveau '
95
    'de la page de paiements.',
96
    '00031': 'Réservé',
97
    '00032': 'Réservé',
98
    '00033': 'Code pays de l’adresse IP du navigateur de l’acheteur non '
99
    'autorisé.',
100
    '00040': 'Opération sans authentification 3-DSecure, bloquée par le '
101
    'filtre.',
102
    '99999': 'Opération en attente de validation par l’émetteur du moyen '
103
    'de paiement.',
71
    '00000': {'message': 'Paiement réalisé avec succés.', 'result': PAID},
72
    '00001': {
73
        'message': 'Demande annulée par l\'usager.',
74
        'result': CANCELLED,
75
    },
76
    '001xx': {
77
        'message': 'Paiement refusé par le centre d’autorisation [voir '
78
        '§12.112.1 Codes réponses du centre d’autorisationCodes réponses du '
79
        'centre d’autorisation]. En cas d’autorisation de la transaction par '
80
        'le centre d’autorisation de la banque ou de l’établissement financier '
81
        'privatif, le code erreur “00100” sera en fait remplacé directement '
82
        'par “00000”.'
83
    },
84
    '00003': {
85
        'message': 'Erreur Paybox. Dans ce cas, il est souhaitable de faire une '
86
        'tentative sur le site secondaire FQDN tpeweb1.paybox.com.'
87
    },
88
    '00004': {'message': 'Numéro de porteur ou cryptogramme visuel invalide.'},
89
    '00006': {'message': 'Accès refusé ou site/rang/identifiant incorrect.'},
90
    '00008': {'message': 'Date de fin de validité incorrecte.'},
91
    '00009': {'message': 'Erreur de création d’un abonnement.'},
92
    '00010': {'message': 'Devise inconnue.'},
93
    '00011': {'message': 'Montant incorrect.'},
94
    '00015': {'message': 'Paiement déjà effectué.'},
95
    '00016': {
96
        'message': 'Abonné déjà existant (inscription nouvel abonné). Valeur '
97
        '‘U’ de la variable PBX_RETOUR.'
98
    },
99
    '00021': {'message': 'Carte non autorisée.', 'result': DENIED},
100
    '00029': {
101
        'message': 'Carte non conforme. Code erreur renvoyé lors de la documentation de la variable « PBX_EMPREINTE ».'
102
    },
103
    '00030': {
104
        'message': 'Temps d’attente > 15 mn par l’internaute/acheteur au niveau de la page de paiements.'
105
    },
106
    '00031': {'message': 'Réservé'},
107
    '00032': {'message': 'Réservé'},
108
    '00033': {
109
        'message': 'Code pays de l’adresse IP du navigateur de l’acheteur non autorisé.',
110
        'result': DENIED,
111
    },
112
    '00040': {
113
        'message': 'Opération sans authentification 3-DSecure, bloquée par le filtre.',
114
        'result': DENIED,
115
    },
116
    '99999': {
117
        'message': 'Opération en attente de validation par l’émetteur du moyen de paiement.'
118
    },
104 119
}
105 120

  
106 121
ALGOS = {
......
375 390
                    data.append('%s=%s' % (key, urllib.quote(value)))
376 391
            data = '&'.join(data)
377 392
            signed = verify(data, sig)
378
        if d['erreur'][0] == '00000':
379
            result = PAID
393
        erreur = d['erreur'][0]
394
        if re.match(r'^001[0-9][0-9]$', erreur):
395
            cb_error_code = erreur[3:5]
396
            message, result = cb.translate_cb_error_code(cb_error_code)
397
        elif erreur in PAYBOX_ERROR_CODES:
398
            message = PAYBOX_ERROR_CODES[erreur]['message']
399
            result = PAYBOX_ERROR_CODES[erreur].get('result', ERROR)
380 400
        else:
401
            message = 'Code erreur inconnu %s' % erreur
381 402
            result = ERROR
382
        for l in (5, 3):
383
            prefix = d['erreur'][0][:l]
384
            suffix = 'x' * (5 - l)
385
            bank_status = PAYBOX_ERROR_CODES.get(prefix + suffix)
386
            if bank_status is not None:
387
                break
388 403
        pbx_cmd = d['reference'][0]
389 404
        transaction_date = None
390 405
        if 'date_transaction' in d and 'heure_transaction' in d:
......
403 418
            signed=signed,
404 419
            bank_data=d,
405 420
            result=result,
406
            bank_status=bank_status,
421
            bank_status=message,
407 422
            transaction_date=transaction_date)
408 423

  
409 424
    def perform(self, amount, bank_data, operation):
410
-