remove sips backend (#43030)
This commit is contained in:
parent
e71b798493
commit
bc7bdd1208
|
@ -1,200 +0,0 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# 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 six.moves.urllib import parse as urlparse
|
||||
import string
|
||||
import subprocess
|
||||
import logging
|
||||
import os
|
||||
import os.path
|
||||
import uuid
|
||||
import warnings
|
||||
|
||||
from .common import PaymentCommon, HTML, PaymentResponse, ResponseError
|
||||
from .cb import CB_RESPONSE_CODES
|
||||
|
||||
'''
|
||||
Payment backend module for the ATOS/SIPS system used by many Frenck banks.
|
||||
|
||||
It use the middleware given by the bank.
|
||||
|
||||
The necessary options are:
|
||||
|
||||
- pathfile, to indicate the absolute path of the pathfile file given by the
|
||||
bank,
|
||||
- binpath, the path of the directory containing the request and response
|
||||
executables,
|
||||
|
||||
All the other needed parameters SHOULD already be set in the parmcom files
|
||||
contained in the middleware distribution file.
|
||||
|
||||
'''
|
||||
|
||||
__all__ = ['Payment']
|
||||
|
||||
BINPATH = 'binpath'
|
||||
PATHFILE = 'pathfile'
|
||||
AUTHORISATION_ID = 'authorisation_id'
|
||||
REQUEST_VALID_PARAMS = [
|
||||
'merchant_id', 'merchant_country', 'amount', 'currency_code', 'pathfile',
|
||||
'normal_return_url', 'cancel_return_url', 'automatic_response_url',
|
||||
'language', 'payment_means', 'header_flag', 'capture_day', 'capture_mode',
|
||||
'bgcolor', 'block_align', 'block_order', 'textcolor', 'receipt_complement',
|
||||
'caddie', 'customer_id', 'customer_email', 'customer_ip_address', 'data',
|
||||
'return_context', 'target', 'order_id',
|
||||
]
|
||||
|
||||
RESPONSE_PARAMS = [
|
||||
'code', 'error', 'merchant_id', 'merchant_country', 'amount',
|
||||
'transaction_id', 'payment_means', 'transmission_date', 'payment_time',
|
||||
'payment_date', 'response_code', 'payment_certificate', AUTHORISATION_ID,
|
||||
'currency_code', 'card_number', 'cvv_flag', 'cvv_response_code',
|
||||
'bank_response_code', 'complementary_code', 'complementary_info',
|
||||
'return_context', 'caddie', 'receipt_complement', 'merchant_language',
|
||||
'language', 'customer_id', 'order_id', 'customer_email',
|
||||
'customer_ip_address', 'capture_day', 'capture_mode', 'data',
|
||||
]
|
||||
|
||||
DATA = 'DATA'
|
||||
PARAMS = 'params'
|
||||
|
||||
TRANSACTION_ID = 'transaction_id'
|
||||
ORDER_ID = 'order_id'
|
||||
MERCHANT_ID = 'merchant_id'
|
||||
RESPONSE_CODE = 'response_code'
|
||||
|
||||
DEFAULT_PARAMS = {'merchant_id': '014213245611111',
|
||||
'merchant_country': 'fr',
|
||||
'currency_code': '978'}
|
||||
|
||||
LOGGER = logging.getLogger(__name__)
|
||||
|
||||
CB_BANK_RESPONSE_CODES = CB_RESPONSE_CODES
|
||||
|
||||
AMEX_BANK_RESPONSE_CODE = {
|
||||
'00': 'Transaction approuvée ou traitée avec succès',
|
||||
'02': 'Dépassement de plafond',
|
||||
'04': 'Conserver la carte',
|
||||
'05': 'Ne pas honorer',
|
||||
'97': 'Échéance de la temporisation de surveillance globale',
|
||||
}
|
||||
|
||||
FINAREF_BANK_RESPONSE_CODE = {
|
||||
'00': 'Transaction approuvée',
|
||||
'03': 'Commerçant inconnu - Identifiant de commerçant incorrect',
|
||||
'05': 'Compte / Porteur avec statut bloqué ou invalide',
|
||||
'11': 'Compte / porteur inconnu',
|
||||
'16': 'Provision insuffisante',
|
||||
'20': (
|
||||
'Commerçant invalide - Code monnaie incorrect - '
|
||||
'Opération commerciale inconnue - Opération commerciale invalide'
|
||||
),
|
||||
'80': 'Transaction approuvée avec dépassement',
|
||||
'81': 'Transaction approuvée avec augmentation capital',
|
||||
'82': 'Transaction approuvée NPAI',
|
||||
'83': 'Compte / porteur invalide',
|
||||
}
|
||||
|
||||
|
||||
class Payment(PaymentCommon):
|
||||
description = {
|
||||
'caption': 'SIPS',
|
||||
'parameters': [
|
||||
{'name': 'merchand_id'},
|
||||
{'name': 'merchant_country', },
|
||||
{'name': 'currency_code', }
|
||||
],
|
||||
}
|
||||
|
||||
def __init__(self, options, logger=None):
|
||||
super(Payment, self).__init__(options, logger=logger)
|
||||
self.options = options
|
||||
self.binpath = self.options.pop(BINPATH)
|
||||
self.logger.debug('initializing sips payment class with %s' % options)
|
||||
|
||||
def execute(self, executable, params):
|
||||
if PATHFILE in self.options:
|
||||
params[PATHFILE] = self.options[PATHFILE]
|
||||
executable = os.path.join(self.binpath, executable)
|
||||
args = [executable] + ["%s=%s" % p for p in params.items()]
|
||||
self.logger.debug('executing %s' % args)
|
||||
result, _ = subprocess.Popen(
|
||||
' '.join(args),
|
||||
stdout=subprocess.PIPE,
|
||||
shell=True
|
||||
).communicate()
|
||||
try:
|
||||
if result[0] == '!':
|
||||
result = result[1:]
|
||||
if result[-1] == '!':
|
||||
result = result[:-1]
|
||||
except IndexError:
|
||||
raise ValueError("Invalid response", result)
|
||||
return False
|
||||
result = result.split('!')
|
||||
self.logger.debug('got response %s' % result)
|
||||
return result
|
||||
|
||||
def get_request_params(self):
|
||||
params = DEFAULT_PARAMS.copy()
|
||||
params.update(self.options)
|
||||
return params
|
||||
|
||||
def request(self, amount, name=None, address=None, email=None, phone=None,
|
||||
orderid=None, info1=None, info2=None, info3=None,
|
||||
next_url=None, **kwargs):
|
||||
params = self.get_request_params()
|
||||
transaction_id = self.transaction_id(6, string.digits, 'sips', params[MERCHANT_ID])
|
||||
params[TRANSACTION_ID] = transaction_id
|
||||
params[ORDER_ID] = orderid or str(uuid.uuid4())
|
||||
params[ORDER_ID] = params[ORDER_ID].replace('-', '')
|
||||
params['amount'] = self.clean_amount(amount)
|
||||
if email:
|
||||
params['customer_email'] = email
|
||||
normal_return_url = self.normal_return_url
|
||||
if next_url and not normal_return_url:
|
||||
warnings.warn("passing next_url to request() is deprecated, "
|
||||
"set normal_return_url in options", DeprecationWarning)
|
||||
normal_return_url = next_url
|
||||
if normal_return_url:
|
||||
params['normal_return_url'] = normal_return_url
|
||||
code, error, form = self.execute('request', params)
|
||||
if int(code) == 0:
|
||||
return params[ORDER_ID], HTML, form
|
||||
else:
|
||||
raise RuntimeError('sips/request returned -1: %s' % error)
|
||||
|
||||
def response(self, query_string, **kwargs):
|
||||
form = urlparse.parse_qs(query_string)
|
||||
if DATA not in form:
|
||||
raise ResponseError('missing %s' % DATA)
|
||||
params = {'message': form[DATA][0]}
|
||||
result = self.execute('response', params)
|
||||
d = dict(zip(RESPONSE_PARAMS, result))
|
||||
# The reference identifier for the payment is the authorisation_id
|
||||
d[self.BANK_ID] = d.get(AUTHORISATION_ID)
|
||||
self.logger.debug('response contains fields %s' % d)
|
||||
response_result = d.get(RESPONSE_CODE) == '00'
|
||||
response_code_msg = CB_BANK_RESPONSE_CODES.get(d.get(RESPONSE_CODE))
|
||||
response = PaymentResponse(
|
||||
result=response_result,
|
||||
signed=response_result,
|
||||
bank_data=d,
|
||||
order_id=d.get(ORDER_ID),
|
||||
transaction_id=d.get(AUTHORISATION_ID),
|
||||
bank_status=response_code_msg)
|
||||
return response
|
Loading…
Reference in New Issue