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 |
|
-
|