From 3ecce46175bc5c9e7181550006d7e6a0e97da9ab Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Sun, 11 Oct 2020 15:25:51 +0200 Subject: [PATCH] paybox: handle CANCELLED and DENIED situations (#47582) --- eopayment/paybox.py | 107 +++++++++++++++++++++++++------------------- 1 file changed, 61 insertions(+), 46 deletions(-) diff --git a/eopayment/paybox.py b/eopayment/paybox.py index 08d506b..fdb7322 100644 --- a/eopayment/paybox.py +++ b/eopayment/paybox.py @@ -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 d’autorisation 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 d’autorisation [voir ' - '§12.112.1 Codes réponses du centre d’autorisationCodes réponses du ' - 'centre d’autorisation]. En cas d’autorisation de la transaction par ' - 'le centre d’autorisation 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 d’un 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 d’attente > 15 mn par l’internaute/acheteur au niveau ' - 'de la page de paiements.', - '00031': 'Réservé', - '00032': 'Réservé', - '00033': 'Code pays de l’adresse IP du navigateur de l’acheteur 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 d’autorisation [voir ' + '§12.112.1 Codes réponses du centre d’autorisationCodes réponses du ' + 'centre d’autorisation]. En cas d’autorisation de la transaction par ' + 'le centre d’autorisation 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 d’un 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 d’attente > 15 mn par l’internaute/acheteur au niveau de la page de paiements.' + }, + '00031': {'message': 'Réservé'}, + '00032': {'message': 'Réservé'}, + '00033': { + 'message': 'Code pays de l’adresse IP du navigateur de l’acheteur 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):