Projet

Général

Profil

0002-paybox-add-support-for-payment-cancelling-26960.patch

Serghei Mihai (congés, retour 15/05), 09 octobre 2018 17:49

Télécharger (5,28 ko)

Voir les différences:

Subject: [PATCH 2/3] paybox: add support for payment cancelling (#26960)

 eopayment/paybox.py  | 33 +++++++++++++++++++++++++++++++++
 tests/test_paybox.py | 38 ++++++++++++++++++++++++++++++++++++++
 tox.ini              |  1 +
 3 files changed, 72 insertions(+)
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
-