Emissão de NFCE erro ValidationFailed

Boa tarde, estou com um problema em uma homologação do NFCE esta me retornando um erro.

{ "error": { "code": "ValidationFailed", "message": "Validation failed", "errors": [ (truncated...)

já o json que eu estou enviando e este

{
	"ambiente": "homologacao",
	"infNFe": {
		"versao": "4.00",
		"Id": null,
		"ide": {
			"cUF": 3555406,
			"cNF": "50",
			"natOp": "Venda",
			"mod": 65,
			"serie": 2,
			"nNF": 200,
			"dhEmi": "2023-12-20T14:15:22Z",
			"dhSaiEnt": "2023-12-20T14:15:22Z",
			"tpNF": 1,
			"idDest": 1,
			"cMunFG": "3555406",
			"tpImp": 4,
			"tpEmis": 1,
			"cDV": null,
			"tpAmb": 2,
			"finNFe": 1,
			"indFinal": 1,
			"indPres": 1,
			"indIntermed": 0,
			"procEmi": 0,
			"verProc": "1.0",
			"dhCont": "2023-12-20T14:15:22Z",
			"xJust": null,
			"NFref": []
		},
		"emit": {
			"CNPJ": "26947087000100",
			"CPF": null,
			"xNome": null,
			"xFant": null,
			"enderEmit": {
				"xLgr": null,
				"nro": null,
				"xCpl": null,
				"xBairro": null,
				"cMun": null,
				"xMun": null,
				"UF": null,
				"CEP": null,
				"cPais": null,
				"xPais": null,
				"fone": null
			},
			"IE": null,
			"IEST": null,
			"IM": null,
			"CNAE": null,
			"CRT": null
		},
		"det": [
			{
				"nItem": 1,
				"prod": {
					"cProd": "05049385352",
					"cEAN": "5695546982566",
					"cBarra": "5695546982566",
					"xProd": "Teste homologacao",
					"NCM": "00000000",
					"CEST": null,
					"indEscala": null,
					"CNPJFab": null,
					"cBenef": null,
					"EXTIPI": null,
					"CFOP": "5102",
					"uCom": "UN",
					"qCom": 1.0,
					"vUnCom": 10.0,
					"vProd": 10.0,
					"cEANTrib": "5695546982566",
					"cBarraTrib": "5695546982566",
					"uTrib": "PAR",
					"qTrib": 1.0,
					"vUnTrib": 10.0,
					"vFrete": null,
					"vSeg": null,
					"vDesc": null,
					"vOutro": null,
					"indTot": 1,
					"xPed": null,
					"nItemPed": 0,
					"nFCI": null,
					"nRECOPI": null
				},
				"imposto": {
					"vTotTrib": 2.68,
					"ICMS": {
						"ICMSSN102": {
							"orig": 0,
							"CSOSN": "102"
						}
					},
					"IPI": {
						"CNPJProd": null,
						"cSelo": null,
						"qSelo": null,
						"cEnq": "999",
						"IPITrib": {
							"CST": "99",
							"vBC": 0.0,
							"pIPI": 0.0,
							"qUnid": 0.0,
							"vUnid": 0.0,
							"vIPI": 0.0
						}
					},
					"PIS": {
						"PISOutr": {
							"CST": "99",
							"vBC": 0.0,
							"pPIS": 0.0,
							"qBCProd": 0.0,
							"vAliqProd": 0.0,
							"vPIS": 0.0
						}
					},
					"COFINS": {
						"COFINSOutr": {
							"CST": "99",
							"vBC": 0.0,
							"pCOFINS": 0.0,
							"qBCProd": 0.0,
							"vAliqProd": 0.0,
							"vCOFINS": 0.0
						}
					}
				},
				"infAdProd": "informação adicional"
			}
		],
		"total": {
			"ICMSTot": {
				"vBC": 0.0,
				"vICMS": 0.0,
				"vICMSDeson": 0.0,
				"vFCPUFDest": 0.0,
				"vICMSUFDest": 0.0,
				"vICMSUFRemet": 0.0,
				"vFCP": 0.0,
				"vBCST": 0.0,
				"vST": 0.0,
				"vFCPST": 0.0,
				"vFCPSTRet": 0.0,
				"qBCMono": null,
				"vICMSMono": 0.0,
				"qBCMonoReten": null,
				"vICMSMonoReten": 0.0,
				"qBCMonoRet": null,
				"vICMSMonoRet": 0.0,
				"vProd": 10.0,
				"vFrete": 0.0,
				"vSeg": 0.0,
				"vDesc": 0.0,
				"vII": 0.0,
				"vIPI": 0.0,
				"vIPIDevol": 0.0,
				"vPIS": 0.0,
				"vCOFINS": 0.0,
				"vOutro": 0.0,
				"vNF": 10.0,
				"vTotTrib": 2.68
			}
		},
		"transp": {
			"modFrete": 9,
			"vagao": null,
			"balsa": null
		},
		"pag": {
			"detPag": [
				{
					"indPag": 0,
					"tPag": "01",
					"xPag": null,
					"vPag": 10.0
				}
			],
			"vTroco": null
		}
	}
}

Boa tarde, @edsocm. Seja bem-vindo à Nuvem Fiscal!

Qual o erro exatamente que é retornado pela API?

Boa tarde, isso que e estranho a unica coisa que me retorna e este erro.

{ "error": { "code": "ValidationFailed", "message": "Validation failed", "errors": [ (truncated...)

Esse retorno não é um JSON válido e não deve estar sendo retornado pela API. Provavelmente é alguma ferramenta que você está usando, seja de visualização do JSON, ou de comunicação com a API, que está mostrando esse trecho “truncated”.

Pelo php esta me retornando isso:

{ "error": { "code": "InvalidJson", "message": "Expected BeginObject but was DoubleQuoted at path (truncated...)

Essa mensagem “truncated” não é retornada pela API. Tente obter a resposta correta, ela vai dar mais informações sobre o erro.

Então Wagner, eu estou usando o proprio sdk da nuvem fiscal, e quando eu rodo o codigo do CEP funciona perfeitamente tanto os erros quanto os retornos do CEP, ja o NFCE so me retorna esse erro e aparece erro no NfceApi.php on line 6564.

E onde está visualizando esse retorno?

e desta forma que eu estou enviando.

<?php
require_once(__DIR__ . '/vendor/autoload.php');

//HOMOLOGAÇÃO
$_ENV['NUVEMFISCAL_CLIENTID'] = '#########';
$_ENV['NUVEMFISCAL_CLIENTSECRET'] = '#######';

// Obter token a partir das credenciais
$token = get_oauth2_token(
    'https://auth.nuvemfiscal.com.br/oauth/token',
    $_ENV['NUVEMFISCAL_CLIENTID'],
    $_ENV['NUVEMFISCAL_CLIENTSECRET'],
    'conta empresa cep cnpj mdfe cte nfse nfe nfce' // defina o scope a ser usado
);
// Configurar access token OAuth2 para autorização: oauth2
$config = NuvemFiscal\Configuration::getDefaultConfiguration()->setAccessToken($token->access_token);
$config->setHost('https://api.sandbox.nuvemfiscal.com.br'); 
//$config->setHost('https://api.nuvemfiscal.com.br'); 


$apiInstance = new NuvemFiscal\Api\NfceApi(
    // Se quiser usar um client http customizado, passe um client que implemente `GuzzleHttp\ClientInterface`.
    // Isso é opcional, `GuzzleHttp\Client` será usado por padrão.
    new GuzzleHttp\Client(),
    $config
);
//$body = new \NuvemFiscal\Model\NfePedidoEmissao();

$body = '{
	"ambiente": "homologacao",
	"infNFe": {
		"versao": "4.00",
		"Id": null,
		"ide": {
			"cUF": 3555406,
			"cNF": "50",
			"natOp": "Venda",
			"mod": 65,
			"serie": 2,
			"nNF": 200,
			"dhEmi": "2023-12-20T14:15:22Z",
			"dhSaiEnt": "2023-12-20T14:15:22Z",
			"tpNF": 1,
			"idDest": 1,
			"cMunFG": "3555406",
			"tpImp": 4,
			"tpEmis": 1,
			"cDV": null,
			"tpAmb": 2,
			"finNFe": 1,
			"indFinal": 1,
			"indPres": 1,
			"indIntermed": 0,
			"procEmi": 0,
			"verProc": "1.0",
			"dhCont": "2023-12-20T14:15:22Z",
			"xJust": null,
			"NFref": []
		},
		"emit": {
			"CNPJ": "26947087000100",
			"CPF": null,
			"xNome": null,
			"xFant": null,
			"enderEmit": {
				"xLgr": null,
				"nro": null,
				"xCpl": null,
				"xBairro": null,
				"cMun": null,
				"xMun": null,
				"UF": null,
				"CEP": null,
				"cPais": null,
				"xPais": null,
				"fone": null
			},
			"IE": null,
			"IEST": null,
			"IM": null,
			"CNAE": null,
			"CRT": null
		},
		"det": [
			{
				"nItem": 1,
				"prod": {
					"cProd": "05049385352",
					"cEAN": "5695546982566",
					"cBarra": "5695546982566",
					"xProd": "Teste homologacao",
					"NCM": "00000000",
					"CEST": null,
					"indEscala": null,
					"CNPJFab": null,
					"cBenef": null,
					"EXTIPI": null,
					"CFOP": "5102",
					"uCom": "UN",
					"qCom": 1.0,
					"vUnCom": 10.0,
					"vProd": 10.0,
					"cEANTrib": "5695546982566",
					"cBarraTrib": "5695546982566",
					"uTrib": "PAR",
					"qTrib": 1.0,
					"vUnTrib": 10.0,
					"vFrete": null,
					"vSeg": null,
					"vDesc": null,
					"vOutro": null,
					"indTot": 1,
					"xPed": null,
					"nItemPed": 0,
					"nFCI": null,
					"nRECOPI": null
				},
				"imposto": {
					"vTotTrib": 2.68,
					"ICMS": {
						"ICMSSN102": {
							"orig": 0,
							"CSOSN": "102"
						}
					},
					"IPI": {
						"CNPJProd": null,
						"cSelo": null,
						"qSelo": null,
						"cEnq": "999",
						"IPITrib": {
							"CST": "99",
							"vBC": 0.0,
							"pIPI": 0.0,
							"qUnid": 0.0,
							"vUnid": 0.0,
							"vIPI": 0.0
						}
					},
					"PIS": {
						"PISOutr": {
							"CST": "99",
							"vBC": 0.0,
							"pPIS": 0.0,
							"qBCProd": 0.0,
							"vAliqProd": 0.0,
							"vPIS": 0.0
						}
					},
					"COFINS": {
						"COFINSOutr": {
							"CST": "99",
							"vBC": 0.0,
							"pCOFINS": 0.0,
							"qBCProd": 0.0,
							"vAliqProd": 0.0,
							"vCOFINS": 0.0
						}
					}
				},
				"infAdProd": "informação adicional"
			}
		],
		"total": {
			"ICMSTot": {
				"vBC": 0.0,
				"vICMS": 0.0,
				"vICMSDeson": 0.0,
				"vFCPUFDest": 0.0,
				"vICMSUFDest": 0.0,
				"vICMSUFRemet": 0.0,
				"vFCP": 0.0,
				"vBCST": 0.0,
				"vST": 0.0,
				"vFCPST": 0.0,
				"vFCPSTRet": 0.0,
				"qBCMono": null,
				"vICMSMono": 0.0,
				"qBCMonoReten": null,
				"vICMSMonoReten": 0.0,
				"qBCMonoRet": null,
				"vICMSMonoRet": 0.0,
				"vProd": 10.0,
				"vFrete": 0.0,
				"vSeg": 0.0,
				"vDesc": 0.0,
				"vII": 0.0,
				"vIPI": 0.0,
				"vIPIDevol": 0.0,
				"vPIS": 0.0,
				"vCOFINS": 0.0,
				"vOutro": 0.0,
				"vNF": 10.0,
				"vTotTrib": 2.68
			}
		},
		"transp": {
			"modFrete": 9,
			"vagao": null,
			"balsa": null
		},
		"pag": {
			"detPag": [
				{
					"indPag": 0,
					"tPag": "01",
					"xPag": null,
					"vPag": 10.0
				}
			],
			"vTroco": null
		}
	}
}';

try {
    $result = $apiInstance->emitirNfce($body);
} catch (Exception $e) {
    echo 'Exception when calling NfceApi->emitirNfce: ', $e->getMessage(), PHP_EOL;
}

function get_oauth2_token($auth_url, $client_id, $client_secret, $scope) {
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $auth_url);
    curl_setopt($curl, CURLOPT_POST, TRUE);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query(array(        
        'grant_type' => 'client_credentials', 
        'scope' => $scope,  
    )));

    $headers[] = "Authorization: Basic " . base64_encode($client_id . ":" . $client_secret);
    $headers[] = "Content-Type: application/x-www-form-urlencoded";
    curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);

    $response = curl_exec($curl);
    $err = curl_error($curl);

    curl_close($curl);
    if ($err) {
        echo "cURL Error #:" . $err;
    } else {
        return json_decode($response);
    }
}
?>

Na parte de pegar a exception tente isso:

catch (\GuzzleHttp\Exception\RequestException $ex) {
     echo $ex->getResponse()->getBody()->getContents(); 
}

Se estiver desenvolvendo no Windows, recomendo ainda instalar o Fiddler e inspecionar o retorno da chamada direto nele.

Informações mais detalhadas para pegar o conteúdo da resposta:

Boa tarde, eu ja verifiquei aqui e mesmo com o que você passou ainda só retorna aqueles dados mesmo pelo fiddler, eu sei que o erro esta vindo do JSON agora vou ter que encontrar aonde, mas mesmo assim obrigado pela ajuda.

Bom dia eu queria saber se alguem tem alguma ideia de o que esta errado neste JSON? eu ja usei um site para validar ele e não me retornou nenhum erro, será que eu estou colocando algo que nuvem fiscal não aceita?

Bom dia, @edsocm.

Como você tem o JSON, poderia enviá-lo através de algum client rest que seja mais voltado para desenvolvedores (Postman, Insomnia, etc). Dessa forma, você conseguirá obter mais facilmente o conteúdo da resposta.

Boa noite, o erro que estava me retornando no xml e este

{
    "error": {
        "code": "ValidationFailed",
        "message": "Validation failed",
        "errors": [
            {
                "code": "SchemaValidationError",
                "message": "Element 'qUnid' is unexpected according to content model of parent element 'IPITrib'.\r\nExpecting: vIPI."
            },
            {
                "code": "SchemaValidationError",
                "message": "Element 'qBCProd' is unexpected according to content model of parent element 'PISOutr'.\r\nExpecting: vPIS."
            },
            {
                "code": "SchemaValidationError",
                "message": "Element 'qBCProd' is unexpected according to content model of parent element 'COFINSOutr'.\r\nExpecting: vCOFINS."
            }
        ]
    }
}

mesmo eu colocando zero ou null no qUnid ele me retorna este erro, saberia o por que?

Bom dia, @edsocm.

Conforme o schema XSD da NF-e, existem alguns grupos que só aceitam um subconjunto de campos. Dessa forma, os campos do subconjunto que não se enquadre nos critérios deverão ser omitidos do JSON.

A seguir, os grupos que estão relacionados às mensagens de validação que você recebeu:

Grupo do CST 00, 49, 50 e 99 do IPI

A propriedade infNFe.det[I].imposto.IPI.IPITrib só aceita um dos seguintes grupos, a depender do valor atribuído ao campo CST do IPI:

  • Informar os campos vBC e pIPI se o cálculo do IPI for por alíquota;
  • Informar os campos qUnid e vUnid se o cálculo do IPI for de valor por unidade.

Grupo PIS Outras Operações

A propriedade infNFe.det[I].imposto.PIS.PISOutr só aceita um dos seguintes grupos:

  • Informar os campos vBC e pPIS se o cálculo do PIS for em percentual;
  • Informar os campos qBCProd e vAliqProd se o cálculo do PIS for em valor.

Grupo CONFINS Outras Operações

A propriedade infNFe.det[I].imposto.COFINS.COFINSOutr só aceita um dos seguintes grupos:

  • Informar os campos vBC e pCOFINS para cálculo da COFINS em percentual;
  • Informar os campos qBCProd e vAliqProd para cálculo da COFINS em valor.

Referências: