Al parecer el xml se tiene que pasar como esta, sin hacerle ninguna conversión.
Este código es el que me funciona. Lleva una semana en pruebas y puede no ser el mejor código, pero cumple su objetivo.
Código PHP:
<?php
//Funcion que hace el curl
function download_page($url,$xml){
$url = 'https://sis.sermepa.es/sis/operaciones';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "entrada=$xml");
curl_setopt($ch, CURLOPT_FAILONERROR,1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
//End funcion que hace el curl
//...
$firma_comercio = sha1($Valor_Cuota.$Order_Id.$Codigo_Comercio.'978'.'6'.$Clave_Comercio);
$xml = "<DATOSENTRADA>";
$xml .= "<DS_VERSION>0.1</DS_VERSION>";
$xml .= "<DS_MERCHANT_CURRENCY>978</DS_MERCHANT_CURRENCY>";
$xml .= "<DS_MERCHANT_MERCHANTURL>$Url</DS_MERCHANT_MERCHANTURL>";
$xml .= "<DS_MERCHANT_TRANSACTIONTYPE>6</DS_MERCHANT_TRANSACTIONTYPE>";
$xml .= "<DS_MERCHANT_MERCHANTDATA>Freshvana+Orden+No+$Order_Id</DS_MERCHANT_MERCHANTDATA>";
$xml .= "<DS_MERCHANT_AMOUNT>$Valor_Cuota</DS_MERCHANT_AMOUNT>";
$xml .= "<DS_MERCHANT_MERCHANTNAME>Freshvana</DS_MERCHANT_MERCHANTNAME>";
$xml .= "<DS_MERCHANT_MERCHANTSIGNATURE>$firma_comercio</DS_MERCHANT_MERCHANTSIGNATURE>";
$xml .= "<DS_MERCHANT_TERMINAL>1</DS_MERCHANT_TERMINAL>";
$xml .= "<DS_MERCHANT_MERCHANTCODE>$Codigo_Comercio</DS_MERCHANT_MERCHANTCODE>";
$xml .= "<DS_MERCHANT_ORDER>$Order_Id</DS_MERCHANT_ORDER>";
$xml .= "</DATOSENTRADA>";
$the_string .= "Fecha: ".$thedate."\n";
$the_string .= "Hora: ".date('H:i:s')."\n";
$the_string .= 'THE XML'."\n";
$the_string .= $xml."\n";
$url = 'https://sis.sermepa.es/sis/operaciones';
$sXML = download_page($url,$xml);
$oXML = new SimpleXMLElement($sXML);
//The service response code
echo '<br><xmp>'.$sXML.'</xmp>';
$arryaOxml = get_object_vars($oXML);
$codigo = $arryaOxml['CODIGO'];
$arrayOperacion = get_object_vars($oXML->OPERACION);
if(isset($arrayOperacion['Ds_Response']))
$respuesta = $arrayOperacion['Ds_Response'];
if(isset($arrayOperacion['Ds_Response']) && (int)$codigo == 0 && (int)$respuesta == 0 ){
$string_to_save = 'Operacion exitosa.';
$status = 1;
}elseif(isset($arrayOperacion['Ds_Response']) && (int)$respuesta == 190){
$string_to_save = 'Operacion denegada por el banco.';
$status = 0;
}else{
$string_to_save = 'Error en la operacion: '.$codigo;
$status = 0;
}
?>