class WSClient(object): endpoint = 'https://ws.ingbusinessonline.pl/ing-ccs/cdc00101?wsdl' cert = None ca_cert = None key = None company = '' username = '' timeout = 300 def __init__(self, *args, **kwargs): self.cert = kwargs.get('cert', self.cert) self.ca_cert = kwargs.get('ca_cert', self.ca_cert) self.key = kwargs.get('key', self.key) self.company = kwargs.get('company', self.company) self.username = kwargs.get('username', self.username) self.timeout = kwargs.get('timeout', self.timeout) session = Session() if self.cert and self.key and self.ca_cert: session.cert = (self.cert, self.key) session.verify = self.ca_cert elif self.cert or self.key or self.ca_cert: raise ValueError("Must provide cert, ca_cert and key") self.client = Client(self.endpoint, transport=Transport(session=session, timeout=self.timeout)) def get_headers(self): hdr = self.client.get_element('ns21:CcsHeader') data = { 'FinInstID': 'INGBankŚląski', 'PartnerID': self.company, 'PassID': self.username, 'ProdID': { 'manufacturer': 'zeep', 'ver': zeep.__version__, 'langVer': 'en', }, 'Version': 2, 'Revision': 2, } return hdr(**data) def get_msg_id(self): prefix = 'REQ' rnd = ''.join([ random.choice('123456789ABCDEFGHJKLMNQRSTUVWXYZ') for i in range(16) ]) return '%s%s' % (prefix, rnd) def get_history(self, account_number, start_date, end_date): method = self.client.service.GetAccountReport doctype = self.client.get_type('ns1:GetAccountReportRequestType') data = { 'MsgId': { 'Id': self.get_msg_id() }, 'AcctRptQryDef': { 'AcctRptCrit': { 'NewCrit': { 'SchCrit': { 'AcctId': { 'EQ': { 'IBAN': account_number, } }, 'AcctRptValDt': { 'DtSch': { 'FrDt': start_date, 'ToDt': end_date, }, }, } } } } } document = doctype({'GetAcctRpt': data}) resp = method(document['Document'], _soapheaders=[self.get_headers()]) return History(resp.Rpt) def transfer_domestic(self, account_number, transfers, initiator=''): method = self.client.service.DomesticTransfer doctype = self.client.get_type('ns1:TransferRequestType') _country = re.compile(r'^[A-Z]{2}') _charfilter = re.compile(r'[^A-Za-z0-9/\-+()/\']') dmstc_from_acc = _country.sub('', account_number) now = datetime.now() to_send = [] for txf in transfers: dmstc_to_acc = _country.sub('', txf['account_number']) transfer = { 'PmtId': { 'EndToEndId': _charfilter.sub( '', unidecode( txf.get('description', 'not provided').replace(u' ', u'_')))[:32], }, 'Amt': { 'InstdAmt': { '_value_1': txf['amount'], 'Ccy': txf.get('currency', 'PLN'), }, }, 'CdtrAgt': { 'FinInstnId': { 'ClrSysMmbId': { 'MmbId': dmstc_to_acc[2:10], } } }, 'Cdtr': { 'Nm': charfilter(txf['account_holder_name'], allow_polish=True), 'PstlAdr': { 'AdrLine': cleanaddress(txf.get('account_holder_address', ''), allow_polish=True)[:35], 'Ctry': txf.get('account_holder_country', 'pl').upper(), } }, 'CdtrAcct': { 'Id': { 'Othr': { 'Id': dmstc_to_acc, } } }, 'RmtInf': { 'Ustrd': charfilter(txf.get('description', ''), allow_polish=True)[:140].strip(), } } to_send.append(transfer) data = { 'GrpHdr': { 'MsgId': self.get_msg_id(), 'CreDtTm': now, 'NbOfTxs': len(transfers), 'InitgPty': { 'Nm': initiator, }, }, 'PmtInf': { 'PmtInfId': now.strftime('%Y%m%d%H%M%S'), 'PmtMtd': 'TRF', 'ReqdExctnDt': now.date(), 'Dbtr': { 'Nm': self.company, }, 'DbtrAcct': { 'Id': { 'Othr': { 'Id': dmstc_from_acc, } } }, 'DbtrAgt': { 'FinInstnId': { 'ClrSysMmbId': { 'ClrSysId': { 'Cd': 'PLKNR', }, 'MmbId': dmstc_from_acc[2:10], }, } }, 'CdtTrfTxInf': to_send, } } document = doctype({'CstmrCdtTrfInitn': data}) resp = method(document['Document']) return [(sts.TxSts, sts.AccptncDtTm) for sts in resp.OrgnlPmtInfAndSts[0].TxInfAndSts] def transfer_sepa(self, account_number, transfers, initiator=''): method = self.client.service.SEPATransfer doctype = self.client.get_type('ns1:TransferRequestType') _charfilter = re.compile(r'[^A-Za-z0-9/\-+()/\']') now = datetime.now() to_send = [] for txf in transfers: transfer = { 'PmtId': { 'EndToEndId': _charfilter.sub( '', unidecode( txf.get('description', 'not provided').replace(u' ', u'_')))[:32], }, 'Amt': { 'InstdAmt': { '_value_1': txf['amount'], 'Ccy': txf['currency'], }, }, 'Cdtr': { 'Nm': charfilter(txf['account_holder_name']), 'PstlAdr': { 'AdrLine': cleanaddress(txf.get('account_holder_address', ''))[:35], 'Ctry': txf.get('account_holder_country', 'pl').upper(), } }, 'CdtrAcct': { 'Id': { 'IBAN': txf['account_number'], } }, 'RmtInf': { 'Ustrd': charfilter(txf.get('description', ''))[:140].strip(), }, 'PmtTpInf': { 'SvcLvl': { 'Cd': 'SEPA', } }, } to_send.append(transfer) data = { 'GrpHdr': { 'MsgId': self.get_msg_id(), 'CreDtTm': now, 'NbOfTxs': len(transfers), 'InitgPty': { 'Nm': initiator, }, }, 'PmtInf': { 'PmtInfId': now.strftime('%Y%m%d%H%M%S'), 'PmtMtd': 'TRF', 'ReqdExctnDt': now.date(), 'Dbtr': { 'Nm': self.company, }, 'DbtrAcct': { 'Id': { 'IBAN': account_number, } }, 'ChrgBr': 'SLEV', 'DbtrAgt': { 'FinInstnId': { 'BIC': 'ING', } }, 'CdtTrfTxInf': to_send, } } document = doctype({'CstmrCdtTrfInitn': data}) resp = method(document['Document']) return [(sts.TxSts, sts.AccptncDtTm) for sts in resp.OrgnlPmtInfAndSts[0].TxInfAndSts] def transfer_swift(self, account_number, transfers, initiator=''): raise NotImplementedError("SWIFT is not implemented")
credentials_site_id = "XXXXXXXX" credentials_key = "XXXXX-XXXXX-XXXXX-XXXXX-XXXXX" ip_address = "192.168.0.123" # Generate XML and XSD Validation genius_schema = etree.XMLSchema(file='Genius.xsd') xml_parser = objectify.makeparser(schema=genius_schema) # Generate WSDL and SOAP Objects Build Transport request details transport_soap = Client( wsdl='https://transport.merchantware.net/v4/transportService.asmx?WSDL') transport_request = transport_soap.get_type("ns0:TransportRequest")( TransactionType="SALE", Amount=1.01, ClerkId="1", OrderNumber="INV1234", Dba="TEST MERCHANT", SoftwareName="Test Software", SoftwareVersion="1.0", TerminalId="01", PoNumber="PO1234", TaxAmount="0.10", EntryMode="Undefined", ForceDuplicate=True) # Stage Transaction print("Staging Transaction\n") transport_response = transport_soap.service.CreateTransaction( credentials_name, credentials_site_id, credentials_key, transport_request) transport_key = transport_response.TransportKey print("TransportKey Received: %s\n" % transport_key) # Initiate transaction with TransportKey print("Sending TransportKey %s to Terminal %s" % (transport_key, ip_address)) genius_comm = urllib3.PoolManager()