paybox: handle CANCELLED and DENIED situations (#47582)
This commit is contained in:
parent
274c716eec
commit
3ecce46175
|
@ -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 d’autorisation 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 d’autorisation [voir '
|
},
|
||||||
'§12.112.1 Codes réponses du centre d’autorisationCodes réponses du '
|
'001xx': {
|
||||||
'centre d’autorisation]. En cas d’autorisation de la transaction par '
|
'message': 'Paiement refusé par le centre d’autorisation [voir '
|
||||||
'le centre d’autorisation de la banque ou de l’établissement financier '
|
'§12.112.1 Codes réponses du centre d’autorisationCodes réponses du '
|
||||||
'privatif, le code erreur “00100” sera en fait remplacé directement '
|
'centre d’autorisation]. En cas d’autorisation de la transaction par '
|
||||||
'par “00000”.',
|
'le centre d’autorisation 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 d’un 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 d’un 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 d’attente > 15 mn par l’internaute/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 l’adresse IP du navigateur de l’acheteur 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 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 = {
|
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):
|
||||||
|
|
Loading…
Reference in New Issue