示例#1
0
文件: EET.py 项目: v154c1/pyEET
class EET:

    def __init__(self, cert_file, password, provozovna=1, pokladna='lidicka', testing=True, eet_url='https://pg.eet.cz:443/eet/services/EETServiceSOAP/v3'):
        self._cert_file = cert_file
        self._testing = testing
        self._pokladna = pokladna
        self._provozovna = provozovna
        self._eet_url = eet_url
        self._signing = Signing(cert_file, password)

        components = self._signing.get_cert_subject().get_components()
        cn = [x for x in components if x[0] == b'CN']
        assert(len(cn) == 1)
        self._dic = cn[0][1].decode('utf8')
        print('DIC: %s' % self._dic)

    def create_payment(self, poradi, amount, first=True, test=True):
        header = TrzbaHeader(first, test)
        return Trzba(header, poradi, self._dic, self._provozovna, self._pokladna, amount)

    def send_payment(self, payment):
        trzba_xml = payment.xml(self._signing)

        soap_xml = wsse.soap_wsse(trzba_xml, self._signing)

        soap_string = etree.tostring(soap_xml)
        open('/tmp/y.xml', 'wb').write(soap_string)

        resp = requests.post(self._eet_url, soap_string)
        resp.raise_for_status()
        try:
            reply = etree.XML(resp.content)
 #           print(etree.tostring(reply, pretty_print=4))
            header = utils.find_node(reply, 'Hlavicka', NS_EET_URL)
        except etree.XMLSyntaxError as e:
            raise eet_exceptions.BadResponse('Failed to parse response from server (%s)'%(str(e)))
        except eet_exceptions.NodeNotFound:
            raise eet_exceptions.BadResponse('Failed to process response - missing node Hlavicka')
        
        try:
            confirmation = utils.find_node(reply, 'Potvrzeni', NS_EET_URL)
            orig_bkp = utils.find_node(trzba_xml, 'bkp')
            bkp = header.get('bkp')
#            print('received bkp: %s, original: %s' % (bkp, orig_bkp.text))
            if bkp != orig_bkp.text:
                raise eet_exceptions.BadResponse('Wrong BKP in response!')
            
            response = {
                'date_received': header.get('dat_prij'),
                'uuid_reply': header.get('uuid_zpravy'),
                'bkp': bkp,
                'fik': confirmation.get('fik'), 
                'test': confirmation.get('test')}
        except eet_exceptions.NodeNotFound:
            try: 
                error = utils.find_node(reply, 'Chyba', NS_EET_URL)
                response = {
                    'date_rejected': header.get('dat_odmit'),
                    'fik': None, 
                    'test': error.get('test'), 
                    'kod':error.get('kod'), 
                    'message': error.text}
            except eet_exceptions.NodeNotFound:
                raise eet_exceptions.BadResponse('Failed to get data from server response')
        return response