function validaXML($cadena_xml = "", $validaSAT = true) { $r = array('success' => true, 'numCtaPago' => "", 'error' => '', 'xml' => ''); if (trim($cadena_xml) == "") { $r['success'] = false; $r['error'] = 'XML vacio'; } $xml = new DOMDocument(); // $ctx = stream_context_create([ // 'ssl' => [ // 'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT | STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT, // ], // ]); $archivo_esquema = 'res/xml/cfdv32.xsd'; $esquema = file_get_contents($archivo_esquema, false); // Validamos solamente la estructura del XML para ver si cumple con la estructura del SAT if ($cadena_xml !== false) { $datos = array("rfc_emisor" => "", "rfc_receptor" => "", "total" => "", "uuid" => ""); $xml->loadXML($cadena_xml); // establecer el gestor de errores definido por el usuario $gestor_errores_antiguo = set_error_handler("miGestorDeErrores"); $error = $xml->schemaValidateSource($esquema); //$error = true; // Reestablecemos el gestor de errores definido por el sistema restore_error_handler(); if ($error == false || is_string($error) || is_array($error) && $error['success'] == false) { $r['success'] = false; $msg = is_array($error) || is_string($error) ? "" . $error['errstr'] : "El archivo XML no cumple con la estructura del CFDI del SAT."; $r['error'] = "XML con formato incorrecto.<br><br>" . $msg; } else { $array = XML2Array::createArray($cadena_xml); $r['xml'] = $array; $error = array(); if (isset($array) && $array != false && count($array) > 0) { if (!valid_rfc($array['cfdi:Comprobante']['cfdi:Emisor']['@attributes']['rfc'])) { $error[] = "RFC del emisor invalido"; $r['success'] = false; } else { $r['rfc_emisor'] = $datos['rfc_emisor'] = $array['cfdi:Comprobante']['cfdi:Emisor']['@attributes']['rfc']; } if (!valid_rfc($array['cfdi:Comprobante']['cfdi:Receptor']['@attributes']['rfc'])) { $error[] = "RFC del receptor inválido"; $r['success'] = false; } else { $r['rfc_receptor'] = $datos['rfc_receptor'] = $array['cfdi:Comprobante']['cfdi:Receptor']['@attributes']['rfc']; } if (isset($array['cfdi:Comprobante']['@attributes']['NumCtaPago']) && $array['cfdi:Comprobante']['@attributes']['NumCtaPago']) { $r['numCtaPago'] = $array['cfdi:Comprobante']['@attributes']['NumCtaPago']; } if (isset($array['cfdi:Comprobante']['@attributes']['total']) && $array['cfdi:Comprobante']['@attributes']['total']) { $datos['total'] = $array['cfdi:Comprobante']['@attributes']['total']; } else { //$datos['total'] = 0; $error[] = "La factura no tiene importe de TOTAL"; $r['success'] = false; } $datos['uuid'] = $array['cfdi:Comprobante']['cfdi:Complemento']['tfd:TimbreFiscalDigital']['@attributes']['UUID']; if (isset($array['cfdi:Comprobante']['cfdi:Complemento']['tfd:TimbreFiscalDigital']['@attributes']['UUID']) && $array['cfdi:Comprobante']['cfdi:Complemento']['tfd:TimbreFiscalDigital']['@attributes']['UUID']) { $datos['uuid'] = $array['cfdi:Comprobante']['cfdi:Complemento']['tfd:TimbreFiscalDigital']['@attributes']['UUID']; } else { $error[] = "La factura no tiene UUID"; $r['success'] = false; } if ($r['success'] && $validaSAT === true) { //$t = json_encode(array('success' => true, 'mensaje' => 'Validando con el SAT')); $sat = validarXMLenSAT($datos); if (substr($sat['CodigoEstatus'], 0, 1) == "N") { $error[] = "El SAT reporta: " . $sat['CodigoEstatus'] . "<br>Estado: " . $sat['Estado']; $r['success'] = false; } } $r['error'] = ""; if (count($error) > 0) { $r['error'] = implode("<br><br><br>", $error); } } } } return $r; }
function validaRFC($str) { $this->load->helper("class_form"); if (!valid_rfc($str)) { $this->form_validation->set_message('validaRFC', 'El RFC no posee una sintaxis correcta'); return FALSE; } else { return TRUE; } }