Salve paulo,
Há algum tempo, quando iniciava na 2.00, adaptei um arquivo que fazia parte do projeto para o cálculo da chave...
Não sei se te ajuda mas seguem as rotinas e o arquivo em anexo.
-----------------------
/**
* criaChave
* @param number $cUF codigo da unudade da federação do IBGE
* @param string $aamm ano e mes douis últimos digitos do ano e o mes com 2 digitos
* @param string $cnpj
* @param number $serie numero da série da nfe
* @param number $numero numero da nfe
* @return string chave da nfe com 44 digitos
*/
function criaChave($cUF,$aamm,$cnpj,$serie,$numero,$tpEmis){
$rNum = '';
for( $x=0;$x<8;$x++ ){
$rNum .= rand(0,8);
}
$modelo = '55';
$serie = str_pad($serie, 3, "0", STR_PAD_LEFT);
$numero = str_pad($numero, 9, "0", STR_PAD_LEFT);
$chave = $cUF . $aamm . $cnpj . $modelo . $serie . $numero. $tpEmis . $rNum;
$chave = $chave . calcDV($chave);
return $chave;
}
/**
* calcDV
* @param string $chave com 43 digitos
* @return variant numero do digito verificador ou null
*/
function calcDV($chave){
$n = strlen($chave);
$aPeso = array(4,3,2,9,8,7,6,5,4,3,2,9,8,7,6,5,4,3,2,9,8,7,6,5,4,3,2,9,8,7,6,5,4,3,2,9,8,7,6,5,4,3,2);
if ($n != 43){
echo "Erro na chave comprimento errado!!!";
return null;
}
$aChave = str_split($chave);
$soma = 0;
for($x = 0; $x < $n; $x++){
$prod = $aPeso[$x] * $aChave[$x];
$soma += $aPeso[$x] * $aChave[$x];
//echo $aPeso[$x] . ' * ' . $aChave[$x] . ' = ' . $prod .'<BR>';
}
$resto = $soma%11;
if ($resto == 0 || $resto == 1){
$dv = 0;
} else {
$dv = 11-$resto;
}
return $dv;
}
-----------------------
Abraços,
--
+55 21 7868-4741 / 55*12*2808
Bruno Bastos
Rio de Janeiro - Brasil