DELPHI - Poslovni prostor - help

Dec 26, 2012 at 8:44 AM

Doljnji kod sam "pokupio" sa ove stranice i vrlo uspješno ga implementirao. Slanje poslovnog prostora sam ostavio za kraj. Sada imam problem jer nešto očito ne valja XML-u. jer dobijem grešku "XML početni čvor nije nađen"

MOLIM mali HELP.

 

--------------------------------------------------------------

program SmitFiskal;
uses
  libxml2,
  libxslt,
  libxmlsec,
  SysUtils,
  Classes,
  Dialogs,
  SOAPHTTPTrans,
  XMLDoc,
  XMLIntf,
  Variants,
  ComObj,
  Forms;

{$R *.res}
var
dsigCtx: xmlSecDSigCtxPtr;
xmlData:AnsiString;
signed_xmlData:TStrings;
keyname,oib,UUID:UTF8String;
passw:AnsiString;
procedure appInit;
begin

oib := '11223344556'; //oib iz certifikata
keyname := 'fiskal_1.pfx';
passw:='ABCD_123456';

dsigCtx := xmlSecDSigCtxCreate(nil);
if dsigCtx=nil then raise exception.Create('Nije uspjelo kreiranje potpisnog konteksta');
dsigCtx.signKey := xmlSecCryptoAppKeyLoad(pchar(keyname), xmlSecKeyDataFormatPkcs12, pchar(passw), nil, nil);
if dsigCtx.signKey = nil then raise exception.Create('Ne mogu učitati privatni ključ');
end;
procedure xmlInit;
var
Guid: TGUID;
UUID: String;
begin
xmlData:='';
signed_xmlData:=TStringList.Create;
OleCheck(CreateGUID(Guid));
UUID := LowerCase(Copy(GUIDToString(Guid),2,length(GUIDToString(Guid))-2));
xmlData:='<?xml version="1.0" encoding="UTF-8"?>';
xmlData:=xmlData+'<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">';
//xmlData:=xmlData+'<soapenv:Header/>';
xmlData:=xmlData+'<soapenv:Body>';
xmlData:=xmlData+'<tns:PoslovniProstorZahtjev xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tns="http://www.apis-it.hr/fin/2012/types/f73" xsi:schemaLocation="http://www.apis-it.hr/fin/2012/types/f73 ../schema/FiskalizacijaSchema.xsd" Id="poslovniProstorId">';
xmlData:=xmlData+'    <tns:Zaglavlje>';
xmlData:=xmlData+'        <tns:IdPoruke>'+uuid+'</tns:IdPoruke>';
xmlData:=xmlData+'        <tns:DatumVrijeme>01.09.2012T21:10:34</tns:DatumVrijeme>';
xmlData:=xmlData+'    </tns:Zaglavlje>';
xmlData:=xmlData+'    <tns:PoslovniProstor>';
xmlData:=xmlData+'        <tns:Oib>98765432198</tns:Oib>';
xmlData:=xmlData+'        <tns:OznPoslProstora>Poslovnica1</tns:OznPoslProstora>';
xmlData:=xmlData+'        <tns:AdresniPodatak>';
xmlData:=xmlData+'          <tns:Adresa>';
xmlData:=xmlData+'            <tns:Ulica>Avenija Marina Držića</tns:Ulica>';
xmlData:=xmlData+'            <tns:KucniBroj>0014</tns:KucniBroj>';
xmlData:=xmlData+'            <tns:KucniBrojDodatak>B</tns:KucniBrojDodatak>';
xmlData:=xmlData+'            <tns:BrojPoste>10000</tns:BrojPoste>';
xmlData:=xmlData+'            <tns:Naselje>Zagreb</tns:Naselje>';
xmlData:=xmlData+'            <tns:Opcina>Zagreb</tns:Opcina>';
xmlData:=xmlData+'          </tns:Adresa>';
xmlData:=xmlData+'        </tns:AdresniPodatak>';
xmlData:=xmlData+'        <tns:RadnoVrijeme>Pon-Sub: 08:00-21:00, Ned: 09:00-14:00</tns:RadnoVrijeme>';
xmlData:=xmlData+'        <tns:DatumPocetkaPrimjene>01.09.2012</tns:DatumPocetkaPrimjene>';
xmlData:=xmlData+'        <tns:SpecNamj>08765432498</tns:SpecNamj>';
xmlData:=xmlData+'    </tns:PoslovniProstor>';



xmlData:=xmlData+' <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">';
xmlData:=xmlData+' <SignedInfo>';
xmlData:=xmlData+' <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>';
xmlData:=xmlData+' <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>';
xmlData:=xmlData+' <Reference URI="#poslovniProstorId">';
xmlData:=xmlData+' <Transforms>';
xmlData:=xmlData+' <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>';
xmlData:=xmlData+' <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>';
xmlData:=xmlData+' </Transforms>';
xmlData:=xmlData+' <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>';
xmlData:=xmlData+' <DigestValue/>';
xmlData:=xmlData+' </Reference>';
xmlData:=xmlData+' </SignedInfo>';
xmlData:=xmlData+' <SignatureValue/>';
xmlData:=xmlData+' <KeyInfo>';
xmlData:=xmlData+' <KeyName>'+keyname+'</KeyName>';
xmlData:=xmlData+' <X509Data/>';
xmlData:=xmlData+' </KeyInfo>';
xmlData:=xmlData+' </Signature>';

xmlData:=xmlData+'</tns:PoslovniProstorZahtjev>';
xmlData:=xmlData+' </soapenv:Body>';
xmlData:=xmlData+'</soapenv:Envelope>';

end;
procedure SignFile;
var node: xmlNodePtr;
doc: xmlDocPtr;
buffer: PAnsiChar;
bufSize: integer;
duz,i:Integer;
adr:PChar;
begin
    doc := xmlParseDoc(PAnsiChar(xmlData));
    node := xmlSecFindNode(xmlDocGetRootElement(doc), PAnsiChar(xmlSecNodeSignature), PAnsiChar(xmlSecDSigNs));
    if not Assigned(node) then raise exception.Create('XML početni čvor nije nađen');
    //id pizdarije
      xmlAddID(nil, doc, PAnsiChar('poslovniProstorId'),
      xmlHasProp(xmlSecFindNode(xmlDocGetRootElement(doc), PAnsiChar('PoslovniProstorZahtjev'), PAnsiChar('http://www.apis-it.hr/fin/2012/types/f73')), PAnsiChar('Id')));
    if (xmlSecDSigCtxSign(dsigCtx, node) < 0) then  begin
      raise exception.Create('Potpisivanje neuspješno');
    end;
    buffer := nil;
    xmlDocDumpMemory(doc, @buffer, @bufSize);
    signed_xmlData.Text := buffer;
   // MessageDlG(buffer,mtInformation,[mbOk],0); //prikaz potipisanog xml-a
end;

function XMLFindNode(aNode:IXMLNode;aChildName:string):IXMLNode;
var i:integer;
begin
    result := nil;
    if aNode.HasChildNodes then for i:=0 to aNode.ChildNodes.Count-1 do
    if aNode.ChildNodes[i].NodeName = aChildName then begin
        result := aNode.ChildNodes[i];
      exit;
    end;
end;

function GetJir:string;
var HTTPReqResp: THTTPReqResp;
Stream: TMemoryStream;
StrStream: TStringStream; i:integer;
aXML:TXMLDocument; aJir:string; aNode:IXMLNode;
begin
    Stream := TMemoryStream.Create;
    StrStream := TStringStream.Create('');
    HTTPReqResp:= THTTPReqResp.Create(nil);
    aXML := TXMLDocument.Create(Application);
    try
      HTTPReqResp.UseUTF8InHeader := True;
      HTTPReqResp.URl :='https://cistest.apis-it.hr:8449/FiskalizacijaServiceTest';
      HTTPReqResp.Execute(signed_xmlData.Text, Stream);
      StrStream.CopyFrom(Stream, 0);
      aXML.LoadFromStream(StrStream);
      aXML.SaveToFile('response.xml');
      Result := 'greška';
      aNode := aXML.ChildNodes.FindNode('soap:Envelope');       //unutar envelope
      if assigned(aNode) and aNode.HasChildNodes then begin
         aNode := aNode.ChildNodes.FindNode('soap:Body');      //je body, a unutar body
         if assigned(aNode) and aNode.HasChildNodes then begin //'tns:RacunOdgovor' find node ne nalazai?????
            aNode := XMLFindNode(aNode,'tns:PoslovniProstorOdgovor');    //je RacunOdgovor (koji se ne može nać sa .FindNode, pa ga ručno tražim???
            if assigned(aNode) and aNode.HasChildNodes then begin
               aNode := aNode.ChildNodes.FindNode('tns:DatumVrijeme');     //a unutar RacunOdgovor je Jir!!!!!
               if assigned(aNode) then Result := aNode.NodeValue;
            end;
         end;
      end;
finally
HTTPReqResp.Free;
Stream.Free;
StrStream.Free;
end;
end;

procedure appFinish;
begin
    xmlData:='';
    signed_xmlData.Free;
end;


begin
  xmlInitParser();
  __xmlLoadExtDtdDefaultValue^ := XML_DETECT_IDS or XML_COMPLETE_ATTRS;
  xmlSubstituteEntitiesDefault(1);
  __xmlIndentTreeOutput^ := 1;
  if (xmlSecInit() < 0) then Writeln(ErrOutput, 'Greška: neuspjela xmlsec inicijalizacija.');
  if (xmlSecCheckVersionExt(1, 2, 8, xmlSecCheckVersionABICompatible) <> 1) then raise exception.Create('Učitana kriva verzija xmlsec biblioteke.');
  if (xmlSecCryptoDLLoadLibrary('openssl') < 0) then raise exception.Create('ne mogu učitati xmlsec-crypto biblioteku. Provjerite'#10 );
  if (xmlSecCryptoAppInit(nil) < 0) then raise exception.Create('neuspjela crypto inicijalizacija.');
  if (xmlSecCryptoInit() < 0) then raise exception.Create('neuspjela xmlsec-crypto inicijalizacija.');
  try
    appInit;
    xmlInit;
    SignFile;
    MessageDlG(GetJir,mtInformation,[mbOk],0);
finally
    // Shutdown xmlsec-crypto library
      xmlSecCryptoShutdown();
    // Shutdown crypto library
      xmlSecCryptoAppShutdown();
    // Shutdown xmlsec library
      xmlSecShutdown();
    // Shutdown libxslt/libxml
      xsltCleanupGlobals();
    xmlCleanupParser();
    appFinish;
end;



end.

--------------------------------------------------------------

Dec 26, 2012 at 9:19 AM

Koje su ti vrijednosti za : xmlSecNodeSignature i xmlSecDSigNs?

Dec 26, 2012 at 9:35 AM

Vrijednosti su:

Signature i http://www.w3.org/2000/09/xmldsig#

Dec 26, 2012 at 10:13 AM

Hm, a da probaš zvati xmlSecFindNode isto kao što zoveš i par linija nakon toga : 

xmlSecFindNode(xmlDocGetRootElement(doc), PAnsiChar('PoslovniProstorZahtjev'), PAnsiChar('http://www.apis-it.hr/fin/2012/types/f73')

Dec 26, 2012 at 3:36 PM

Ne nije to. Problem je kaj se u taj XML uopće ne kužim.

Imaš još ideja ?

Dec 26, 2012 at 4:31 PM

Riješio.

HEBENA HRV. SLOVA. Kada maknem iz texta sve radi 5.