misc: add cli tool for testing

This commit is contained in:
Benjamin Dauvergne 2020-10-27 20:58:21 +01:00
parent 3256b346f2
commit 274c716eec
2 changed files with 235 additions and 0 deletions

View File

@ -69,3 +69,113 @@ You can test your PayFiP regie web-service connection with an integrated CLI uti
Options:
--help Show this message and exit.
Generic CLI Tool
================
You can put some configuration in ~/.config/eopayment.init ::
[default]
debug=yes
[systempayv2]
# same name as passed in the options argument to Payment.__init__()
vads_site_id=12345678
secret_test=xyzabcdefgh
vads_ctx_mode=TEST
$ python3 -m eopayment --option vads_site_id=56781234 request 10.0 --param transaction_id=1234 --param email=john.doe@example.com
Transaction ID: 1234
<form method="POST" action="https://paiement.systempay.fr/vads-payment/">
<input type="hidden" name="vads_cust_country" value="FR"/>
<input type="hidden" name="vads_validation_mode" value=""/>
<input type="hidden" name="vads_site_id" value="12345678"/>
<input type="hidden" name="vads_payment_config" value="SINGLE"/>
<input type="hidden" name="vads_trans_id" value="GavPXW"/>
<input type="hidden" name="vads_action_mode" value="INTERACTIVE"/>
<input type="hidden" name="vads_contrib" value="eopayment"/>
<input type="hidden" name="vads_page_action" value="PAYMENT"/>
<input type="hidden" name="vads_amount" value="1010"/>
<input type="hidden" name="signature" value="d5690d02fed621687b19c90053a77b37a1c78370"/>
<input type="hidden" name="vads_ctx_mode" value="TEST"/>
<input type="hidden" name="vads_version" value="V2"/>
<input type="hidden" name="vads_payment_cards" value=""/>
<input type="hidden" name="vads_ext_info_eopayment_trans_id" value="1234"/>
<input type="hidden" name="vads_trans_date" value="20201027211254"/>
<input type="hidden" name="vads_language" value="fr"/>
<input type="hidden" name="vads_capture_delay" value=""/>
<input type="hidden" name="vads_currency" value="978"/>
<input type="hidden" name="vads_cust_email" value="john.doe@example.com"/>
<input type="hidden" name="vads_return_mode" value="GET"/>
<input type="submit" name="Submit" value="Submit" />
</form>
[ Local browser is automatically opened with this form which is auto-submitted ]
$ python3 -m eopayment --debug response 'vads_amount=1010&vads_auth_mode=FULL&vads_auth_number=3fd070&vads_auth_result=00&vads_capture_delay=0&vads_card_brand=CB&vads_card_number=597010XXXXXX0018&vads_payment_certificate=f582e920616a33bdaa0c242ee3fc3d435d367575&vads_ctx_mode=TEST&vads_currency=978&vads_effective_amount=1010&vads_effective_currency=978&vads_site_id=12345678&vads_trans_date=20201029093825&vads_trans_id=Vlco55&vads_trans_uuid=e8defc7bd32c418c93c4b2be676d2796&vads_validation_mode=0&vads_version=V2&vads_warranty_result=&vads_payment_src=EC&vads_cust_country=FR&vads_contrib=eopayment&vads_tid=001&vads_sequence_number=1&vads_contract_used=2334410&vads_trans_status=AUTHORISED&vads_expiry_month=6&vads_expiry_year=2021&vads_bank_label=Banque+de+d%C3%A9mo+et+de+l%27innovation&vads_bank_product=MCW&vads_pays_ip=FR&vads_presentation_date=20201029093826&vads_effective_creation_date=20201029093826&vads_operation_type=DEBIT&vads_result=00&vads_extra_result=&vads_card_country=FR&vads_language=fr&vads_brand_management=%7B%22userChoice%22%3Afalse%2C%22brandList%22%3A%22CB%7CMASTERCARD%22%2C%22brand%22%3A%22CB%22%7D&vads_action_mode=INTERACTIVE&vads_payment_config=SINGLE&vads_page_action=PAYMENT&vads_threeds_enrolled=Y&vads_threeds_auth_type=CHALLENGE&vads_threeds_eci=02&vads_threeds_xid=RFBSMkdWdFE0Wk15VWw0RkJjMzU%3D&vads_threeds_cavvAlgorithm=2&vads_threeds_status=Y&vads_threeds_sign_valid=1&vads_threeds_error_code=&vads_threeds_exit_status=10&vads_threeds_cavv=jG26AYSjvclBARFYSf%2FtXRmjGXM%3D&signature=5594aa2bc35c9e45e759b08df339e5f8ecf2c410'
result : 3
signed : True
bank_data :
{'__bank_id': '3fd070',
'signature': '5594aa2bc35c9e45e759b08df339e5f8ecf2c410',
'vads_action_mode': 'INTERACTIVE',
'vads_amount': '1010',
'vads_auth_mode': 'FULL',
'vads_auth_number': '3fd070',
'vads_auth_result': '00',
'vads_auth_result_message': 'Transaction approuvée ou traitée avec succès',
'vads_bank_label': "Banque de démo et de l'innovation",
'vads_bank_product': 'MCW',
'vads_brand_management': '{"userChoice":false,"brandList":"CB|MASTERCARD","brand":"CB"}',
'vads_capture_delay': '0',
'vads_card_brand': 'CB',
'vads_card_country': 'FR',
'vads_card_number': '597010XXXXXX0018',
'vads_contract_used': '2334410',
'vads_contrib': 'eopayment',
'vads_ctx_mode': 'TEST',
'vads_currency': '978',
'vads_cust_country': 'FR',
'vads_effective_amount': '1010',
'vads_effective_creation_date': '20201029093826',
'vads_effective_currency': '978',
'vads_expiry_month': '6',
'vads_expiry_year': '2021',
'vads_extra_result': '',
'vads_extra_result_message': 'Pas de contrôle effectué.',
'vads_language': 'fr',
'vads_operation_type': 'DEBIT',
'vads_page_action': 'PAYMENT',
'vads_payment_certificate': 'f582e920616a33bdaa0c242ee3fc3d435d367575',
'vads_payment_config': 'SINGLE',
'vads_payment_src': 'EC',
'vads_pays_ip': 'FR',
'vads_presentation_date': '20201029093826',
'vads_result': '00',
'vads_result_message': 'Paiement réalisé avec succés.',
'vads_sequence_number': '1',
'vads_site_id': '12345678',
'vads_threeds_auth_type': 'CHALLENGE',
'vads_threeds_cavv': 'jG26AYSjvclBARFYSf/tXRmjGXM=',
'vads_threeds_cavvAlgorithm': '2',
'vads_threeds_eci': '02',
'vads_threeds_enrolled': 'Y',
'vads_threeds_error_code': '',
'vads_threeds_exit_status': '10',
'vads_threeds_sign_valid': '1',
'vads_threeds_status': 'Y',
'vads_threeds_xid': 'RFBSMkdWdFE0Wk15VWw0RkJjMzU=',
'vads_tid': '001',
'vads_trans_date': '20201029093825',
'vads_trans_id': 'Vlco55',
'vads_trans_status': 'AUTHORISED',
'vads_trans_uuid': 'e8defc7bd32c418c93c4b2be676d2796',
'vads_validation_mode': '0',
'vads_version': 'V2',
'vads_warranty_result': ''}
return_content : None
bank_status : Paiement réalisé avec succés.
transaction_id : 3fd070
order_id : 20201029093825_Vlco55
test : True
transaction_date : 2020-10-29 09:38:26+00:00

125
eopayment/__main__.py Normal file
View File

@ -0,0 +1,125 @@
# eopayment - online payment library
# Copyright (C) 2011-2020 Entr'ouvert
#
# This program is free software: you can redistribute it and/or modify it
# under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from __future__ import print_function
import configparser
import decimal
import logging
import os.path
import pprint
import subprocess
import tempfile
import click
from . import Payment, FORM, URL
def option(value):
try:
name, value = value.split('=', 1)
except Exception:
raise ValueError('invalid option %s' % value)
return (name, value)
@click.group()
@click.option('--option', type=option, multiple=True)
@click.option('--name', type=str, default='')
@click.option('--backend', type=str)
@click.option('--debug/--no-debug', default=None)
@click.pass_context
def main(ctx, backend, debug, option, name):
config_file = os.path.expanduser('~/.config/eopayment.ini')
option = list(option)
if os.path.exists(config_file):
parser = configparser.ConfigParser(interpolation=None)
with open(config_file) as fd:
parser.read_file(fd)
if debug is None:
debug = parser.getboolean('default', 'debug', fallback=False)
if debug is True:
logging.basicConfig(level=logging.DEBUG)
for section in parser.sections():
if section == 'default':
continue
if ':' in section:
config_backend, config_name = section.split(':', 1)
else:
config_backend, config_name = section, None
load = False
if not name and not backend:
# use first section
logging.debug('no backend and not name given using first section found')
backend = config_backend
load = True
elif name and backend:
load = (config_backend == backend and config_name == name)
elif name:
load = config_name == name
elif backend:
load = config_backend == backend
if load:
logging.debug('loading configuration "%s"', section)
backend = backend or config_backend
option.extend(parser.items(section=section))
break
else:
if not backend:
raise ValueError('no backend found')
if parser.has_section(backend):
option.extend(parser.items(section=backend))
if debug is True:
logging.basicConfig(level=logging.DEBUG)
ctx.obj = Payment(backend, dict(option))
@main.command()
@click.argument('amount', type=decimal.Decimal)
@click.option('--param', type=option, multiple=True)
@click.pass_obj
def request(backend, amount, param):
transaction_id, kind, what = backend.request(amount, **dict(param))
print('Transaction ID:', transaction_id)
if kind == FORM:
print(what)
with tempfile.NamedTemporaryFile(mode='w', delete=False) as fd:
print(what, file=fd)
print('''<script>document.getElementsByName('Submit')[0].click()</script>''', file=fd)
subprocess.call(['gnome-www-browser', fd.name])
elif kind == URL:
print('Please click on URL:', what)
subprocess.call(['gnome-www-browser', what])
@main.command()
@click.argument('query_string', type=str)
@click.option('--param', type=option, multiple=True)
@click.pass_obj
def response(backend, query_string, param):
payment_response = backend.response(query_string, **dict(param))
for key, value in payment_response.__dict__.items():
if not isinstance(value, (dict, list)):
print(' ', key, ':', value)
else:
print(' ', key, ':')
formatted_value = pprint.pformat(value)
for line in formatted_value.splitlines(False):
print(' ', line)
main()