Dokumendi saatmine üle X-Tee kasutades PHP Curl moodulit

Dokumendi saatmine üle X-Tee kasutades PHP Curl moodulit

Eesti riik pakub võimalust saata oma dokumente teistele asutustele või omavalitsustele üle X-Tee.  
Selleks on koostatud aegunud ja väga kehvasti loetav DHX süsteem, mis on ehitatud Java peale.  
DHX Java teeke või DHX adapterserverit ei õnnestunud käima saada. 

Dokumendi saatmine kasutades PHP Curl moodulit

Esmalt on eelduseks, et on sõlmitud X-Tee leping ja on olemas ka turvaserver.  
Eelnevalt koostatud sertifikaate hoiustavad failid server.pem ja testKeystore.jks  
Lisaks võib vaja olla ka dokumendi saajaga kokkulepet dokumendi vastuvõtmiseks. 

Näidises saadame eelnevalt digitaalselt allkirjastatud dokumendi nimega testdoc.asice

 

1. Faili lugemine serverist (testdoc.asice)

Fail nimega testdoc.asice asub loodava PHP failiga samas asukohas või vajadusel muuta $file viide. 

  1. $file='testdoc.asice';
  2. $data=file_get_contents($file);
  3. $gzdata=gzencode($data,9);

Fail loetakse sisse ja pakitakse gzip kujul kokku.

 

2. Saatja ja saaja andmed

2.1 Saaja

Saaja andmed on võimalik leida kataloogist  
https://x-tee.ee/catalogue/ee-test 

Näiteks EE/GOV/<registrikood>/DHX/sendDocument või EE/COM/<registrikood>/DHX/sendDocument

Meie kasutame oma näidises ee-test/COM/12345678/DHX/sendDocument

  1. $service=array(
  2. 'xRoadInstance'=>'ee-test',
  3. 'memberClass'=>'COM',
  4. 'memberCode'=>'12345678',
  5. 'subsystemCode'=>'DHX',
  6. 'serviceCode'=>'sendDocument',
  7. 'serviceVersion'=>'v1'
  8. );
  1. $recipient=array(
  2. 'Name'=>'Registrite ja Infosüsteemide Keskus',
  3. 'OrganisationCode'=>'14552803',
  4. 'Residency'=>'EE'
  5. );

$recipient muutuja võib lugeda kokku $service muutujaga. OrganisationCode ja memberCode on samad. 

 

2.2 Saatja

Eelnevalt X-Tee liikmeks registreerimisel saadud andmed 

  1. $client=array(
  2. 'xRoadInstance'=>'ee-test',
  3. 'memberClass'=>'COM',
  4. 'memberCode'=>'87654321',
  5. 'subsystemCode'=>'DHX-87654321'
  6. );
  1. $sender=array('OrganisationCode'=>'87654321');

$client ja $sender võib kokku üheks lugeda. OrganisationCode ja memberCode on samad.

  1. $recordCreator=array(
  2. 'Name'=>'Juhan Pääsuke',
  3. 'GivenName'=>'Juhan',
  4. 'Surname'=>'Pääsuke',
  5. 'PersonalIdCode'=>'EE38511026032',
  6. 'Residency'=>'EE',
  7. 'Phone'=>'37250000000',
  8. 'Email'=>'juhan.paasuke@domeen.ee',
  9. 'WebPage'=>'',
  10. 'MessagingAddress'=>'',
  11. 'Country'=>'Eesti',
  12. 'County'=>'Harju maakond',
  13. 'LocalGovernment'=>'Tallinn',
  14. 'PostalCode'=>'10148'
  15. );
  1. $recordSender=array(
  2. 'Name'=>'Juhan Pääsuke',
  3. 'GivenName'=>'Juhan',
  4. 'Surname'=>'Pääsuke',
  5. 'PersonalIdCode'=>'EE38511026032',
  6. 'Residency'=>'EE',
  7. 'Phone'=>'37250000000',
  8. 'Email'=>'juhan.paasuke@domeen.ee',
  9. 'WebPage'=>'',
  10. 'MessagingAddress'=>'',
  11. 'Country'=>'Eesti',
  12. 'County'=>'Harju maakond',
  13. 'LocalGovernment'=>'Tallinn',
  14. 'PostalCode'=>'10148'
  15. );

$recordCreator ja $recordSender võib kokku üheks lugeda. 

 

2.3 Meta

  1. $recordMetadata=array(
  2. 'RecordType'=>'Kiri',
  3. 'RecordTitle'=>'',
  4. 'RecordLanguage'=>'EE',
  5. 'AccessConditionsCode'=>'Avalik'
  6. );

 

2.4 Turvaserver

Oma turvaserveri asukoht

  1. $soapUrl='https://turvaserver.domeen.ee/cgi-bin/cproxy/sendDocument';

 

3. Kapsel

Kapsel on ümbriku sees saadetav manus. Kapsli sees on omakorda saadetava faili gzip ja seejärel base64 kodeeringus sisu. 
Meie saadame kapsli sees allkirjastatud faili nimega testdoc.asice, mille sees on omakorda lõplik saadetav dokument. 

  1. $capsule_xml='<?xml version="1.0" encoding="utf-8"?>
  2. <DecContainer xmlns="http://www.riik.ee/schemas/deccontainer/vers_2_1/">
  3. <Transport>
  4. <DecSender>
  5. <OrganisationCode>'.$sender['OrganisationCode'].'</OrganisationCode>
  6. <PersonalIdCode>'.$recordSender['PersonalIdCode'].'</PersonalIdCode>
  7. </DecSender>
  8. <DecRecipient>
  9. <OrganisationCode>'.$recipient['OrganisationCode'].'</OrganisationCode>
  10. </DecRecipient>
  11. </Transport>
  12. <RecordCreator>
  13. <Person>
  14. <Name>'.$recordCreator['Name'].'</Name>
  15. <GivenName>'.$recordCreator['GivenName'].'</GivenName>
  16. <Surname>'.$recordCreator['Surname'].'</Surname>
  17. <PersonalIdCode>'.$recordCreator['PersonalIdCode'].'</PersonalIdCode>
  18. <Residency>'.$recordCreator['Residency'].'</Residency>
  19. </Person>
  20. <ContactData>
  21. <Adit>1</Adit>
  22. <Phone>'.$recordCreator['Phone'].'</Phone>
  23. <Email>'.$recordCreator['Email'].'</Email>
  24. <WebPage>'.$recordCreator['WebPage'].'</WebPage>
  25. <MessagingAddress>'.$recordCreator['MessagingAddress'].'</MessagingAddress>
  26. <PostalAddress>
  27. <Country>'.$recordCreator['Country'].'</Country>
  28. <County>'.$recordCreator['County'].'</County>
  29. <LocalGovernment>'.$recordCreator['LocalGovernment'].'</LocalGovernment>
  30. <AdministrativeUnit></AdministrativeUnit>
  31. <SmallPlace></SmallPlace>
  32. <LandUnit></LandUnit>
  33. <Street></Street>
  34. <HouseNumber></HouseNumber>
  35. <BuildingPartNumber></BuildingPartNumber>
  36. <PostalCode>'.$recordCreator['PostalCode'].'</PostalCode>
  37. </PostalAddress>
  38. </ContactData>
  39. </RecordCreator>
  40. <RecordSenderToDec>
  41. <Person>
  42. <Name>'.$recordSender['Name'].'</Name>
  43. <GivenName>'.$recordSender['GivenName'].'</GivenName>
  44. <Surname>'.$recordSender['Surname'].'</Surname>
  45. <PersonalIdCode>'.$recordSender['PersonalIdCode'].'</PersonalIdCode>
  46. <Residency>'.$recordSender['Residency'].'</Residency>
  47. </Person>
  48. <ContactData>
  49. <Adit>1</Adit>
  50. <Phone>'.$recordSender['Phone'].'</Phone>
  51. <Email>'.$recordSender['Email'].'</Email>
  52. <WebPage>'.$recordSender['WebPage'].'</WebPage>
  53. <MessagingAddress>'.$recordSender['MessagingAddress'].'</MessagingAddress>
  54. <PostalAddress>
  55. <Country>'.$recordSender['Country'].'</Country>
  56. <County>'.$recordSender['County'].'</County>
  57. <LocalGovernment>'.$recordSender['LocalGovernment'].'</LocalGovernment>
  58. <AdministrativeUnit></AdministrativeUnit>
  59. <SmallPlace></SmallPlace>
  60. <LandUnit></LandUnit>
  61. <Street></Street>
  62. <HouseNumber></HouseNumber>
  63. <BuildingPartNumber></BuildingPartNumber>
  64. <PostalCode>'.$recordSender['PostalCode'].'</PostalCode>
  65. </PostalAddress>
  66. </ContactData>
  67. </RecordSenderToDec>
  68. <Recipient>
  69. <Organisation>
  70. <Name>'.$recipient['Name'].'</Name>
  71. <OrganisationCode>'.$recipient['OrganisationCode'].'</OrganisationCode>
  72. <Residency>'.$recipient['Residency'].'</Residency>
  73. </Organisation>
  74. </Recipient>
  75. <RecordMetadata>
  76. <RecordGuid>'.generateId(array(8,4,4,4,12)).'</RecordGuid>
  77. <RecordType>'.$recordMetadata['RecordType'].'</RecordType>
  78. <RecordOriginalIdentifier>'.generateNumberId(6).'</RecordOriginalIdentifier>
  79. <RecordDateRegistered>'.date('Y-m-d\TH:i:s').'</RecordDateRegistered>
  80. <RecordTitle>'.$recordMetadata['RecordTitle'].'</RecordTitle>
  81. <RecordLanguage>'.$recordMetadata['RecordLanguage'].'</RecordLanguage>
  82. </RecordMetadata>
  83. <Access>
  84. <AccessConditionsCode>'.$recordMetadata['AccessConditionsCode'].'</AccessConditionsCode>
  85. </Access>
  86. <File>
  87. <FileGuid>'.generateId(array(8,4,4,4,12)).'</FileGuid>
  88. <RecordMainComponent>1</RecordMainComponent>
  89. <FileName>'.basename($file).'</FileName>
  90. <MimeType>application/vnd.etsi.asic-e+zip</MimeType>
  91. <FileSize>'.filesize($file).'</FileSize>
  92. <ZipBase64Content>'.base64_encode($gzdata).'</ZipBase64Content>
  93. </File>
  94. <RecordTypeSpecificMetadata />
  95. <DecMetadata>
  96. <DecId>'.generateNumberId(5).'</DecId>
  97. <DecFolder>/</DecFolder>
  98. <DecReceiptDate>'.date('Y-m-d\TH:i:s').'</DecReceiptDate>
  99. </DecMetadata>
  100. </DecContainer>';

Kapsli sees on id nimetuste loomiseks kasutatud suvalist genereerimist, mis tuleks hiljem asendada õigete id väärtustega. ID väärtused peavad valideeruma vastu 
[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}

Kogu saadetav kapsel peab valideeruma vastu DVK 2.1 Kapsel.xsd 
Kapsel.xsd ja rohkem infot leitav aadressilt 
https://varamu.riha.ee/#Elektroonilise_andmevahetuse_metaandmed

  1. $attachment_id=generateId(array(8,4,4,4,12));
  2. $attachment_base64_gzip=base64_encode($capsule_xml);

 

4. Ümbrik

Ümbrikus määrame ära kirja saaja ja saatja. 

  1. $envelope='<?xml version="1.0" encoding="utf-8" ?>
  2. <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  3. <SOAP-ENV:Header>
  4. <ns4:protocolVersion xmlns:ns2="http://dhx.x-road.eu/producer" xmlns:ns3="http://x-road.eu/xsd/identifiers" xmlns:ns4="http://x-road.eu/xsd/xroad.xsd" xmlns:ns5="http://www.riik.ee/schemas/deccontainer/vers_2_1/">4.0</ns4:protocolVersion>
  5. <ns4:id xmlns:ns2="http://dhx.x-road.eu/producer" xmlns:ns3="http://x-road.eu/xsd/identifiers" xmlns:ns4="http://x-road.eu/xsd/xroad.xsd" xmlns:ns5="http://www.riik.ee/schemas/deccontainer/vers_2_1/">64a3ddbd-1620-42c4-b2fe-60b854c2f32f</ns4:id>
  6. <ns4:client xmlns:ns2="http://dhx.x-road.eu/producer" xmlns:ns3="http://x-road.eu/xsd/identifiers" xmlns:ns4="http://x-road.eu/xsd/xroad.xsd" xmlns:ns5="http://www.riik.ee/schemas/deccontainer/vers_2_1/" ns3:objectType="SUBSYSTEM">
  7. <ns3:xRoadInstance>'.$client['xRoadInstance'].'</ns3:xRoadInstance>
  8. <ns3:memberClass>'.$client['memberClass'].'</ns3:memberClass>
  9. <ns3:memberCode>'.$client['memberCode'].'</ns3:memberCode>
  10. <ns3:subsystemCode>'.$client['subsystemCode'].'</ns3:subsystemCode>
  11. </ns4:client>
  12. <ns4:service xmlns:ns2="http://dhx.x-road.eu/producer" xmlns:ns3="http://x-road.eu/xsd/identifiers" xmlns:ns4="http://x-road.eu/xsd/xroad.xsd" xmlns:ns5="http://www.riik.ee/schemas/deccontainer/vers_2_1/" ns3:objectType="SERVICE">
  13. <ns3:xRoadInstance>'.$service['xRoadInstance'].'</ns3:xRoadInstance>
  14. <ns3:memberClass>'.$service['memberClass'].'</ns3:memberClass>
  15. <ns3:memberCode>'.$service['memberCode'].'</ns3:memberCode>
  16. <ns3:subsystemCode>'.$service['subsystemCode'].'</ns3:subsystemCode>
  17. <ns3:serviceCode>'.$service['serviceCode'].'</ns3:serviceCode>
  18. <ns3:serviceVersion>'.$service['serviceVersion'].'</ns3:serviceVersion>
  19. </ns4:service>
  20. </SOAP-ENV:Header>
  21. <SOAP-ENV:Body>
  22. <ns3:sendDocument xmlns:ns2="http://www.riik.ee/schemas/deccontainer/vers_2_1/" xmlns:ns3="http://dhx.x-road.eu/producer" xmlns:ns4="http://x-road.eu/xsd/identifiers" xmlns:ns5="http://x-road.eu/xsd/xroad.xsd">
  23. <ns3:DHXVersion>1.0</ns3:DHXVersion>
  24. <ns3:consignmentId>'.generateId(array(8,4,4,4,12)).'</ns3:consignmentId>
  25. <ns3:documentAttachment>cid:'.$attachment_id.'</ns3:documentAttachment>
  26. </ns3:sendDocument>
  27. </SOAP-ENV:Body>
  28. </SOAP-ENV:Envelope>';

 

5. Saatmine - Curl swaRef

  1. $boundary='----=_Part_'.generateId(array(8,12));
  2.  
  3. $documentAttachment='--'.$boundary."\n".
  4. 'Content-Type: text/xml; type="text/xml"; charset=utf-8'."\n".
  5. 'Content-ID: <soapPart>'."\n"."\n".
  6. $envelope."\n".
  7. '--'.$boundary."\n".
  8. 'Content-Type: text/xml; charset=UTF-8'."\n".
  9. 'Content-Encoding: gzip'."\n".
  10. 'Content-Transfer-Encoding: base64'."\n".
  11. 'Content-ID: <'.$attachment_id.'>'."\n"."\n".
  12. $attachment_base64_gzip."\n".
  13. '--'.$boundary.'--';
  14.  
  15. //$documentAttachment=str_ireplace("\x0D","",$documentAttachment);//Remove ^M (Windows cariage return) if needed

 

Curl headers

  1. $headers=array(
  2. 'MIME-Version: 1.0',
  3. 'Content-Type: Multipart/Related; start-info="text/xml"; type="text/xml"; start="<soapPart>"; charset="utf-8"; boundary="'.$boundary.'"',
  4. 'Cache-Control: no-cache',
  5. 'Pragma: no-cache',
  6. 'SOAPAction: ""',
  7. 'Content-length: '.strlen($documentAttachment)
  8. );

 

Curl - Saadame ümbriku koos manusega ja saame vastu xml kujul vastuse. 

  1. $ch=curl_init();
  2.  
  3. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
  4. curl_setopt($ch, CURLOPT_CAINFO, 'server.pem');
  5. curl_setopt($ch, CURLOPT_SSH_PRIVATE_KEYFILE, 'testKeystore.jks');
  6. curl_setopt($ch, CURLOPT_SSLCERT, 'server.pem');
  7. curl_setopt($ch, CURLOPT_SSLCERTPASSWD, "changeit");
  8. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
  9. curl_setopt($ch, CURLOPT_URL, $soapUrl);
  10. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  11. curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
  12. curl_setopt($ch, CURLOPT_TIMEOUT, 10);
  13. curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
  14. curl_setopt($ch, CURLOPT_POST, true);
  15. curl_setopt($ch, CURLOPT_POSTFIELDS, $documentAttachment);
  16. curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
  17. curl_setopt($ch, CURLINFO_HEADER_OUT, true);
  18. curl_setopt($ch, CURLOPT_HEADER, 1);
  19. curl_setopt($ch, CURLOPT_VERBOSE, true);
  20. curl_setopt($ch, CURLOPT_ENCODING, 'UTF-8');
  21.  
  22. $response=curl_exec($ch);

 

Vastuse kuvamine saajalt

  1. echo '<h1>Vastus</h1>';
  2. echo '<pre style="padding:10px;margin:5px;background-color:yellow;white-space:pre-wrap;">'.htmlspecialchars($response).'</pre>';

 


Kogu süsteem koos 

  1. <?php
  2. $file='testdoc.asice';
  3. $data=file_get_contents($file);
  4. $gzdata=gzencode($data,9);
  5.  
  6. $service=array(
  7. 'xRoadInstance'=>'ee-test',
  8. 'memberClass'=>'COM',
  9. 'memberCode'=>'12345678',
  10. 'subsystemCode'=>'DHX',
  11. 'serviceCode'=>'sendDocument',
  12. 'serviceVersion'=>'v1'
  13. );
  14.  
  15. $client=array(
  16. 'xRoadInstance'=>'ee-test',
  17. 'memberClass'=>'COM',
  18. 'memberCode'=>'87654321',
  19. 'subsystemCode'=>'DHX-87654321'
  20. );
  21.  
  22. $sender=array('OrganisationCode'=>'87654321');
  23.  
  24. $recipient=array(
  25. 'Name'=>'Registrite ja Infosüsteemide Keskus',
  26. 'OrganisationCode'=>'12345678',
  27. 'Residency'=>'EE'
  28. );
  29.  
  30. $recordCreator=array(
  31. 'Name'=>'Juhan Pääsuke',
  32. 'GivenName'=>'Juhan',
  33. 'Surname'=>'Pääsuke',
  34. 'PersonalIdCode'=>'EE38511026032',
  35. 'Residency'=>'EE',
  36. 'Phone'=>'37250000000',
  37. 'Email'=>'juhan.paasuke@domeen.ee',
  38. 'WebPage'=>'',
  39. 'MessagingAddress'=>'',
  40. 'Country'=>'Eesti',
  41. 'County'=>'Harju maakond',
  42. 'LocalGovernment'=>'Tallinn',
  43. 'PostalCode'=>'10148'
  44. );
  45. $recordSender=array(
  46. 'Name'=>'Juhan Pääsuke',
  47. 'GivenName'=>'Juhan',
  48. 'Surname'=>'Pääsuke',
  49. 'PersonalIdCode'=>'EE38511026032',
  50. 'Residency'=>'EE',
  51. 'Phone'=>'37250000000',
  52. 'Email'=>'juhan.paasuke@domeen.ee',
  53. 'WebPage'=>'',
  54. 'MessagingAddress'=>'',
  55. 'Country'=>'Eesti',
  56. 'County'=>'Harju maakond',
  57. 'LocalGovernment'=>'Tallinn',
  58. 'PostalCode'=>'10148'
  59. );
  60.  
  61. $recordMetadata=array(
  62. 'RecordType'=>'Kiri',
  63. 'RecordTitle'=>'',
  64. 'RecordLanguage'=>'EE',
  65. 'AccessConditionsCode'=>'Avalik'
  66. );
  67.  
  68. $soapUrl='https://turvaserver.domeen.ee/cgi-bin/cproxy/sendDocument';
  69.  
  70. $capsule_xml='<?xml version="1.0" encoding="utf-8"?>
  71. <DecContainer xmlns="http://www.riik.ee/schemas/deccontainer/vers_2_1/">
  72. <Transport>
  73. <DecSender>
  74. <OrganisationCode>'.$sender['OrganisationCode'].'</OrganisationCode>
  75. <PersonalIdCode>'.$recordSender['PersonalIdCode'].'</PersonalIdCode>
  76. </DecSender>
  77. <DecRecipient>
  78. <OrganisationCode>'.$recipient['OrganisationCode'].'</OrganisationCode>
  79. </DecRecipient>
  80. </Transport>
  81. <RecordCreator>
  82. <Person>
  83. <Name>'.$recordCreator['Name'].'</Name>
  84. <GivenName>'.$recordCreator['GivenName'].'</GivenName>
  85. <Surname>'.$recordCreator['Surname'].'</Surname>
  86. <PersonalIdCode>'.$recordCreator['PersonalIdCode'].'</PersonalIdCode>
  87. <Residency>'.$recordCreator['Residency'].'</Residency>
  88. </Person>
  89. <ContactData>
  90. <Adit>1</Adit>
  91. <Phone>'.$recordCreator['Phone'].'</Phone>
  92. <Email>'.$recordCreator['Email'].'</Email>
  93. <WebPage>'.$recordCreator['WebPage'].'</WebPage>
  94. <MessagingAddress>'.$recordCreator['MessagingAddress'].'</MessagingAddress>
  95. <PostalAddress>
  96. <Country>'.$recordCreator['Country'].'</Country>
  97. <County>'.$recordCreator['County'].'</County>
  98. <LocalGovernment>'.$recordCreator['LocalGovernment'].'</LocalGovernment>
  99. <AdministrativeUnit></AdministrativeUnit>
  100. <SmallPlace></SmallPlace>
  101. <LandUnit></LandUnit>
  102. <Street></Street>
  103. <HouseNumber></HouseNumber>
  104. <BuildingPartNumber></BuildingPartNumber>
  105. <PostalCode>'.$recordCreator['PostalCode'].'</PostalCode>
  106. </PostalAddress>
  107. </ContactData>
  108. </RecordCreator>
  109. <RecordSenderToDec>
  110. <Person>
  111. <Name>'.$recordSender['Name'].'</Name>
  112. <GivenName>'.$recordSender['GivenName'].'</GivenName>
  113. <Surname>'.$recordSender['Surname'].'</Surname>
  114. <PersonalIdCode>'.$recordSender['PersonalIdCode'].'</PersonalIdCode>
  115. <Residency>'.$recordSender['Residency'].'</Residency>
  116. </Person>
  117. <ContactData>
  118. <Adit>1</Adit>
  119. <Phone>'.$recordSender['Phone'].'</Phone>
  120. <Email>'.$recordSender['Email'].'</Email>
  121. <WebPage>'.$recordSender['WebPage'].'</WebPage>
  122. <MessagingAddress>'.$recordSender['MessagingAddress'].'</MessagingAddress>
  123. <PostalAddress>
  124. <Country>'.$recordSender['Country'].'</Country>
  125. <County>'.$recordSender['County'].'</County>
  126. <LocalGovernment>'.$recordSender['LocalGovernment'].'</LocalGovernment>
  127. <AdministrativeUnit></AdministrativeUnit>
  128. <SmallPlace></SmallPlace>
  129. <LandUnit></LandUnit>
  130. <Street></Street>
  131. <HouseNumber></HouseNumber>
  132. <BuildingPartNumber></BuildingPartNumber>
  133. <PostalCode>'.$recordSender['PostalCode'].'</PostalCode>
  134. </PostalAddress>
  135. </ContactData>
  136. </RecordSenderToDec>
  137. <Recipient>
  138. <Organisation>
  139. <Name>'.$recipient['Name'].'</Name>
  140. <OrganisationCode>'.$recipient['OrganisationCode'].'</OrganisationCode>
  141. <Residency>'.$recipient['Residency'].'</Residency>
  142. </Organisation>
  143. </Recipient>
  144. <RecordMetadata>
  145. <RecordGuid>'.generateId(array(8,4,4,4,12)).'</RecordGuid>
  146. <RecordType>'.$recordMetadata['RecordType'].'</RecordType>
  147. <RecordOriginalIdentifier>'.generateNumberId(6).'</RecordOriginalIdentifier>
  148. <RecordDateRegistered>'.date('Y-m-d\TH:i:s').'</RecordDateRegistered>
  149. <RecordTitle>'.$recordMetadata['RecordTitle'].'</RecordTitle>
  150. <RecordLanguage>'.$recordMetadata['RecordLanguage'].'</RecordLanguage>
  151. </RecordMetadata>
  152. <Access>
  153. <AccessConditionsCode>'.$recordMetadata['AccessConditionsCode'].'</AccessConditionsCode>
  154. </Access>
  155. <File>
  156. <FileGuid>'.generateId(array(8,4,4,4,12)).'</FileGuid>
  157. <RecordMainComponent>1</RecordMainComponent>
  158. <FileName>'.basename($file).'</FileName>
  159. <MimeType>application/vnd.etsi.asic-e+zip</MimeType>
  160. <FileSize>'.filesize($file).'</FileSize>
  161. <ZipBase64Content>'.base64_encode($gzdata).'</ZipBase64Content>
  162. </File>
  163. <RecordTypeSpecificMetadata />
  164. <DecMetadata>
  165. <DecId>'.generateNumberId(5).'</DecId>
  166. <DecFolder>/</DecFolder>
  167. <DecReceiptDate>'.date('Y-m-d\TH:i:s').'</DecReceiptDate>
  168. </DecMetadata>
  169. </DecContainer>';
  170.  
  171. $attachment_id=generateId(array(8,4,4,4,12));
  172. $attachment_base64_gzip=base64_encode($capsule_xml);
  173.  
  174. $envelope='<?xml version="1.0" encoding="utf-8" ?>
  175. <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  176. <SOAP-ENV:Header>
  177. <ns4:protocolVersion xmlns:ns2="http://dhx.x-road.eu/producer" xmlns:ns3="http://x-road.eu/xsd/identifiers" xmlns:ns4="http://x-road.eu/xsd/xroad.xsd" xmlns:ns5="http://www.riik.ee/schemas/deccontainer/vers_2_1/">4.0</ns4:protocolVersion>
  178. <ns4:id xmlns:ns2="http://dhx.x-road.eu/producer" xmlns:ns3="http://x-road.eu/xsd/identifiers" xmlns:ns4="http://x-road.eu/xsd/xroad.xsd" xmlns:ns5="http://www.riik.ee/schemas/deccontainer/vers_2_1/">64a3ddbd-1620-42c4-b2fe-60b854c2f32f</ns4:id>
  179. <ns4:client xmlns:ns2="http://dhx.x-road.eu/producer" xmlns:ns3="http://x-road.eu/xsd/identifiers" xmlns:ns4="http://x-road.eu/xsd/xroad.xsd" xmlns:ns5="http://www.riik.ee/schemas/deccontainer/vers_2_1/" ns3:objectType="SUBSYSTEM">
  180. <ns3:xRoadInstance>'.$client['xRoadInstance'].'</ns3:xRoadInstance>
  181. <ns3:memberClass>'.$client['memberClass'].'</ns3:memberClass>
  182. <ns3:memberCode>'.$client['memberCode'].'</ns3:memberCode>
  183. <ns3:subsystemCode>'.$client['subsystemCode'].'</ns3:subsystemCode>
  184. </ns4:client>
  185. <ns4:service xmlns:ns2="http://dhx.x-road.eu/producer" xmlns:ns3="http://x-road.eu/xsd/identifiers" xmlns:ns4="http://x-road.eu/xsd/xroad.xsd" xmlns:ns5="http://www.riik.ee/schemas/deccontainer/vers_2_1/" ns3:objectType="SERVICE">
  186. <ns3:xRoadInstance>'.$service['xRoadInstance'].'</ns3:xRoadInstance>
  187. <ns3:memberClass>'.$service['memberClass'].'</ns3:memberClass>
  188. <ns3:memberCode>'.$service['memberCode'].'</ns3:memberCode>
  189. <ns3:subsystemCode>'.$service['subsystemCode'].'</ns3:subsystemCode>
  190. <ns3:serviceCode>'.$service['serviceCode'].'</ns3:serviceCode>
  191. <ns3:serviceVersion>'.$service['serviceVersion'].'</ns3:serviceVersion>
  192. </ns4:service>
  193. </SOAP-ENV:Header>
  194. <SOAP-ENV:Body>
  195. <ns3:sendDocument xmlns:ns2="http://www.riik.ee/schemas/deccontainer/vers_2_1/" xmlns:ns3="http://dhx.x-road.eu/producer" xmlns:ns4="http://x-road.eu/xsd/identifiers" xmlns:ns5="http://x-road.eu/xsd/xroad.xsd">
  196. <ns3:DHXVersion>1.0</ns3:DHXVersion>
  197. <ns3:consignmentId>'.generateId(array(8,4,4,4,12)).'</ns3:consignmentId>
  198. <ns3:documentAttachment>cid:'.$attachment_id.'</ns3:documentAttachment>
  199. </ns3:sendDocument>
  200. </SOAP-ENV:Body>
  201. </SOAP-ENV:Envelope>';
  202.  
  203. $boundary='----=_Part_'.generateId(array(8,12));
  204. $documentAttachment='--'.$boundary."\n".
  205. 'Content-Type: text/xml; type="text/xml"; charset=utf-8'."\n".
  206. 'Content-ID: <soapPart>'."\n"."\n".
  207. $envelope."\n".
  208. '--'.$boundary."\n".
  209. 'Content-Type: text/xml; charset=UTF-8'."\n".
  210. 'Content-Encoding: gzip'."\n".
  211. 'Content-Transfer-Encoding: base64'."\n".
  212. 'Content-ID: <'.$attachment_id.'>'."\n"."\n".
  213. $attachment_base64_gzip."\n".
  214. '--'.$boundary.'--';
  215. //$documentAttachment=str_ireplace("\x0D","",$documentAttachment);//Remove ^M (Windows cariage return) if needed
  216.  
  217. $headers=array(
  218. 'MIME-Version: 1.0',
  219. 'Content-Type: Multipart/Related; start-info="text/xml"; type="text/xml"; start="<soapPart>"; charset="utf-8"; boundary="'.$boundary.'"',
  220. 'Cache-Control: no-cache',
  221. 'Pragma: no-cache',
  222. 'SOAPAction: ""',
  223. 'Content-length: '.strlen($documentAttachment)
  224. );
  225.  
  226. $ch=curl_init();
  227.  
  228. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
  229. curl_setopt($ch, CURLOPT_CAINFO, 'server.pem');
  230. curl_setopt($ch, CURLOPT_SSH_PRIVATE_KEYFILE, 'testKeystore.jks');
  231. curl_setopt($ch, CURLOPT_SSLCERT, 'server.pem');
  232. curl_setopt($ch, CURLOPT_SSLCERTPASSWD, "changeit");
  233. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
  234. curl_setopt($ch, CURLOPT_URL, $soapUrl);
  235. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  236. curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
  237. curl_setopt($ch, CURLOPT_TIMEOUT, 10);
  238. curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
  239. curl_setopt($ch, CURLOPT_POST, true);
  240. curl_setopt($ch, CURLOPT_POSTFIELDS, $documentAttachment);
  241. curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
  242. curl_setopt($ch, CURLINFO_HEADER_OUT, true);
  243. curl_setopt($ch, CURLOPT_HEADER, 1);
  244. curl_setopt($ch, CURLOPT_VERBOSE, true);
  245. curl_setopt($ch, CURLOPT_ENCODING, 'UTF-8');
  246.  
  247. $response=curl_exec($ch);
  248.  
  249. echo 'HTTP: '.curl_getinfo($ch, CURLINFO_HTTP_CODE).'<br>';
  250. echo '<h1>Header</h1>';
  251. echo '<pre style="padding:10px;margin:5px;background-color:greenyellow;white-space:pre-wrap;">'.htmlspecialchars(curl_getinfo($ch, CURLINFO_HEADER_OUT)).'</pre>';
  252. echo '<h1>Ümbrik</h1>';
  253. echo '<pre style="padding:10px;margin:5px;background-color:aquamarine;white-space:pre-wrap;">'.htmlspecialchars($documentAttachment).'</pre>';
  254.  
  255. $header_size=curl_getinfo($ch, CURLINFO_HEADER_SIZE);
  256. $header=substr($response, 0, $header_size);
  257. $body=substr($response, $header_size);
  258. echo '<h1>Soap headers</h1>';
  259. echo '<pre style="padding:10px;margin:5px;background-color:antiquewhite;white-space:pre-wrap;">';
  260. echo'</pre>';
  261.  
  262. if (!curl_errno($ch)) {
  263. $info=curl_getinfo($ch);
  264. echo 'Took ', $info['total_time'], ' seconds to send a request to ', $info['url'], "\n";
  265. }
  266.  
  267. echo '<h1>Vastus</h1>';
  268. echo '<pre style="padding:10px;margin:5px;background-color:yellow;white-space:pre-wrap;">'.htmlspecialchars($response).'</pre>';
  269.  
  270. echo '<h1>Kapsel/Manus/capsule</h1>';
  271. echo '<pre>'.htmlspecialchars(base64_decode($attachment_base64_gzip)).'</pre>';
  272.  
  273. function generateId($set){
  274. $id=array();
  275. $letters=array('0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','A','B','C','D','E','F');
  276. $lc=count($letters)-1;
  277. foreach($set as $v){
  278. $str='';
  279. for($i=0;$i<$v;$i++){
  280. $str.=$letters[rand(0,$lc)];
  281. }
  282. array_push($id,$str);
  283. }
  284. return implode('-',$id);
  285. }
  286.  
  287. function generateNumberId($l){
  288. $letters=array('0','1','2','3','4','5','6','7','8','9');
  289. $str='';
  290. $lc=count($letters)-1;
  291. for($i=0;$i<$l;$i++){
  292. $str.=$letters[rand(0,$lc)];
  293. }
  294. return $str;
  295. }
  296.  
  297. ?>

Add new comment

Restricted HTML

  • Allowed HTML tags: <a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • Lines and paragraphs break automatically.
  • Web page addresses and email addresses turn into links automatically.
CAPTCHA
Enter the characters shown in the image.

neanky logo Neanky uudised

Taevas oli näha virmalisi.

Jätka lugemist →

Raadio. Eesti raadiojaamad Windows rakendus. Kõik parimad Eesti raadiojaamad ühes rakenduses. Kuula kõikjal maailmas. Raadio kuulamine.

Jätka lugemist →

Neanky tutvumine on turvaline ja mõeldud kõigile. Eestis asuv ja eestlastele mõeldud võrgustik. Lisa oma kuulutus ja leia kaaslane. Ei mingeid lepinguid.

Jätka lugemist →

Eesti parimad supluskohad. Kus on parim rand või mõnusam vesi? Kus käid sina suvel suplemas.

Jätka lugemist →

Osalesid Eestis toimuval üritusel ja tegid seal ka pilte? Saada need fotod meie uudistele koos arvustuse või lisainfoga üritusest.

Jätka lugemist →

Sõnala sõnamäng

06.05.2024

Sõnala sõnamäng on uus ja hariv sõnamäng. Eestikeelsed sõnad, sõna arvamisel seletavad sõnastikud. Järjest ette antavate tähtede järgi tuleb moodustada sõnad.

Jätka lugemist →

Saada oma vihje ja fotod uudisest. Lisa oma uudis või loe teiste lisatud uudiseid. Eesti kohalikud uudised. Proovi ajakirjaniku ametit. Reklaami oma toodet.

Jätka lugemist →

DPD nimel levib petukiri. Re: Pakk saadaval kohaletoimetamiseks. Tollimaks tasuda 24h jooksul. PETUKIRI!

Jätka lugemist →

Soojuspump

02.05.2024

2023/2024 väga külmal ja korralikul talvel jäi õhksoojuspumbaga kolmetoalise vana erilise soojustuseta maja kütmine 75-100 € juurde. Eriti külm ja kalli elektrihinnaga jaanuar oli 150 €. Üldiselt on õhksoojuspump puiduga kütmisest odavam.

Jätka lugemist →

Kuidas Sul läheb?

02.05.2024

Kas kõigil on viimasel ajal väga palju tööd ja tegemist või on see vaid mul nii?

Jätka lugemist →

Soovitame üritusi

02.05.2024

Suvine hooaeg on avatud, aga kusagile ei oska minna. Ürituste reklaame pole näinud ega tea, mis kusagil toimub. Soovitame häid ja huvitavaid üritusi, mida võiks külastada. Etendused, kontserdid, näitused, võistlused, koolitused jne.

Jätka lugemist →

22. aprilli hommikul oli maa lumest valge ja lund sadas aina juurde. Taas oli talv tagasi. 23. aprill talv kestab. Lund maas 2-3cm. Õhutemperatuur -2 kuni 1 kraadi. Ilmateade lubab 24ndal 8 kraadi sooja ja lõpuks peaks talv läbi saama.

Jätka lugemist →

Eestis on veel peale Maksekeskuse ja Montonio pangalinkide pakkujaid. LHV pank pakub koostöös EveryPayga pangalinke e-poodidele ja lisaks ka kõiki muidu makselahendusi. Kahjuks on vaid võimatu tuvastada nende hinnakirja. Pole teada palju kuumakse on ja palju tehingu pealt teenustasu võtavad. Info on väga vähene. Dokumentatsioon arendajale on nähtav ja lihtsasti mõistetav. Lisaks ühendub kõigi levinumate e-poe moodulitega. Esto pakub lisaks pangalinkidele laene ja järelmaksu. Nende hinnakiri on ka peidetud või salajane. Tehingutasu näitab 0.00 €

Jätka lugemist →

Kas jood piima?

11.04.2024

Joon küll piima; piim on hea; lehmadel on samuti hea; kui keegi ei jooks piima, siis ei oleks ka lehmi!

Jätka lugemist →

Kui sind huvitab laiemalt rahva arvamus mõnes küsimuses, siis soovita seda siia. Me lisame selle oma külastajatele vastata ja tulemust on hiljem kõigile näha. Küsimus peab olema sobilik igas vanuses vastajale ja ei tohi olla solvav. 2-10 vastusevarianti.

Jätka lugemist →

1. Isamaa - 34.1% (15 häält)2. EKRE - 29.5% (13 häält)3. Ei oma eelistust - 13.6% (6 häält)4. Reformierakond - 11.4% (5 häält)5. Midagi muud - 6.8% (3 häält)6. SDE - 2.3% (1 häält)7. Rohelised - 2.3% (1 häält)8. Eesti 200 - 0% (0 häält)9. Keskerakond - 0% (0 häält)10. Parempoolsed - 0% (0 häält)Vastanuid kokku: 44

Jätka lugemist →

Mõned päevad on nüüd taas tunda olnud halba aega. Kõik tegemised ebaõnnestuvad ja olemine on kuidagi kehva. Kohe kuidagi ei lähe. Maailmas toimub aina hulle asju ja ilm on ka halb olnud. Virmalised, täiskuu ja mida kõike veel. Kas tunnete ka midagi veidralt halba?

Jätka lugemist →