Para enviar (es código C++, que es el lenguaje que uso, aunque su traducción a Pascal/Delphi no el muy complicada porque la estructura es la misma, aunque su sintaxis difiera un poco:
Código PHP:
CkRest rest;
CkSocket socket;
success = socket.SetSslClientCertPfx("d:\\xxx.pfx","xxxxxxxxxx");
if (success != true) {std::cout << socket.lastErrorText() << "\r\n"; return;}
bool bTls = true;
int port = 443;
int maxWaitMs = 5000;
success = socket.Connect("pruesarrerak.bizkaia.eus",port,bTls,maxWaitMs);
if (success != true)
{
std::cout << "Connect Failure Error Code: " << socket.get_ConnectFailReason() << "\r\n";
std::cout << socket.lastErrorText() << "\r\n";
return;
}
bool bAutoReconnect = true;
// Use the connection:
success = rest.UseConnection(socket,bAutoReconnect);
if (success != true) {std::cout << rest.lastErrorText() << "\r\n"; return;}
CString jsn="{\"con\":\"LROE\",\"apa\":\"1.1\",\"inte\":{\"nif\":\"XXXXXXXXXX\",\"nrs\":\"XXXXXXXXXX\"},\"drs\":{\"mode\":\"140\",\"ejer\":\"2020\"}}";
cTexto dat=cFicheroBase::Leer("D:\\Ejemplo_LROE_140.xml").Texto();
rest.put_Utf8(SI);
rest.AddHeader("Accept-Encoding","gzip");
rest.AddHeader("Content-Encoding","gzip");
rest.AddHeader("Content-Type","application/octet-stream");
rest.AddHeader("eus-bizkaia-n3-version","1.0");
rest.AddHeader("eus-bizkaia-n3-content-type","application/xml");
rest.AddHeader("eus-bizkaia-n3-data",jsn);
int rst=rest.SendReqStringBody("POST","/N3B4000M/aurkezpena",dat);
rst=rest.ReadResponseHeader();
cchar *cr=rest.responseHeader();
CkByteData rb;
rst=rest.ReadRespBodyBinary(rb);
const uchar *dta=rb.getData();
int lng=rb.getSize();
cBinario rb2(dta,lng);
rb2=cCompresion::Descomprimir::Gzip(rb2);
return;
Hay que tener en cuenta que la librería chilkat reconoce la cabecera 'Content-Encoding: gzip" y COMPRIME el envío y DESCOMPRIME la respuesta, que, a su vez, está comprimida, por lo que habrá que descomprimirla.
Los certificados no solo pueden cargarse de pfx, sino también del almacén de Windows o usar uno cargado anteriormente