paybox: handle CANCELLED and DENIED situations (#47582)

This commit is contained in:
Benjamin Dauvergne 2020-10-11 15:25:51 +02:00
parent 274c716eec
commit 3ecce46175
1 changed files with 61 additions and 46 deletions

View File

@ -21,6 +21,7 @@ import datetime
import logging
import hashlib
import hmac
import re
import requests
import uuid
@ -36,12 +37,12 @@ from six.moves.urllib import parse as urllib
import base64
from gettext import gettext as _
import string
import warnings
from .common import (PaymentCommon, PaymentResponse, FORM, PAID, ERROR, Form,
ORDERID_TRANSACTION_SEPARATOR, ResponseError, force_text,
from .common import (PaymentCommon, PaymentResponse, FORM, PAID, CANCELLED,
DENIED, ERROR, Form, ResponseError, force_text,
force_byte)
from . import cb
__all__ = ['sign', 'Payment']
@ -67,40 +68,54 @@ VARS = {
}
PAYBOX_ERROR_CODES = {
'00000': 'Opération réussie.',
'00001': 'La connexion au centre dautorisation a échoué ou une '
'erreur interne est survenue. Dans ce cas, il est souhaitable de faire '
'une tentative sur le site secondaire : tpeweb1.paybox.com.',
'001xx': 'Paiement refusé par le centre dautorisation [voir '
'§12.112.1 Codes réponses du centre dautorisationCodes réponses du '
'centre dautorisation]. En cas dautorisation de la transaction par '
'le centre dautorisation de la banque ou de létablissement financier '
'privatif, le code erreur “00100” sera en fait remplacé directement '
'par “00000”.',
'00003': 'Erreur Paybox. Dans ce cas, il est souhaitable de faire une '
'tentative sur le site secondaire FQDN tpeweb1.paybox.com.',
'00004': 'Numéro de porteur ou cryptogramme visuel invalide.',
'00006': 'Accès refusé ou site/rang/identifiant incorrect.',
'00008': 'Date de fin de validité incorrecte.',
'00009': 'Erreur de création dun abonnement.',
'00010': 'Devise inconnue.',
'00011': 'Montant incorrect.',
'00015': 'Paiement déjà effectué.',
'00016': 'Abonné déjà existant (inscription nouvel abonné). Valeur '
'U de la variable PBX_RETOUR.',
'00021': 'Carte non autorisée.',
'00029': 'Carte non conforme. Code erreur renvoyé lors de la '
'documentation de la variable « PBX_EMPREINTE ».',
'00030': 'Temps dattente > 15 mn par linternaute/acheteur au niveau '
'de la page de paiements.',
'00031': 'Réservé',
'00032': 'Réservé',
'00033': 'Code pays de ladresse IP du navigateur de lacheteur non '
'autorisé.',
'00040': 'Opération sans authentification 3-DSecure, bloquée par le '
'filtre.',
'99999': 'Opération en attente de validation par lémetteur du moyen '
'de paiement.',
'00000': {'message': 'Paiement réalisé avec succés.', 'result': PAID},
'00001': {
'message': 'Demande annulée par l\'usager.',
'result': CANCELLED,
},
'001xx': {
'message': 'Paiement refusé par le centre dautorisation [voir '
'§12.112.1 Codes réponses du centre dautorisationCodes réponses du '
'centre dautorisation]. En cas dautorisation de la transaction par '
'le centre dautorisation de la banque ou de létablissement financier '
'privatif, le code erreur “00100” sera en fait remplacé directement '
'par “00000”.'
},
'00003': {
'message': 'Erreur Paybox. Dans ce cas, il est souhaitable de faire une '
'tentative sur le site secondaire FQDN tpeweb1.paybox.com.'
},
'00004': {'message': 'Numéro de porteur ou cryptogramme visuel invalide.'},
'00006': {'message': 'Accès refusé ou site/rang/identifiant incorrect.'},
'00008': {'message': 'Date de fin de validité incorrecte.'},
'00009': {'message': 'Erreur de création dun abonnement.'},
'00010': {'message': 'Devise inconnue.'},
'00011': {'message': 'Montant incorrect.'},
'00015': {'message': 'Paiement déjà effectué.'},
'00016': {
'message': 'Abonné déjà existant (inscription nouvel abonné). Valeur '
'U de la variable PBX_RETOUR.'
},
'00021': {'message': 'Carte non autorisée.', 'result': DENIED},
'00029': {
'message': 'Carte non conforme. Code erreur renvoyé lors de la documentation de la variable « PBX_EMPREINTE ».'
},
'00030': {
'message': 'Temps dattente > 15 mn par linternaute/acheteur au niveau de la page de paiements.'
},
'00031': {'message': 'Réservé'},
'00032': {'message': 'Réservé'},
'00033': {
'message': 'Code pays de ladresse IP du navigateur de lacheteur non autorisé.',
'result': DENIED,
},
'00040': {
'message': 'Opération sans authentification 3-DSecure, bloquée par le filtre.',
'result': DENIED,
},
'99999': {
'message': 'Opération en attente de validation par lémetteur du moyen de paiement.'
},
}
ALGOS = {
@ -375,16 +390,16 @@ class Payment(PaymentCommon):
data.append('%s=%s' % (key, urllib.quote(value)))
data = '&'.join(data)
signed = verify(data, sig)
if d['erreur'][0] == '00000':
result = PAID
erreur = d['erreur'][0]
if re.match(r'^001[0-9][0-9]$', erreur):
cb_error_code = erreur[3:5]
message, result = cb.translate_cb_error_code(cb_error_code)
elif erreur in PAYBOX_ERROR_CODES:
message = PAYBOX_ERROR_CODES[erreur]['message']
result = PAYBOX_ERROR_CODES[erreur].get('result', ERROR)
else:
message = 'Code erreur inconnu %s' % erreur
result = ERROR
for l in (5, 3):
prefix = d['erreur'][0][:l]
suffix = 'x' * (5 - l)
bank_status = PAYBOX_ERROR_CODES.get(prefix + suffix)
if bank_status is not None:
break
pbx_cmd = d['reference'][0]
transaction_date = None
if 'date_transaction' in d and 'heure_transaction' in d:
@ -403,7 +418,7 @@ class Payment(PaymentCommon):
signed=signed,
bank_data=d,
result=result,
bank_status=bank_status,
bank_status=message,
transaction_date=transaction_date)
def perform(self, amount, bank_data, operation):