Buenas, estoy con un error: "message": "(10197) Si el comprobante es Debito o Credito, enviar estructura CbteAsoc o PeriodoAsoc.",
Antes funcionaba OK. Voy a mirar bien en detalle, pero si alguien sabe algo de ante-mano se agradece!
'CbtesAsoc' => array( array( 'Tipo' => $tipo_factura_asociada, 'PtoVta' => $punto_factura_asociada, 'Nro' => $numero_factura_asociada, ) ),
Tendre que pasarlo a int ?
Esto es al crear una nota de credito.
PeriodoAsoc no lo declaro en el array....
Veo todo bien en CbtesAsoc, en testing me pasa lo mismo.
La info de testing es:
array(22) { ["CantReg"]=> int(1) ["PtoVta"]=> int(10) ["CbteTipo"]=> int(3) ["Concepto"]=> int(1) ["DocTipo"]=> string(2) "80" ["DocNro"]=> string(11) "33999034689" ["CbteDesde"]=> int(27) ["CbteHasta"]=> int(27) ["CbteFch"]=> int(20241220) ["FchServDesde"]=> NULL ["FchServHasta"]=> NULL ["FchVtoPago"]=> NULL ["ImpTotal"]=> float(1757464.5) ["ImpTotConc"]=> int(0) ["ImpNeto"]=> float(1452450) ["ImpOpEx"]=> int(0) ["ImpIVA"]=> float(305014.5) ["ImpTrib"]=> int(0) ["MonId"]=> string(3) "PES" ["MonCotiz"]=> int(1) ["CbtesAsoc"]=> array(1) { [0]=> array(3) { ["Tipo"]=> int(1) ["PtoVta"]=> int(10) ["Nro"]=> int(82) } } ["Iva"]=> array(1) { [0]=> array(3) { ["Id"]=> int(5) ["BaseImp"]=> float(1452450) ["Importe"]=> float(305014.5) } } }
Actualizaste la libreria o algo? que version tenes?
"afipsdk/afip.php": "^1.1",
Fijate si actualizas a la ultima v1.1.3
ok, pruebo y les aviso.
Si, actualice la libreria y funciona. Gracias
Hola Ivan! Como estas? Te queria consultar, si quisiera usar el sdk en produccion para brindarle mi pagina a varios usuarios, podria usar el CUIT de produccion de la documentacion, o deberia crear un certificado y keys propios?
El CUIT de pruebas es solo para desarrollo, en produccion var a necesitar tu propio cert y key
Correcto, y te consulto, si yo voy a brindarle mi pagina a varios clientes, pueden trabajar todos con el certificado que creo yo para produccion, o necesitamos que cada cliente cree su propio certificado y key? Mas que nada te consulto si nos generaria quilombo con AFIP si varios negocios usan el certificado y key de nuestra empresa
O deberia delegarlo para cada cliente nuevo que se cree?
Okay, entonces necesitamos que cada cliente tenga su propio certificado y key si o si no? Por lo que veo en las opciones
Con la opcion 2 podes tener un solo certificado y te delegan tus cliente el ws
Y eso no nos generaria quilombo con AFIP si varios clientes facturan con nuestro certificado y key? Y lo que consulto es, no deberia delegarles yo a ellos el web service? o me lo tienen que delegar ellos a mi?
Ellos a vos, en el link esta el tutorial que explica como hacerlo
Okay, entonces para hacer eso yo deberia crear mi certificado, ellos me delegan a mi el ws y yo tengo que aceptar la delegacion? Disculpa que te joda pero no entiendo por que es que ellos me lo delegan a mi si yo soy el que esta poniendo el certificado
ellos te lo delegan a vos porque el web service te habilita a actuar en representacion de ellos
Como andan gente, tengo ubuntu 20.04 que viene con OpenSSL v3. Edite la configuracion etc/ssl/openssl.cnf para habilitar la seguridad TLS1 pero no hay caso, ejecuto el comando openssl version -a y uno de los parametros me devuelve -DOPENSSL_TLS_SECURITY_LEVEL=2 lo cual no me deja conectar a Afip. A alguno le paso? gracias!
Que error te esta dando al intentar conectarte?
Hola Ivan, gracias por responder, me tira: SOAP Fault: HTTP Could not connect to host (SSL routines::dh key too small) Probe usando el comando: curl --ciphers DEFAULT@SECLEVEL=1 -v https://servicios1.afip.gov.ar/wsfev1/service.asmx Y funciona perfecto. Ahí me di cuenta que es el openSSL
Revistaste este hilo? https://github.com/AfipSDK/afip.php/issues/5 tiene varias soluciones
Buenos dias ivanalemunioz tengo el siguiente problema al seguir todos los pasos. Ya busque en google pero no encontre solucion, puede ayudarme con esto? SOAP Fault: HTTP Could not connect to host
Si claro, fue de lo primero que me aparecio en la busqueda. El tema es la config del SSL que de hecho no pareciera tener afecto, otra alternativa seria hacer un downgrade a la version 1 de openSSL, pero quizas alguno ya a tiene andando en la v3 y me puede pasar un snipet de la config que usa.
Buen dia, busco contratar a alguien que me ayude a generar los certificados
En la documentación de la API esta explicado, si pese a leerla no has dado en la tecla, contame que te ocurre.
Conexión exitosa. Token obtenido correctamente: Token: PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/Pgo8c3NvIHZlcnNpb249IjIuMCI+CiAgICA8aWQgc3JjPSJDTj13c2FhLCBPPUFGSVAsIEM9QVIsIFNFUklBTE5VTUJFUj1DVUlUIDMzNjkzNDUwMjM5IiBkc3Q9IkNOPXdzZmUsIE89QUZJUCwgQz1BUiIgdW5pcXVlX2lkPSIzODYzNDEwNzk5IiBnZW5fdGltZT0iMTczNjE3NzAyMSIgZXhwX3RpbWU9IjE3MzYyMjAyODEiLz4KICAgIDxvcGVyYXRpb24gdHlwZT0ibG9naW4iIHZhbHVlPSJncmFudGVkIj4KICAgICAgICA8bG9naW4gZW50aXR5PSIzMzY5MzQ1MDIzOSIgc2VydmljZT0id3NmZSIgdWlkPSJTRVJJQUxOVU1CRVI9Q1VJVCAzMDcwOTgxNjQ1MCwgQ049c29sa2FyMiIgYXV0aG1ldGhvZD0iY21zIiByZWdtZXRob2Q9IjIyIj4KICAgICAgICAgICAgPHJlbGF0aW9ucz4KICAgICAgICAgICAgICAgIDxyZWxhdGlvbiBrZXk9IjMwNzA5ODE2NDUwIiByZWx0eXBlPSI0Ii8+CiAgICAgICAgICAgIDwvcmVsYXRpb25zPgogICAgICAgIDwvbG9naW4+CiAgICA8L29wZXJhdGlvbj4KPC9zc28+Cg== Sign: aU3gGyRVXOZWYa8y0Kx60G8ic2Q7VordUF/2urwYz7pDCcLb1wKZbGkxzOnw4+V9pY3shYWSPp+1slLf1Vx4SvkybeRHIfQQ9yQRvZvxuu8VjmCHKwmN5zac08blnf+rCQg+rUYrmDzuiR9nf1JoXloBdCZ8zqGwlrZsVqc+KRo= Factura emitida correctamente. CAE: 75010694882600 Fecha de vencimiento del CAE: 2025-01-16, pero igual al consultar me dice No se encontró un comprobante con el CAE proporcionado.
No estoy entendiendo ahí que asociación tiene con los certificados eso
Hola Ivan, disculpa que te joda, queria consultarte si para pasar a produccion y que me deleguen un web service, el web service que deberia delegarme el usuario para que pueda hacer facturas y notas de credito deberia ser " Servicio Consulta Padron A4" o que web service deberian delegarme?
El webservice que debés autotizar para facturar es wsfe.
Hola estoy usando la versión 0.7.1 desde el 2023 y hace unos días estoy obteniendo el error: Error {#1674 #message: "Undefined constant "SOAP_1_1", algo cambió en el webService? no puedo encontrar el problema.
Tenes que activar la extension SOAP de PHP
Muchas gracias por tu respuesta Ivan, pruebo con eso.
Buenos dias Implementando el WS de constancia de inscripcion me encuentro con este error
Error: Debe autorizar el uso del web service. Revise el tutorial en https://docs.afipsdk.com/paso-a-paso/web-services. ns1:coe.notAuthorized
pero cuando voy al tutorial me encuentro con Página no encontrada
alguien sabe adonde se "mudó" ?
@user la url funciona correctamente.
Buenas @user , como va? Para impresoras controlar fiscal, hay documentacion al respecto??
Uh, bueno gracias
Si alguien del grupo ha implementado algo se agradece info
{"CantReg":1,"PtoVta":1,"CbteTipo":6,"Concepto":1,"DocTipo":99,"DocNro":0,"CbteDesde":null,"CbteHasta":null,"CbteFch":20250217,"ImpTotal":6.99,"ImpTotConc":0,"ImpNeto":5.78,"ImpOpEx":0,"ImpIVA":1.21,"ImpTrib":0,"FchServDesde":null,"FchServHasta":null,"FchVtoPago":null,"MonId":"PES","MonCotiz":"1","CanMisMonExt":"N","CondicionIVAReceptorId":5,"CbtesAsoc":null,"Iva":[{"Id":5,"BaseImp":5.78,"Importe":1.21}]}
Estoy probando en homologacion y sigo recibiendo el Error (10242) El campo Condicion IVA receptor es obligatorio
Al consultar la lista de condiciones me sale este error.
$tax_types = $afip->ElectronicBilling->ExecuteRequest('FEParamGetCondicionIvaReceptor'); pero recibo el error SOAP Fault::: Sender Function ("FEParamGetCondicionIvaReceptor") is not a valid method for this service
algunas sugeriencias?
Usas una version vieja de la libreria?
si
Buenas, yo pude meter un par de facturas con este cambio de la condición IVA (enviando 5 como consumidor final) hace unos dias, pero justo hoy, sin tocar el código ni nada, me dejó de andar tambien, exactamente mismo error " Error (10242) El campo Condicion IVA receptor es obligatorio"
Debes actualizar el WSDL https://github.com/AfipSDK/afip.php/blob/v0.7.0/src/Afip_res/wsfe.wsdl por este https://wswhomo.afip.gov.ar/wsfev1/service.asmx?wsdl
uh perdon que boludo! ahi me di cuenta que no habia actualizado el wsdl en mi sv de producción
las pruebas anteriores las habia hecho en local donde si lo tenia actualizado. Ya actualicé y quedo andando de 10. Gracias!
Ivan, mil gracias!!! me estaba volviendo loco. jajajaj
buenas, tengo una duda: emití 3 facturas para testear, me devolvió el número de cae y en mi afip si voy a buscar facturas no las veo. Saben por qué es o como hago para verlas?
si es en producción y queres verlas en afip creo que te salen al dia siguiente!
Muchas gracias Federico
Hola, solo te permite verlas en produccion desde el servicio "Mis Comprobantes" luego de 24hs. Saludos
Muchas gracias!! estuve bastante hasta que me di cuenta que tenía que cambiar el wsfe.wsdl
Hola, hay algun video tutorial para que muestre como instalar AfipSdk y como hacer generar alguna factura de prueba?
Video no, pero te dejo esta guia por si te sirve https://afipsdk.com/blog/crear-factura-electronica-de-afip-en-php/
buenisimo, gracias ivan
Ivan, cuando hago correr el ejemplo me sale este error: Fatal error: Uncaught exception 'Exception' with message 'Failed to open DIR/Class/ElectronicBilling.php ' in C:\sitios\a_pos\gestion\fe\afipsdk-master\src\Afip.php:367 Stack trace: #0 C:\sitios\a_pos\gestion\fe\afipsdk-master\crear_factura.php(42): Afip->__get('ElectronicBilli...') #1 {main} thrown in C:\sitios\a_pos\gestion\fe\afipsdk-master\src\Afip.php on line 367
Como te quedo armado ese crear factura?
Hola, disculpen que me meta, pero te dice "Failed to open DIR/Class/ElectronicBilling.php" y "DIR" no deberia ser "DIR" para que te tome la ubicacion? Lo vi asi x arriba nomas...
Una consulta, con el error (10242) El campo Condicion IVA receptor es obligatorio, si o si debemos utilizar el padron para obtener el dato segun el cuit? O el usuario podría elegir la condición del iva de una lista desplegable y que la coloque a mano? Con el riesgo de que la coloque mal obviamente!
me quedó armado asi: <?php include ('src/Afip.php');
/**
- CUIT vinculado al certificado
- Podes usar 20409378472 para desarrollo
- sin necesidad de key o cert **/ $CUIT = 20409378472;
$afip = new Afip(array('CUIT' => $CUIT));
$data = array(
'CantReg' => 1, // Cantidad de comprobantes a registrar
'PtoVta' => 1, // Punto de venta
'CbteTipo' => 6, // Tipo de comprobante (Factura B)(ver tipos disponibles)
'Concepto' => 1, // Concepto del Comprobante: (1)Productos, (2)Servicios, (3)Productos y Servicios
'DocTipo' => 99, // Tipo de documento del comprador (99 consumidor final, ver tipos disponibles)
'DocNro' => 0, // Número de documento del comprador (0 consumidor final)
'CbteDesde' => 1, // Número de comprobante o numero del primer comprobante en caso de ser mas de uno
'CbteHasta' => 1, // Número de comprobante o numero del último comprobante en caso de ser mas de uno
'CbteFch' => intval(date('Ymd')), // (Opcional) Fecha del comprobante (yyyymmdd) o fecha actual si es nulo
'ImpTotal' => 121, // Importe total del comprobante
'ImpTotConc' => 0, // Importe neto no gravado
'ImpNeto' => 100, // Importe neto gravado
'ImpOpEx' => 0, // Importe exento de IVA
'ImpIVA' => 21, //Importe total de IVA
'ImpTrib' => 0, //Importe total de tributos
'MonId' => 'PES', //Tipo de moneda usada en el comprobante (ver tipos disponibles)('PES' para pesos argentinos)
'MonCotiz' => 1, // Cotización de la moneda usada (1 para pesos argentinos)
'Iva' => array( // (Opcional) Alícuotas asociadas al comprobante
array(
'Id' => 5, // Id del tipo de IVA (5 para 21%)(ver tipos disponibles)
'BaseImp' => 100, // Base imponible
'Importe' => 21 // Importe
)
),
);
$res = $afip->ElectronicBilling->CreateVoucher($data);
echo $res['CAE']; //CAE asignado el comprobante echo $res['CAEFchVto']; //Fecha de vencimiento del CAE (yyyy-mm-dd)
?>
Y tenes el archivo Class/ElectronicBilling.php?
Genial, asi le doy opciones al cliente! Gracias
si quiero cambiar la ubicacion del certificado, lo podia especificar al instanciar la clase, no? No estoy encontrando esa info...
Si, a partir de la v1 la ubicacion del certificado ya no la maneja el SDK, asi uno la puede guardar en cualquier ubicacion o en la DB incluso. Y uno le pasa el certificado a la libreria https://docs.afipsdk.com/paso-a-paso/ir-a-produccion#paso-3-cambiar-parametros-de-la-libreria
y en versiones anteriores? Tengo la 0.6
En esa version new Afip() tiene el parametro 'res_folder' que seria la ruta de la carpeta donde esta el cert y key https://github.com/AfipSDK/afip.php/blob/v0.6.1/src/Afip.php#L113
Buenas, instalé la última versión de la librería, lo hice en forma manual porque la integré a scriptcase, la pruebas que hice salieron bien, sorteé el error 10242. Consulta para que sirve o en que casos se usa el folder Afip_res, si bien lo copie, no vi en el código un path o algo que por el estilo.
A partir de la v1.0 de la libreria ya no se usa no se incluye en el codigo, no se que version estaras usando si un te incluye la carpeta Afip_res
La copie, la versión que bajé no la tenia, pero vi por el error y la copié, pero vi que no era necesaria, por eso hice la consulta, gracias
Hola buenas tardes ! Estoy testeando la librería. Hoy me apareció el error Error (10242) El campo Condicion IVA receptor es obligatorio" Ley un poco los diálogos y lo que hice fue agregar al $data = array( ... 'CondicionIVAReceptorId'=> 1, ) y el problema se soluciono. No me queda claro lo que debo hacer respecto a la actualización que hablan actualizar el WSDL https://github.com/AfipSDK/afip.php/blob/v0.7.0/src/Afip_res/wsfe.wsdl por este https://wswhomo.afip.gov.ar/wsfev1/service.asmx?wsdl Ésto es un link q debo reemplazar dentro de un archivo ? o debo descargar algún archivo y reemplazar. Desde ya muchas gracias a comentarios/ayuda.
Hola. Desde la semana pasada que estoy teniendo problemas con el $res = $afip->ElectronicBilling->CreatePDF(...). Sigo tal cual el ejemplo que venía funcionando perfecto. Al hacer un file_get_contents($res['file'] da un forbidden. Ahora si pego la url en un navegador, funciona perfecto... probé en hacer un retry con un tiempo aleatorio con usleep pero sigue el problema... podrá ser algún problema relacionado con el storage en google ?
Lo del wsdl es para quienes usan una version vieja de la libreria anterior a la 1.0
Mmm no deberias tener problemas, si lo podes ver en el navegador deberias poder descargarlo sin problemas, ese forbidden suena a que la url que estas intentando descargar tiene algo extra o le falta algo
Gracias por la respuesta! Si, es rarisimo y no lo venía haciendo.... si pego la url en el navegador abre lo más bien, por eso no entiendo bien por donde viene la mano... se me ocurre algún lag entre que devuelve la url y el archivo está listo para ser leído.. no me había pasado antes...
Quiza, probaste agregarle algun sleep() para esperar unos segundos mas antes de intentar descargarlo?
Por si sirve de algo, reintento varias veces utilizando cURL en vez de file_get_contents....:
// Implementación con reintentos usando cURL
$maxIntentos = 3;
$intentos = 0;
$ultimoError = null;
while ($intentos < $maxIntentos) {
try {
\usleep(500000);
// Usar cURL en lugar de file_get_contents
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FAILONERROR, true); // Esto hará que cURL falle en errores HTTP
$pdf = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($pdf === false || $httpCode >= 400) {
$error = curl_error($ch);
curl_close($ch);
throw new \Exception("Error HTTP $httpCode: $error");
}
curl_close($ch);
// Si llegamos aquí, la descarga fue exitosa
break;
} catch (\Exception $e) {
$intentos++;
$ultimoError = $e;
if ($intentos < $maxIntentos) {
$tiempoEspera = pow(2, $intentos - 1) * 500000;
usleep($tiempoEspera);
}
}
}
// Si después de todos los intentos no se pudo descargar, lanzamos la excepción
if ($intentos >= $maxIntentos || !isset($pdf) || empty($pdf)) {
throw new FacturaElectronicaException('No se pudo descargar el PDF de la factura electrónica después de ' . $maxIntentos . ' intentos: ' . ($ultimoError ? $ultimoError->getMessage() : 'Error desconocido'));
}
try {
file_put_contents($file, $pdf);
} catch (\Exception $e) {
throw new FacturaElectronicaException('No se pudo guardar el PDF de la factura electrónica: ' . $e->getMessage());
}
Si hacer un echo de esa $url muestra la correcta?
Si, justo estoy haciendo un echo de la url antes de abrirla con el file_get_contents y si pruebo de abrir la url en el navegador, veo el pdf lo más bien... por eso mi teoría iba por el lag entre que te da la url y te deja el archivo disponible para visualizarlo 🤷♂️
@user solo por las dudas podrías chequear si no se actualizó el server o hosting que uses y se haya desactivado allow_url_fopen
mmmmm... no recuerdo si actualicé el servidor en la última semana.... en cuando a lo otro:
php -i | grep allow_url_fopen
allow_url_fopen => On => On
Raro, quiza algun problema con el SSL del servidor?
Busco desarrollador con experiencia en api de afip 3517481000 porfavor comunicarse gracias! Para desarrollar un modulo de facturacion electronica en un erp Con laravel
Tema PDF - Hola a todos ! Alguien tiene algun ejemplo o me puede orientar de como enviar los datos al archivo bill.html ?? Por que he probado generando una array con los datos obtenidos después de la aprobación, ese array[] lo pongo en una $_SESSION[] y luego quiero tomar las variables desde el bill.html desde $_SESSION[] . Pero no logro hacerlo ya ue las variables me aparece nulas . Existe otro metodo ? por q en las guias de l apagina habla de como obtener el pdf pero no como enviarles los datos reales....
Tenes que usar algun template engine para pasarle variables como por ej https://twig.symfony.com/, https://github.com/bobthecow/mustache.php, https://latte.nette.org/es/guide, etc
Twig - The flexible, fast, and secure template engine for PHP
Latte es el sistema de plantillas más seguro para PHP. Evita muchas vulnerabilidades de seguridad. Apreciarás su sintaxis intuitiva y un montón de ajustes útiles.
Hola, alguien sabe por qué motivo estoy obteniendo este error (10242) El campo Condicion IVA receptor no es un valor valido. Consular metodo FEParamGetCondicionIvaReceptor si hasta el 15 de Abril no es oblitagorio enviar la condición de IVA?
En desarrollo debes enviarlo, en produccion es obligatorio desde el 15 de abril
Hola Hector, ¿me puedes mostrar cómo te ha quedado el wsdl después de actualizarlo? Yo lo estoy intentando pero no consigo que me funcione. Gracias.
El error lo estoy obteniendo en producción.
En produccion todavia no lo liberan al cambio