Buenos días,
Me acabo de poner con la programación en php para el envío de XML a TBAI a Gipuzkoa.
Estoy utilizando el código que sugerís a continuación y recibo en todo momento el siguiente error:
"
No se puede conectar con la TBAI GIP.
Error: unable to use client certificate (no key found or wrong pass phrase?)
Respuesta de la TBAI GIP: 312
"
Tengo un certificado pfx, el cual indico en la línea de declaración del CURLOPT_SSLCERT y añado la siguiente linea:
curl_setopt($soap_do, CURLOPT_SSLCERTPASSWD, $pass);
Si utilizo una conexión más sencilla, como la que indico a continuación, recibo el siguiente error:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $server);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 100);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $requestXML);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
ERROR:
"
01
Rechazado
Baztertua
001
Error: No se ha utilizado certificado de cliente.
Errorea: Ez da erabili bezeroaren ziurtagiririk.
"
Muchísimas gracias por vuestra ayuda.
Cita:
Empezado por bilbur
Os adjunto lo que tengo hecho para el envío a Gipuzkoa
Este envío es el más sencillo
Más o menos lo que hago es: - Proceso previo o simultáneo a la emisión y firma de la factura
- En el directorio donde están las facturas firmadas, creo, si no están, los directorios de Envios y Respuestas.
- Si la factura firmada existe en el directorio de facturas firmadas, la envío a TBAI GIP
- Me guardo la respuesta y si es afirmativa muevo la factura firmada al directorio de Envios
<div>
Código PHP:
if($hacienda_foral == 'GIP' && $orden_tbai != '000000') { $directorio_TBAI = $originales."TBAI/".$cif_340."/"; $directorio_TBAI_envios = $originales."TBAI/".$cif_340."/Envios/"; if (!is_dir($directorio_TBAI_envios)) mkdir($directorio_TBAI_envios, 0777); $directorio_respuestas = $directorio_TBAI.'Respuestas/'; if (!is_dir($directorio_respuestas)) mkdir($directorio_respuestas, 0777);
$estado_tbai = ''; $xml_enviado_tbai = $orden_tbai.'.xsig'; $guardado_enviar_tbai = $directorio_TBAI.$xml_enviado_tbai; if (file_exists($guardado_enviar_tbai)) { $estado_tbai = 'No enviado'; $descripcion_TBAI = $estado_tbai; $xml = file_get_contents($guardado_enviar_tbai);
$header_soap = array( "Content-Type: application/xml;charset=utf-8", "Accept: application/xml", "Content-length: ".strlen($xml) );
$soap_do = curl_init(); curl_setopt($soap_do, CURLOPT_URL, $url_TBAI ); curl_setopt($soap_do, CURLOPT_CONNECTTIMEOUT, 100); curl_setopt($soap_do, CURLOPT_TIMEOUT, 100); curl_setopt($soap_do, CURLOPT_RETURNTRANSFER, true); curl_setopt($soap_do, CURLOPT_FOLLOWLOCATION, true); curl_setopt($soap_do, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($soap_do, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($soap_do, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)'); curl_setopt($soap_do, CURLOPT_POST, true ); curl_setopt($soap_do, CURLOPT_SSLCERT, getcwd().'/_certificandos'.$alias_pdf.'/'.$cif_340.'.pem' ); curl_setopt($soap_do, CURLOPT_POSTFIELDS, $xml); curl_setopt($soap_do, CURLOPT_HTTPHEADER, $header_soap);
$response = curl_exec($soap_do); if(!curl_exec($soap_do)) { $err = 'Error: ' . curl_error($soap_do); curl_close($soap_do); echo "<br>No se puede conectar con la TBAI GIP.<br><br>"; print_r($err); echo "<br>"; echo "<br><b>Respuesta de la TBAI GIP: 312</b><br><br>"; print_r($response); } else { curl_close($soap_do);
$response = preg_replace('/(<\s*)\w+:/','$1',$response); // removes <xxx: $response = preg_replace('/(<\/\s*)\w+:/','$1',$response); // removes </xxx: $response = preg_replace('/\s+xmlns:[^>]+/','',$response); // removes xmlns:...
$use_errors = libxml_use_internal_errors(true); $parser = simplexml_load_string($response); if ($parser === false) { echo "<br>No se puede cargar el fichero xml devuelto por la TBA GIP.<br><br>"; echo "<br>"; echo "<br><b>Respuesta de la TBAI GIP:</b><br><br>"; print_r($response); } libxml_clear_errors(); libxml_use_internal_errors($use_errors); if ($parser === false) exit(); $parser->asXML($directorio_respuestas.$orden_tbai.'.xml'); }
$facturas_en_TBAI = $parser; if ($facturas_en_TBAI === false) { echo "<br><b>Respuesta de TBAI parser:</b><br><br>"; print_r ($facturas_en_TBAI); } $guardado_enviado_tbai = $directorio_TBAI_envios.$xml_enviado_tbai; $nodo = $facturas_en_TBAI->Salida; $Estado = $nodo->Estado; if($Estado == '00') rename($guardado_enviar_tbai,$guardado_enviado_tbai); /// atencion a esto unset($facturas_en_TBAI); } } // if($hacienda_foral == 'GIP')
</div>Aparte tengo un script para visualizar la respuesta
En este lo más interesante puede ser la generación de la url del mensaje TBAI para verlo como si se tratara del código QR
Código PHP:
<?php
$directorio_respuestas = $directorio_TBAI.'Respuestas/'; if (!is_dir($directorio_respuestas)) mkdir($directorio_respuestas, 0777); $directorio_envios = $directorio_TBAI.'Envios/'; if (!is_dir($directorio_envios)) mkdir($directorio_envios, 0777); $estado_tbai = '';
$xml_enviado_tbai = $orden_tbai.'.xsig'; $guardado_enviado_tbai = $directorio_envios.$xml_enviado_tbai; if (file_exists($guardado_enviado_tbai)) $estado_tbai = 'Enviado'; else $estado_tbai = 'No enviado'; $descripcion_TBAI = $estado_tbai;
if($estado_tbai == 'Enviado') { $msg_TBAI = ''; $xml_actual_enviado = simplexml_load_file($guardado_enviado_tbai); $signatureNodeActual = $xml_actual_enviado->children('ds', true)->Signature; $SignatureValueFirmaFacturaActual = $signatureNodeActual->SignatureValue; $SignatureValueFirmaFacturaActual = substr($SignatureValueFirmaFacturaActual,0,13); $factura_tbai_serie = $xml_actual_enviado->Factura->CabeceraFactura->SerieFactura; $factura_tbai_numero = $xml_actual_enviado->Factura->CabeceraFactura->NumFactura; $factura_tbai_fecha = $xml_actual_enviado->Factura->CabeceraFactura->FechaExpedicionFactura; $factura_tbai_fecha_dd = substr($factura_tbai_fecha,0,2); $factura_tbai_fecha_mm = substr($factura_tbai_fecha,3,2); $factura_tbai_fecha_aa = substr($factura_tbai_fecha,-2); $factura_tbai_importe = $xml_actual_enviado->Factura->DatosFactura->ImporteTotalFactura; $TBAIID = 'TBAI'.$caracterSeparador.$cif_340.$caracterSeparador.$factura_tbai_fecha_dd; $TBAIID .= $factura_tbai_fecha_mm.$factura_tbai_fecha_aa.$caracterSeparador; $TBAIID .= $SignatureValueFirmaFacturaActual.$caracterSeparador; $TBAIID = utf8_encode($TBAIID); $cod_crc8 = crc8($TBAIID); $TBAIID = $TBAIID.$cod_crc8; unset($xml_actual_enviado); $msg_TBAI = $url_TBAI_QR.'?id='.$TBAIID.'&s='.$factura_tbai_serie.'&nf='.$factura_tbai_numero.'&i='.$factura_tbai_importe; $msg_TBAI = utf8_encode($msg_TBAI); $cod_crc8 = crc8($msg_TBAI); $msg_TBAI = $msg_TBAI.'&cr='.$cod_crc8; $xml_respuesta = $orden_tbai.'.xml'; $guardado_respuesta = $directorio_respuestas.$xml_respuesta; if (file_exists($guardado_respuesta)) { $respuesta_tbai = simplexml_load_file($guardado_respuesta); if ($respuesta_tbai === false) { $estado_tbai = 'No se puede leer la respuesta de TBAI'; } else { $estado_tbai = 'Existe respuesta de TBAI'; } } else { $estado_tbai = 'No se encuentra la respuesta de TBAI'; $sin_respuesta_tbai = '<?xml version="1.0" encoding="UTF-8"?>'; $sin_respuesta_tbai .= '<Salida></Salida>'; $respuesta_tbai = simplexml_load_string($sin_respuesta_tbai); } $descripcion_TBAI = $estado_tbai;
$nodo = $respuesta_tbai->Salida; $Estado = $nodo->Estado; $FechaRecepcion = $nodo->FechaRecepcion;
if($Estado == '00') { $IdentificadorTBAI = $nodo->IdentificadorTBAI; $Descripcion = $nodo->Descripcion; $Descripcion = utf8_decode($Descripcion); $CSV_tbai = 'CSV: '.$nodo->CSV; $ResultadosValidacion = $nodo->ResultadosValidacion; $CodigoRV = $ResultadosValidacion->Codigo; if($CodigoRV) $DescripcionRV = $errores_envio_TBAI["$CodigoRV"]; $estado_tbai = 'Correcto'; $descripcion_TBAI = $estado_tbai.': '.$IdentificadorTBAI.' '.$FechaRecepcion.' '.$Descripcion.' '.$CSV_tbai; if($CodigoRV) { $descripcion_TBAI .= ' '.$CodigoRV.' '.$DescripcionRV; $estado_tbai = 'Aviso'; } } if($Estado == '01') { $ResultadosValidacion = $nodo->ResultadosValidacion; $CodigoRV = $ResultadosValidacion->Codigo; $DescripcionRV = $errores_envio_TBAI["$CodigoRV"]; if(substr($DescripcionRV,0,5) == 'Aviso' || $CodigoRV == '005' ) $estado_tbai = 'Aviso'; else $estado_tbai = 'Rechazado'; $descripcion_TBAI = $estado_tbai.': '.$FechaRecepcion.' '.$CodigoRV.' '.$DescripcionRV; } unset($respuesta_tbai); } // enviado
Tengo, si interesa, la generación del código QR para PDF con la libreria fpdf.
Comentamos ...
|