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