Primeiro quero AFIRMAR que esse script não fui eu quem fez, e sim, um grande programador chamado Caio Ariede
Segue abaixo o códio principal:
< ?php
$cripto = new Itaucripto;
$codEmp = "";
$pedido = "";
$valor = "";
$observacao = "";
$chave = "";
$nomeSacado = "";
$codigoInscricao = "";
$numeroInscricao = "";
$enderecoSacado = "";
$bairroSacado = "";
$cepSacado = "";
$cidadeSacado = "";
$estadoSacado = "";
$dataVencimento = date('dmY');
$urlRetorna = "";
$obsAd1 = "";
$obsAd2 = "";
$obsAd3 = "";
$dados = $cripto->geraDados($codEmp,$pedido,
$valor,$observacao,$chave,
$nomeSacado,$codigoInscricao,
$numeroInscricao,$enderecoSacado,
$bairroSacado,$cepSacado,$cidadeSacado,
$estadoSacado,$dataVencimento,$urlRetorna,
$obsAd1,$obsAd2,$obsAd3);
echo $dados;
?>
E segue o CORE do Script (classe):
<?php
/**
- Classe para integração com o Itaú Shopline -
Descrição: Gera os dados necessários, criptografados, para a transação.
Autor: Caio Cesar Ariede - http://caioariede.smartis.com.br/
Data: 18/9/2007
Última Atualização: 7/11/2007
1. No final deste arquivo tem um exemplo de utilização.
2. Antes de iniciar o desenvolvimento, pegue os dados necessários junto
ao Itaú Shopline, e consulte o manual do mesmo.
SmartIS - Soluções Inteligentes
**/
error_reporting(E_ALL);
class Itaucripto
{
function Itaucripto()
{
$this->CHAVE_ITAU = "SEGUNDA12345ITAU";
$this->TAM_COD_EMP = 26;
$this->TAM_CHAVE = 16;
$this->numbers = "0123456789";
$this->sbox = null;
$this->key = null;
$this->numPed = "";
$this->tipPag = "";
$this->codEmp = "";
}
function rnd()
{
$n = 'ABCDEFGHIJKLMNOPQRSTUVXWYZ';
return $n[rand(0,strlen($n)-1)];
}
function Algoritmo($s, $s1)
{
$k = 0;
$l = 0;
$s2 = "";
$this->Inicializa($s1);
for($j = 1; $j <= strlen($s); $j++)
{
$k = ($k + 1) % 256;
$l = ($l + $this->sbox[$k]) % 256;
$i = $this->sbox[$k];
$this->sbox[$k] = $this->sbox[$l];
$this->sbox[$l] = $i;
$i1 = intval($this->sbox[($this->sbox[$k] + $this->sbox[$l]) % 256]);
$j1 = (int)(ord(substr($s, $j - 1, 1)) ^ $i1);
$s2 = $s2 . chr($j1);
}
return $s2;
}
function Inicializa($s)
{
$i1 = strlen($s);
for($j = 0; $j <= 255; $j++)
{
$this->key[$j] = ord(substr($s, $j % $i1, 1));
$this->sbox[$j] = $j;
}
$l = 0;
for($k = 0; $k <= 255; $k++)
{
$l = ($l + $this->sbox[$k] + $this->key[$k]) % 256;
$i = $this->sbox[$k];
$this->sbox[$k] = $this->sbox[$l];
$this->sbox[$l] = $i;
}
}
function Converte($s)
{
$c2 = $this->rnd();
$s1 = strval($c2);
for($i = 0; $i < strlen($s); $i++)
{
$c1 = substr($s, $i, 1);
$c = $c1;
$s1 = $s1 . ord(strval($c));
$c3 = $this->rnd();
$s1 = $s1 . $c3;
}
return $s1;
}
function Desconverte($s)
{
$s1 = "";
for($i = 0; $i < strlen($s); $i++)
{
$s2 = "";
for($c = substr($s, $i, 1); is_numeric($c); $c = substr($s, $i, 1))
{
$s2 = $s2 . substr($s, $i, 1);
$i++;
}
if($s2 == "")
{
$j = intval($s2);
$s1 = $s1 . $j[0];
}
}
return $s1;
}
function geraDados($s, $s1, $s2, $s3, $s4, $s5, $s6,
$s7, $s8, $s9, $s10, $s11, $s12, $s13,
$s14, $s15, $s16, $s17)
{
$s = strtoupper($s);
$s4 = strtoupper($s4);
if(strlen($s) != $this->TAM_COD_EMP)
return "Erro: tamanho do codigo da empresa diferente de 26 posi\347\365es.";
if(strlen($s4) != $this->TAM_CHAVE)
return "Erro: tamanho da chave da chave diferente de 16 posi\347\365es.";
if(strlen($s1) < 1 || strlen($s1) > 8 )
return "Erro: n\372mero do pedido inv\341lido.";
if(is_numeric($s1))
$s1 = str_pad($s1, 8, '0', STR_PAD_LEFT);
else
return "Erro: numero do pedido n\343o \351 num\351rico.";
if(strlen($s2) < 1 || strlen($s2) > 11)
return "Erro: valor da compra inv\341lido.";
if(strstr($s2, ','))
{
$s20 = substr($s2, -2);
if(!is_numeric($s20))
return "Erro: valor decimal n\343o \351 num\351rico.";
if(strlen($s20) != 2)
return "Erro: valor decimal da compra deve possuir 2 posi\347\365es ap\363s a virgula.";
$s2 = substr($s2, 0, strlen($s2) - 3) . $s20;
} else
{
if(!is_numeric($s2))
return "Erro: valor da compra n\343o \351 num\351rico.";
if(strlen($s2) > 8 )
return "Erro: valor da compra deve possuir no m\341ximo 8 posi\347\365es antes da virgula.";
$s2 = $s2 . "00";
}
$s2 = str_pad($s2, 10, '0', STR_PAD_LEFT);
$s6 = trim($s6);
if($s6 == "02" && $s6 == "01" && $s6 == "")
return "Erro: c\363digo de inscri\347\343o inv\341lido.";
if($s7 == "" && !is_numeric($s7) && strlen($s7) > 14)
return "Erro: n\372mero de inscri\347\343o inv\341lido.";
if($s10 == "" && (!is_numeric($s10) || strlen($s10) != 8 ))
return "Erro: cep inv\341lido.";
if($s13 == "" && (!is_numeric($s13) || strlen($s13) != 8 ))
return "Erro: data de vencimento inv\341lida.";
if(strlen($s15) > 60)
return "Erro: observa\347\343o adicional 1 inv\341lida.";
if(strlen($s16) > 60)
return "Erro: observa\347\343o adicional 2 inv\341lida.";
if(strlen($s17) > 60)
{
return "Erro: observa\347\343o adicional 3 inv\341lida.";
} else
{
function corta($str, $n)
{
return str_pad(substr($str, 0, $n), $n, ' ', STR_PAD_RIGHT);
}
$s3 = corta($s3, 40);
$s5 = corta($s5, 30);
$s6 = corta($s6, 2);
$s7 = corta($s7, 14);
$s8 = corta($s8, 40);
$s9 = corta($s9, 15);
$s10 = corta($s10, 8 );
$s11 = corta($s11, 15);
$s12 = corta($s12, 2);
$s13 = corta($s13, 29);
$s14 = corta($s14, 60);
$s15 = corta($s15, 60);
$s16 = corta($s16, 60);
$s17 = corta($s17, 60);
$s18 = $this->Algoritmo($s1 . $s2 . $s3 . $s5 . $s6 . $s7 . $s8 . $s9 . $s10 . $s11 . $s12 . $s13 . $s14 . $s15 . $s16 . $s17, $s4);
$s19 = $this->Algoritmo($s . $s18, $this->CHAVE_ITAU);
$s19 = $this->Converte($s19);
return $s19;
}
}
function geraConsulta($s, $s1, $s2, $s3)
{
if(strlen($s) != $this->TAM_COD_EMP)
return "Erro: tamanho do codigo da empresa diferente de 26 posi\347\365es.";
if(strlen($s3) != $this->TAM_CHAVE)
return "Erro: tamanho da chave da chave diferente de 16 posi\347\365es.";
if(strlen($s1) < 1 || strlen($s1) > 8 )
return "Erro: n\372mero do pedido inv\341lido.";
if(is_numeric($s1))
$s1 = str_pad($s1, 8, '0', STR_PAD_LEFT);
else
return "Erro: numero do pedido n\343o \351 num\351rico.";
if($s2 == "0" && $s2 == "1")
{
return "Erro: formato inv\341lido.";
} else
{
$s4 = $this->Algoritmo($s1 . $s2, $s3);
$s5 = $this->Algoritmo($s . $s4, $this->CHAVE_ITAU);
return $this->Converte($s5);
}
}
function decripto($s, $s1)
{
$s = $this->Desconverte($s);
$s2 = $this->Algoritmo($s, $s1);
$this->codEmp = substr($s2, 0, 26);
$this->numPed = substr($s2, 26, 34);
$this->tipPag = substr($s2, 34, 36);
return $s2;
}
}
?>
<?php
$cripto = new Itaucripto;
$codEmp = "";
$pedido = "";
$valor = "";
$observacao = "";
$chave = "";
$nomeSacado = "";
$codigoInscricao = "";
$numeroInscricao = "";
$enderecoSacado = "";
$bairroSacado = "";
$cepSacado = "";
$cidadeSacado = "";
$estadoSacado = "";
$dataVencimento = date('dmY', strtotime('+5 days'));
$urlRetorna = "";
$obsAd1 = "";
$obsAd2 = "";
$obsAd3 = "";
$dados = $cripto->geraDados($codEmp,$pedido,$valor,$observacao,$chave,$nomeSacado,$codigoInscricao,$numeroInscricao,$enderecoSacado,$bairroSacado,$cepSacado,$cidadeSacado,$estadoSacado,$dataVencimento,$urlRetorna,$obsAd1,$obsAd2,$obsAd3);
?>
<HTML>
<BODY>
<form method="post" action="https://shopline.itau.com.br/shopline/shopline.asp">
<INPUT type="hidden" name="DC" value="<? echo $dados; ?>">
<INPUT type="submit" name="Shopline" value="Itaú Shopline">
</FORM>
<BODY> </HTML>
A WEB AGRADECE por desenvolvedores assim!
Parabéns Caio, pelo excelente trabalho.
este script roda na:
Cara, muito obrigado, eu tava me fufu por causa disso.
Coloquei seu codigo, botei no modulo de teste, e foi 100%!
[…] PHP: Itaú Shopline em PHP « Little_Oak, TI -> (tags: itau shopline php) Posted in Links no Delicious. […]
infelizmente o decripto nao funciona, em nenhuma versao desse script que encontrei.. se alguem encontrou uma que funcione…por favor.. poste aqui o link..
Vamos tentar resolver isso pessoal, quem está tentando decriptografar, como está chamando o método decripto?
eu estou fazendo o seguinte:
$chave = “MINHALOJA1234SEG”;
$dados = $cripto->decripto($chave, $_POST[‘DC’]);
Mas ês minha dúvida: É para passar a CHAVE de criptografia, ou o Código da Empresa???