/** * Método que firma una semilla previamente obtenida * @param seed Semilla obtenida desde SII * @param Firma objeto de la Firma electrónica o arreglo con configuración de la misma * @return Solicitud de token con la semilla incorporada y firmada * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl) * @version 2015-09-17 */ private static function getTokenRequest($seed, $Firma = []) { if (is_array($Firma)) { $Firma = new \sasco\LibreDTE\FirmaElectronica($Firma); } $seedSigned = $Firma->signXML((new \sasco\LibreDTE\XML())->generate(['getToken' => ['item' => ['Semilla' => $seed]]])->saveXML()); if (!$seedSigned) { \sasco\LibreDTE\Log::write(\sasco\LibreDTE\Estado::AUTH_ERROR_FIRMA_SOLICITUD_TOKEN, \sasco\LibreDTE\Estado::get(\sasco\LibreDTE\Estado::AUTH_ERROR_FIRMA_SOLICITUD_TOKEN)); return false; } return $seedSigned; }
/** * Acción que permite al usuario agregar una nueva firma electrónica * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl) * @version 2015-09-22 */ public function agregar() { if (isset($_POST['submit'])) { // verificar que se haya podido subir el archivo con la firma if (!isset($_FILES['firma']) or $_FILES['firma']['error']) { \sowerphp\core\Model_Datasource_Session::message('Ocurrió un error al subir la firma', 'error'); return; } // cargar firma $data = file_get_contents($_FILES['firma']['tmp_name']); try { $Firma = new \sasco\LibreDTE\FirmaElectronica(['data' => $data, 'pass' => $_POST['contrasenia']]); } catch (\sowerphp\core\Exception $e) { \sowerphp\core\Model_Datasource_Session::message($e->getMessage(), 'error'); return; } // si todo fue ok se crea el objeto firma para la bd y se guarda $FirmaElectronica = new Model_FirmaElectronica($Firma->getID()); $FirmaElectronica->nombre = $Firma->getName(); $FirmaElectronica->email = $Firma->getEmail(); $FirmaElectronica->desde = $Firma->getFrom(); $FirmaElectronica->hasta = $Firma->getTo(); $FirmaElectronica->emisor = $Firma->getIssuer(); $FirmaElectronica->usuario = $this->Auth->User->id; $FirmaElectronica->archivo = base64_encode($data); $FirmaElectronica->contrasenia = \website\Dte\Utility_Data::encrypt($_POST['contrasenia']); try { $FirmaElectronica->save(); \sowerphp\core\Model_Datasource_Session::message('Se asoció la firma electrónica de ' . $Firma->getName() . ' (' . $Firma->getID() . ') al usuario ' . $this->Auth->User->usuario, 'ok'); $this->redirect('/dte/admin/firma_electronicas'); } catch (\sowerphp\core\Exception_Model_Datasource_Database $e) { \sowerphp\core\Model_Datasource_Session::message('Ocurrió un error al guardar la firma.<br/>' . $e->getMessage(), 'error'); return; } } }
* Debería haber recibido una copia de la Licencia Pública General GNU * junto a este programa. * En caso contrario, consulte <http://www.gnu.org/licenses/gpl.html>. */ /** * @file 019-firma_datos.php * * Ejemplo que muestra como obtener los datos de la persona dueña de la firma * electrónica * * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl) * @version 2015-09-22 */ // respuesta en texto plano header('Content-type: text/plain'); // incluir archivos php de la biblioteca y configuraciones include 'inc.php'; // objeto de la firma $Firma = new \sasco\LibreDTE\FirmaElectronica($config['firma']); // mostrar datos de la persona dueña de la firma echo 'RUN : ', $Firma->getID(), "\n"; echo 'Nombre : ', $Firma->getName(), "\n"; echo 'Email : ', $Firma->getEmail(), "\n"; echo 'Desde : ', $Firma->getFrom(), "\n"; echo 'Hasta : ', $Firma->getTo(), "\n"; echo 'Emisor : ', $Firma->getIssuer(), "\n\n\n"; print_r($Firma->getData()); // si hubo errores mostrar foreach (\sasco\LibreDTE\Log::readAll() as $error) { echo $error, "\n"; }
/** * Acción para firmar un XML * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl) * @version 2015-11-09 */ public function firmar_xml() { if (isset($_POST['submit'])) { $xml = file_get_contents($_FILES['xml']['tmp_name']); // obtener nombre del tag y del ID $XML = new \sasco\LibreDTE\XML(); $XML->loadXML($xml); foreach ($XML->documentElement->childNodes as $child) { if ($child instanceof \DOMElement) { $tag = $child->tagName; $id = $child->getAttribute('ID'); break; } } // firmar $Firma = new \sasco\LibreDTE\FirmaElectronica(['file' => $_FILES['firma']['tmp_name'], 'pass' => $_POST['contrasenia']]); $xmlSigned = $Firma->signXML($xml, $id, $tag); // entregar datos ob_end_clean(); header('Content-Type: application/xml; charset=' . $XML->encoding); header('Content-Length: ' . strlen($xmlSigned)); header('Content-Disposition: attachement; filename="' . $id . '_firmado.xml"'); print $xmlSigned; exit; } }
/** * Método que permite generar un libro de Compras o Ventas a partir de un * archivo CSV con el detalle del mismo * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl) * @version 2015-10-05 */ public function generar_libro() { // si no se viene por post terminar if (!isset($_POST['submit'])) { return; } // verificar campos no estén vacíos $campos = ['TipoOperacion', 'RutEmisorLibro', 'PeriodoTributario', 'FchResol', 'NroResol', 'TipoLibro', 'TipoEnvio', 'FolioNotificacion', 'contrasenia']; foreach ($campos as $campo) { if (empty($_POST[$campo])) { \sowerphp\core\Model_Datasource_Session::message($campo . ' no puede estar en blanco', 'error'); return; } } // si no se pasó el archivo error if (!isset($_FILES['archivo']) or $_FILES['archivo']['error']) { \sowerphp\core\Model_Datasource_Session::message('Debes enviar el archivo CSV con el detalle de las compras o ventas al que deseas generar su XML', 'error'); return; } // si no se pasó la firma error if (!isset($_FILES['firma']) or $_FILES['firma']['error']) { \sowerphp\core\Model_Datasource_Session::message('Debes enviar el archivo con la firma digital', 'error'); return; } // Objeto de la Firma try { $Firma = new \sasco\LibreDTE\FirmaElectronica(['data' => file_get_contents($_FILES['firma']['tmp_name']), 'pass' => $_POST['contrasenia']]); } catch (\Exception $e) { \sowerphp\core\Model_Datasource_Session::message('No fue posible abrir la firma digital, quizás contraseña incorrecta', 'error'); return; } // generar caratula del libro $caratula = ['RutEmisorLibro' => str_replace('.', '', $_POST['RutEmisorLibro']), 'RutEnvia' => $Firma->getID(), 'PeriodoTributario' => $_POST['PeriodoTributario'], 'FchResol' => $_POST['FchResol'], 'NroResol' => $_POST['NroResol'], 'TipoOperacion' => $_POST['TipoOperacion'], 'TipoLibro' => $_POST['TipoLibro'], 'TipoEnvio' => $_POST['TipoEnvio'], 'FolioNotificacion' => $_POST['FolioNotificacion']]; // definir si es certificacion $caratula_certificacion = ['COMPRA' => ['PeriodoTributario' => 2000, 'FchResol' => '2006-01-20', 'NroResol' => 102006, 'TipoLibro' => 'ESPECIAL', 'TipoEnvio' => 'TOTAL', 'FolioNotificacion' => 102006], 'VENTA' => ['PeriodoTributario' => 1980, 'FchResol' => '2006-01-20', 'NroResol' => 102006, 'TipoLibro' => 'ESPECIAL', 'TipoEnvio' => 'TOTAL', 'FolioNotificacion' => 102006]]; $certificacion = true; foreach ($caratula_certificacion[$caratula['TipoOperacion']] as $attr => $val) { if ($caratula[$attr] != $val or $attr == 'PeriodoTributario' and substr($caratula[$attr], 0, 4) != $val) { $certificacion = false; break; } } // generar libro de compras o venta $LibroCompraVenta = new \sasco\LibreDTE\Sii\LibroCompraVenta(); if ($caratula['TipoOperacion'] === 'COMPRA') { $LibroCompraVenta->agregarComprasCSV($_FILES['archivo']['tmp_name']); } else { $LibroCompraVenta->agregarVentasCSV($_FILES['archivo']['tmp_name']); } $LibroCompraVenta->setCaratula($caratula); if (!$certificacion) { $LibroCompraVenta->setFirma($Firma); } $xml = $LibroCompraVenta->generar($caratula['TipoOperacion'] == 'COMPRA'); if (!$certificacion and !$LibroCompraVenta->schemaValidate()) { \sowerphp\core\Model_Datasource_Session::message(implode('<br/>', \sasco\LibreDTE\Log::readAll()), 'error'); return; } // descargar XML $file = TMP . '/' . $LibroCompraVenta->getID() . '.xml'; file_put_contents($file, $xml); \sasco\LibreDTE\File::compress($file, ['format' => 'zip', 'delete' => true]); exit; }
* Consulte los detalles de la Licencia Pública General GNU para obtener * una información más detallada. * * Debería haber recibido una copia de la Licencia Pública General GNU * junto a este programa. * En caso contrario, consulte <http://www.gnu.org/licenses/gpl.html>. */ /** * @file 019-firma_datos.php * * Ejemplo que muestra como obtener los datos de la persona dueña de la firma * electrónica * * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl) * @version 2015-09-16 */ // respuesta en texto plano header('Content-type: text/plain'); // incluir archivos php de la biblioteca y configuraciones include 'inc.php'; // objeto de la firma $Firma = new \sasco\LibreDTE\FirmaElectronica($config['firma']); // mostrar datos de la persona dueña de la firma echo 'RUN : ', $Firma->getID(), "\n"; echo 'Nombre : ', $Firma->getName(), "\n"; echo 'Email : ', $Firma->getEmail(), "\n\n"; print_r($Firma->getData()); // si hubo errores mostrar foreach (\sasco\LibreDTE\Log::readAll() as $error) { echo $error, "\n"; }
* publicada por la Fundación para el Software Libre, ya sea la versión * 3 de la Licencia, o (a su elección) cualquier versión posterior de la * misma. * * Este programa se distribuye con la esperanza de que sea útil, pero * SIN GARANTÍA ALGUNA; ni siquiera la garantía implícita * MERCANTIL o de APTITUD PARA UN PROPÓSITO DETERMINADO. * Consulte los detalles de la Licencia Pública General GNU para obtener * una información más detallada. * * Debería haber recibido una copia de la Licencia Pública General GNU * junto a este programa. * En caso contrario, consulte <http://www.gnu.org/licenses/gpl.html>. */ /** * @file 006-verificarFirmaXML.php * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl) * @version 2015-09-16 */ // respuesta en texto plano header('Content-type: text/plain'); // incluir archivos php de la biblioteca y configuraciones include 'inc.php'; // verificar firma $xml_data = file_get_contents('xml/archivoFirmado.xml'); $FirmaElectronica = new \sasco\LibreDTE\FirmaElectronica($config['firma']); var_dump($FirmaElectronica->verifyXML($xml_data, 'SetDTE')); // si hubo errores mostrar foreach (\sasco\LibreDTE\Log::readAll() as $error) { echo $error, "\n"; }