sifei/timbrado-soap-client

There is no license information available for the latest version (1.1.4) of this package.

SOAP WS client. Cliente de servicio web de Sifei para timbrado y cancelacion basado en SOAP

1.1.4 2021-12-30 22:29 UTC

This package is auto-updated.

Last update: 2025-04-29 01:02:21 UTC


README

Ejemplos de timbrado y cancelación en PHP

Este repositorio incluye en ejemplos de los servicios SOAP de timbrado y cancelación de Sifei en en lenguaje PHP.

Configuración de ejemplos

Los ejemplos se alimentan de un archivo config.ini para leer los datos de conexión, No hacer esto en produccion. La url esta configurada al entorno de pruebas.

Para ejecutar estas pruebas debes solicitar tus accesos de QA(pruebas).

http://sifei.com.mx/

[timbrado]
UsuarioSIFEI = RFC # usuario sifei
PasswordSIFEI = 12345678a #password de usuario de sifei 
IdEquipoGenerado = f1563ce5 # ide equipo

[cancelacion]
PFX = CER_KEY.pfx    #Solo para el servicio de cancelacion

Generacion de llave PEM con openssl

#Recibimos el key en formato DER y generarmos la llave en formato PEM
openssl pkcs8 -inform DER -in CSD01_AAA010101AAA.key  -passin pass:12345678a -out CSD01_AAA010101AAA_KEY.pem

Metodos con ejemplos

WS Método Descripción
Timbrado getCFDI() Metodo para timbrar CFDI
Cancelación cancelaCFDI() Metodo para cancelar CFDI

Ejemplos simples

Se incluyen ejemplos simples para el servicio de timbrado y cancelacion, inspeccionar :

Cliente de Sifei.

Ademas de los ejemplos simples, se provee de todo un proyecto para el uso inmediato de todos los servicios relacionados a timbrado y cancelacion de CFDI.

Recuerda solicitar tus credenciales de acceso para consumir el servicio.

Inicio rápido (menos de 5 minutos)

Instalar cliente

Para instalar el cliente solo debes instalarlo via composer:

composer require sifei/timbrado-soap-client

Una vez realizado, podras importar las clases incluidas e instanciarlas para la invocacion de metodos ,por defecto las clases apuntan al entorno de pruebas., una vez finalizado tu proceso de integracion podras usar la constante incluida "PROD_ENV", la cual apunta a producción.

Ejemplo timbrado usando cliente

<?php
# include_once 'vendor/autoload.php'; #incluir el autoload (generado por composer) para autocargar las clases.

#Importamos las clases
use DHF\Sifei\Ws\Soap\Timbrado\getCFDI;
use DHF\Sifei\Ws\Soap\SifeiTimbradoService;

$sifeiService =new SifeiTimbradoService(
    SifeiTimbradoService::DEV_ENV,
    ['trace'=>true]    #Para recuperar el request y response
);
#clase con los parametros de timbrado:
$timbradoParams= new getCFDI();
$timbradoParams->setUsuario($usuario);
$timbradoParams->setPassword($password);
$timbradoParams->setIdEquipo($idEquipo);
$timbradoParams->setSerie($serie);
$timbradoParams->setArchivoXMLZip($xml);#arhivo xml

try {
	$res = $sifeiService->getCFDI($timbradoParams);
	$fileTmpZip = "timbrado.zip";  //nombre del zip
	//mandamos en un zip el xml timbrado en caso de exito
	file_put_contents( $fileTmpZip, $res->getReturn());
	$zipXml = new ZipArchive();
	if ($zipXml->open($fileTmpZip) === TRUE) {	  		
  		$zipXml->extractTo( $tmpDirName );
		$zipXml->close();
	}
} catch (SoapFault $e) {
	#En caso de un error inspeccionar la excepcion:
	var_dump( $e->faultcode, $e->faultstring, $e->detail)
}

Ejemplo de sellado

<?php
use DHF\Sifei\Ws\Soap\utils\CFDIUtils;
/**
 * Ejemplo para la generacion de sello. 
 * 
 * Contexto. El sello es la cadena original firmada mediante la llave (.key) y un password. 
 * La cadena original es una cadena de texto que comprende todos los CFDI
 * 
 * Nota: Si ocurre un error favor de confirmar que la llave (PEM O DER) efectivamente sean una llave y no el certificado, puedes hacerlo segun el caso
 * Para obtener info de un certificado(notar la extension):
 *  >openssl x509 -in CSD01_AAA010101AAA.cer -inform der -text
 * 
 * 
 * 
 * 
 * Flujo : 
 * 
 * CFDI-> procesamiento de cadenaoriginal->cadena original producida-> firmado/sellado-> sello generado->anexar sello al atributo sello del nodo Comprobante->Enviar a timbrar->Recuperar CFDI timbrado
 * 
 * 
 * ----------------------------------------------------------------------------------------------------------------
 * En caso de no poder generar el sello con el .key, convertir el KEY a FORMATO PEM con openssl:
 * >openssl pkcs8 -inform DER -in CSD01_AAA010101AAA.key  -passin pass:12345678a -out CSD01_AAA010101AAA_KEY.PEM
 * donde:
 *      Entrada) CSD01_AAA010101AAA.key Llave en formato DER
 *      Salida)  CSD01_AAA010101AAA_KEY.PEM  Llave en formato PEM
 */
//clase ejeemplo de genracion de cadena originaly sellado
include_once 'vendor/autoload.php';
function println($str){
    echo $str."\n";
}
#para sellar se necesita generar la cadena original y luego sellarla, esta clase ofrece el metodo para hacer todo en un sola invocacion

$dom= new DOMDocument();
#en este caso se carga el xml desde archivo
$dom->load(__DIR__."/assets/cfdi.xml");
$utils= new CFDIUtils();
$utils->setComprobante($dom);
#todo desde un solo metodo: genera la cadena original, sella y codifica en base64 lista para agregar en el atributo Sello del CFDI


#AHORA se establece la llave, la llave puede ser en Formato PEM o formato DER(generalmente cuando tiene extension .key):

#Metodos:
#(1) PEM    
println("-----Sello mediante KEY en formato PEM:");
println($utils->getSello(
    file_get_contents(__DIR__."/KeyCert/CSD01_AAA010101AAA_KEY.PEM"), #llave en formato PEM
    "12345678a")                    #contraseña
);
#O bien:

println("-----Sello mediante KEY en formato DER:");
#(2)DER. Usando .key directamente (DER)
println($utils->getSello(
    file_get_contents(__DIR__."/KeyCert/CSD01_AAA010101AAA.key"), #llave en formato DER
    "12345678a",
    'DER'                    #contraseña
    )
);

println("-----Cadena original:");
#si deseas ver la cadena original.
println($utils->getCadenaOriginal());

Descripción

Ademas de los ejemplos simples, se incluyen 2 clases principales que agrupan las operaciones de los distintos servicios de SIFEI.

Timbrado:

Método getCFDIProcesa

Request getCFDIProcesa

Nombre Tipo
Usuario xs:string
Password xs:string
archivoXMLZip xs:base64Binary
Serie xs:string
IdEquipo xs:string

Response getCFDIProcesaResponse

Nombre Tipo
return xs:string

Método getCFDISign

Request getCFDISign

Nombre Tipo
Usuario xs:string
Password xs:string
archivoXMLZip xs:base64Binary
Serie xs:string
IdEquipo xs:string

Response getCFDISignResponse

Nombre Tipo
return xs:base64Binary

Método getTimbreCFDI

Request getTimbreCFDI

Nombre Tipo
Usuario xs:string
Password xs:string
archivoXMLZip xs:base64Binary
Serie xs:string
IdEquipo xs:string

Response getTimbreCFDIResponse

Nombre Tipo
return xs:base64Binary

Método CambiaPassword

Request CambiaPassword

Nombre Tipo
Usuario xs:string
Password xs:string
NewPassword xs:string

Response CambiaPasswordResponse

Nombre Tipo
return xs:boolean

Método cancelaCFDISectorPrimario

Request cancelaCFDISectorPrimario

Nombre Tipo
usuarioSIFEI xs:string
passUser xs:string
rfc xs:string
UUIDS xs:string

Response cancelaCFDISectorPrimarioResponse

Nombre Tipo
return xs:string

Método getXML

Request getXML

Nombre Tipo
rfc xs:string
pass xs:string
hash xs:string

Response getXMLResponse

Nombre Tipo
return xs:string

Método getCFDI

Request getCFDI

Nombre Tipo
Usuario xs:string
Password xs:string
archivoXMLZip xs:base64Binary
Serie xs:string
IdEquipo xs:string

Response getCFDIResponse

Nombre Tipo
return xs:base64Binary

Método getXMLProceso

Request getXMLProceso

Nombre Tipo
rfc xs:string
pass xs:string
idseguimiento xs:long

Response getXMLProcesoResponse

Nombre Tipo
return xs:string

Cancelacion:

Método procesarRespuesta

Request procesarRespuesta

Nombre Tipo
usuarioSIFEI xs:string
passwordSIFEI xs:string
rfcReceptor xs:string
folios tns:folios
pfx xs:base64Binary
passwordPfx xs:string

Response procesarRespuestaResponse

Nombre Tipo
return xs:string

Método cfdiRelacionado

Request cfdiRelacionado

Nombre Tipo
usuarioSIFEI xs:string
passwordSIFEI xs:string
rfcReceptor xs:string
rfcEmisor xs:string
uuid xs:string
pfx xs:base64Binary
passwordPfx xs:string

Response cfdiRelacionadoResponse

Nombre Tipo
return xs:string

Método peticionesPendientes

Request peticionesPendientes

Nombre Tipo
usuarioSIFEI xs:string
passwordSIFEI xs:string
rfcReceptor xs:string

Response peticionesPendientesResponse

Nombre Tipo
return xs:string

Método consultaSATCFDI

Request consultaSATCFDI

Nombre Tipo
usuarioSIFEI xs:string
passwordSIFEI xs:string
id xs:string
re xs:string
rr xs:string
tt xs:string
fe xs:string

Response consultaSATCFDIResponse

Nombre Tipo
return xs:string

¿Necesitas mas ejemplos?

Si necesitas mas ejemplos del resto de servicios favor de generar un nuevo issue