107 lines
4.9 KiB
Python
107 lines
4.9 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
import codecs
|
|
from unittest import TestCase
|
|
from decimal import Decimal
|
|
import base64
|
|
from six.moves.urllib import parse as urllib
|
|
|
|
import eopayment.paybox as paybox
|
|
import eopayment
|
|
|
|
BACKEND_PARAMS = {
|
|
'platform': u'test',
|
|
'site': u'12345678',
|
|
'rang': u'001',
|
|
'identifiant': u'12345678',
|
|
'shared_secret': u'0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF',
|
|
'callback': u'http://example.com/callback',
|
|
}
|
|
|
|
class PayboxTests(TestCase):
|
|
def test_sign(self):
|
|
key = b'0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF'
|
|
key = codecs.decode(key, 'hex')
|
|
d = dict(paybox.sign([
|
|
['PBX_SITE', u'12345678'],
|
|
['PBX_RANG', u'32'],
|
|
['PBX_IDENTIFIANT', u'12345678'],
|
|
['PBX_TOTAL', u'999'],
|
|
['PBX_DEVISE', u'978'],
|
|
['PBX_CMD', u'appel à Paybox'],
|
|
['PBX_PORTEUR', u'test@paybox.com'],
|
|
['PBX_RETOUR', u'Mt:M;Ref:R;Auto:A;Erreur:E'],
|
|
['PBX_HASH', u'SHA512'],
|
|
['PBX_TIME', u'2015-06-08T16:21:16+02:00'],
|
|
],
|
|
key))
|
|
result = '7E74D8E9A0DBB65AAE51C5C50C2668FD98FC99AEDF18244BB1935F602B6C2E953B61FD84364F34FDB88B049901C0A07F6040AF446BBF5589113F48A733D551D4'
|
|
self.assertIn('PBX_HMAC', d)
|
|
self.assertEqual(d['PBX_HMAC'], result)
|
|
|
|
def test_request(self):
|
|
backend = eopayment.Payment('paybox', BACKEND_PARAMS)
|
|
time = '2015-07-15T18:26:32+02:00'
|
|
email = 'bdauvergne@entrouvert.com'
|
|
order_id = '20160216'
|
|
transaction = '1234'
|
|
amount = '19.99'
|
|
transaction_id, kind, what = backend.request(
|
|
Decimal(amount), email=email, orderid=order_id,
|
|
transaction_id=transaction, time=time)
|
|
self.assertEqual(kind, eopayment.FORM)
|
|
self.assertEqual(transaction_id, '1234')
|
|
from xml.etree import ElementTree as ET
|
|
root = ET.fromstring(str(what))
|
|
self.assertEqual(root.tag, 'form')
|
|
self.assertEqual(root.attrib['method'], 'POST')
|
|
self.assertEqual(root.attrib['action'], paybox.URLS['test'])
|
|
for node in root:
|
|
self.assertIn(node.attrib['type'], ('hidden', 'submit'))
|
|
if node.attrib['type'] == 'submit':
|
|
self.assertEqual(set(node.attrib.keys()), set(['type', 'value']))
|
|
if node.attrib['type'] == 'hidden':
|
|
self.assertEqual(set(node.attrib.keys()), set(['type', 'name', 'value']))
|
|
name = node.attrib['name']
|
|
reference = order_id + eopayment.common.ORDERID_TRANSACTION_SEPARATOR + transaction
|
|
values = {
|
|
'PBX_RANG': '01',
|
|
'PBX_SITE': '12345678',
|
|
'PBX_IDENTIFIANT': '12345678',
|
|
'PBX_RETOUR': 'montant:M;reference:R;code_autorisation:A;erreur:E;signature:K',
|
|
'PBX_TIME': time,
|
|
'PBX_PORTEUR': email,
|
|
'PBX_CMD': reference,
|
|
'PBX_TOTAL': amount.replace('.', ''),
|
|
'PBX_DEVISE': '978',
|
|
'PBX_HASH': 'SHA512',
|
|
'PBX_HMAC': '173483CFF84A7ECF21039F99E9A95C5FB53D98A1562184F5B2C4543E4F87BFA227CC2CA10DE989D6C8B4DC03BC2ED44B7D7BDF5B4FABA8274D5D37C2F6445F36',
|
|
'PBX_ARCHIVAGE': '1234',
|
|
'PBX_REPONDRE_A': 'http://example.com/callback',
|
|
}
|
|
self.assertIn(name, values)
|
|
self.assertEqual(node.attrib['value'], values[name])
|
|
|
|
def test_response(self):
|
|
backend = eopayment.Payment('paybox', BACKEND_PARAMS)
|
|
order_id = '20160216'
|
|
transaction = '1234'
|
|
reference = order_id + eopayment.common.ORDERID_TRANSACTION_SEPARATOR + transaction
|
|
data = {'montant': '4242', 'reference': reference,
|
|
'code_autorisation': 'A', 'erreur': '00000'}
|
|
response = backend.response(urllib.urlencode(data))
|
|
self.assertEqual(response.order_id, order_id)
|
|
|
|
def test_rsa_signature_validation(self):
|
|
pkey = '''-----BEGIN PUBLIC KEY-----
|
|
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDUgYufHuheMztK1LhQSG6xsOzb
|
|
UX4D2A/QcMvkEcRVXFx5tQqcE9/JnMqE41TF/ebn7jC/MBxxtPFkUN7+EZoeMN7x
|
|
OWzAMDm/xsCWRvvel4GGixgm3aQRUPyTrlm4Ksy32Ya0rNnEDMAvB3dxOn7cp8GR
|
|
ZdzrudBlevZXpr6iYwIDAQAB
|
|
-----END PUBLIC KEY-----'''
|
|
data = b'coin\n'
|
|
sig64 = '''VCt3sgT0ecacmDEWWNVXJ+jGmIPBMApK42tBJV0FlDjpllOGPy8MsAmLW4/QjTtx
|
|
z0Dkz0NjxvU+5WzQZh9Uuxr/egRCwV4NMRWqu0zaVVioeBvl4/5CWm4f4/1L9+0m
|
|
FBFKOZhgBJnkC+l6+XhT4aYWKaQ4ocmOMV92yjeXTE4='''
|
|
self.assertTrue(paybox.verify(data, base64.b64decode(sig64), key=pkey))
|