0002-paybox-add-support-for-payment-cancelling-26960.patch
eopayment/paybox.py | ||
---|---|---|
6 | 6 |
import logging |
7 | 7 |
import hashlib |
8 | 8 |
import hmac |
9 |
import requests |
|
9 | 10 |
from decimal import Decimal, ROUND_DOWN |
10 | 11 |
from Crypto.Signature import PKCS1_v1_5 |
11 | 12 |
from Crypto.PublicKey import RSA |
... | ... | |
99 | 100 |
'https://tpeweb1.paybox.com/cgi/MYchoix_pagepaiement.cgi', |
100 | 101 |
} |
101 | 102 | |
103 |
DIRECT_URLS = { |
|
104 |
'test': 'https://preprod-ppps.paybox.com/PPPS.php', |
|
105 |
'prod': 'https://ppps.paybox.com/PPPS.php', |
|
106 |
'backup': 'https://ppps1.paybox.com/PPPS.php' |
|
107 |
} |
|
108 | ||
102 | 109 | |
103 | 110 |
def sign(data, key): |
104 | 111 |
'''Take a list of tuple key, value and sign it by building a string to |
... | ... | |
174 | 181 |
'validation': lambda x: isinstance(x, basestring) and |
175 | 182 |
x.isdigit() and len(x) == 7, |
176 | 183 |
}, |
184 |
{ |
|
185 |
'name': 'cle', |
|
186 |
'caption': _('Clé du site'), |
|
187 |
'required': False, |
|
188 |
'validation': lambda x: isinstance(x, basestring), |
|
189 |
}, |
|
177 | 190 |
{ |
178 | 191 |
'name': 'rang', |
179 | 192 |
'caption': _('Numéro de rang'), |
... | ... | |
311 | 324 |
bank_data=d, |
312 | 325 |
result=result, |
313 | 326 |
bank_status=bank_status) |
327 | ||
328 |
def cancel(self, amount, bank_data, **kwargs): |
|
329 |
logger = logging.getLogger(__name__) |
|
330 |
url = DIRECT_URLS[self.platform] |
|
331 |
params = {'VERSION': '00104', # protocol version |
|
332 |
'TYPE': '00005', # cancelling operation code |
|
333 |
'SITE': force_text(self.site), |
|
334 |
'RANG': self.rang.strip(), |
|
335 |
'CLE': force_text(self.cle), |
|
336 |
'NUMQUESTION': bank_data['numero_transaction'][0].zfill(10), |
|
337 |
'MONTANT': (amount * Decimal(100)).to_integral_value(ROUND_DOWN), |
|
338 |
'DEVISE': force_text(self.devise), |
|
339 |
'NUMTRANS': bank_data['numero_transaction'][0], # paybox transaction number |
|
340 |
'NUMAPPEL': bank_data['numero_appel'][0], |
|
341 |
'REFERENCE': bank_data['reference'][0], |
|
342 |
'DATEQ': datetime.datetime.now().strftime('%d%m%Y%H%M%S'), |
|
343 |
} |
|
344 |
response = requests.post(url, params) |
|
345 |
logger.debug('received %r', response.content) |
|
346 |
return response |
tests/test_paybox.py | ||
---|---|---|
4 | 4 |
from unittest import TestCase |
5 | 5 |
from decimal import Decimal |
6 | 6 |
import base64 |
7 |
import mock |
|
7 | 8 |
from six.moves.urllib import parse as urllib |
8 | 9 |
from xml.etree import ElementTree as ET |
9 | 10 | |
... | ... | |
116 | 117 |
with self.assertRaisesRegexp(eopayment.ResponseError, 'missing erreur or reference'): |
117 | 118 |
backend.response('foo=bar') |
118 | 119 | |
120 |
def test_cancel_payment(self): |
|
121 |
params = BACKEND_PARAMS.copy() |
|
122 |
params['cle'] = 'cancelling_key' |
|
123 |
backend = eopayment.Payment('paybox', params) |
|
124 |
bank_data = {'numero_transaction': ['13957441'], |
|
125 |
'numero_appel': ['30310733'], |
|
126 |
'reference': ['830657461681'] |
|
127 |
} |
|
128 | ||
129 |
with mock.patch('eopayment.paybox.requests.post') as requests_post: |
|
130 |
backend.cancel(Decimal('10'), bank_data) |
|
131 |
assert requests_post.call_args[0][0] == 'https://preprod-ppps.paybox.com/PPPS.php' |
|
132 |
params_sent = requests_post.call_args[0][1] |
|
133 |
# make sure the date parameter is present |
|
134 |
assert 'DATEQ' in params_sent |
|
135 |
# don't care about its value |
|
136 |
params_sent.pop('DATEQ') |
|
137 |
expected_params = {'CLE': 'cancelling_key', |
|
138 |
'VERSION': '00104', |
|
139 |
'TYPE': '00005', |
|
140 |
'MONTANT': Decimal('1000'), |
|
141 |
'NUMAPPEL': '30310733', |
|
142 |
'NUMTRANS': '13957441', |
|
143 |
'NUMQUESTION': '0013957441', |
|
144 |
'REFERENCE': '830657461681', |
|
145 |
'RANG': backend.backend.rang, |
|
146 |
'SITE': backend.backend.site, |
|
147 |
'DEVISE': backend.backend.devise |
|
148 |
} |
|
149 |
assert params_sent == expected_params |
|
150 |
params['platform'] = 'prod' |
|
151 |
backend = eopayment.Payment('paybox', params) |
|
152 |
with mock.patch('eopayment.paybox.requests.post') as requests_post: |
|
153 |
backend.cancel(Decimal('10'), bank_data) |
|
154 |
assert requests_post.call_args[0][0] == 'https://ppps.paybox.com/PPPS.php' |
|
155 | ||
156 | ||
119 | 157 |
def test_rsa_signature_validation(self): |
120 | 158 |
pkey = '''-----BEGIN PUBLIC KEY----- |
121 | 159 |
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDUgYufHuheMztK1LhQSG6xsOzb |
tox.ini | ||
---|---|---|
15 | 15 |
deps = coverage |
16 | 16 |
pytest |
17 | 17 |
pytest-cov |
18 |
mock |
|
18 |
- |