olá pessoal... estou ficando quase louca aqui... depois de muito quebrar a cabeça, localizei um artigo na net ótimo que converte a DLL que o itaú fornece pra integração de sites com o shopline... graças ao CAIO.... meu site tá comunicando com o itaú... até gerou boletos em minha conta... td ok... ele me dá o retorno, só que meu problema está aí... esse retorno vem criptografado e eu não estou conseguindo decriptá-lo... o função que tenho não está funcionando... pelo - comigo... Alguém que já desenvolveu essa integração pode me ajudar? existe a DLL ou a CLASS... mas não consegui usá-las ... o que melhor funcionou foi mesmo a em php.... além de que meu SO é Windows... e do servidor onde a página é hospedada é Linux... e DLL não funciona em Linux.... Obrigada.... abaixo estou postando o código que o Caio me passou... (ah... já pedi ajuda pra ele, mas acredito que não está lendo o forum onde o encontrei pois não me respondeu ainda....) essa é a minha classe_iatu.php <?php
class Itaucripto {
public $codEmp;
public $pedido;
public $valor;
public $observacao;
public $nomeSacado;
public $codigoInscricao;
public $numeroInscricao;
public $enderecoSacado;
public $bairroSacado;
public $cepSacado;
public $cidadeSacado;
public $estadoSacado;
public $dataVencimento;
public $urlRetorna;
public $obsAd1;
public $obsAd2;
public $obsAd3;
private $CHAVE_ITAU = 'SEGUNDA12345ITAU';
private $TAM_COD_EMP = 26;
private $TAM_CHAVE = 16;
private $sbox;
private $key;
private function Algoritmo($s, $s1) {
$k = 0;
$l = 0;
$r = '';
$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 = $this->sbox[($this->sbox[$k] + $this->sbox[$l]) % 256];
$j1 = ord(substr($s, $j - 1, 1)) ^ $i1;
$r = $r.chr($j1);
} // for
return $r;
} // function Algoritmo
private function Inicializa($s) {
$len = strlen($s);
for ($j = 0; $j <= 255; $j++) {
$this->key[$j] = ord(substr($s, $j % $len, 1));
$this->sbox[$j] = $j;
} // for
$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;
} // for
} // function Inicializa
private function Converte($s) {
for($i = 0, $r = chr(rand(65, 90)); $i < strlen($s); $i++) {
$r = $r.ord(strval(substr($s, $i, 1))).chr(rand(65, 90));
} // for
return $r;
} // function Converte
private function Desconverte($s) {
return join(array_map('chr', split('[A-Z]', substr(substr($s, 1), 0, strlen($s) - 2))));
} // function Desconverte
private function Corta($str, $n) {
return str_pad(substr($str, 0, $n), $n, ' ', STR_PAD_RIGHT);
} // function Corta
public function geraDados($codEmp,$pedido,$valor,$obs,$chave,$nomeSacado,$codigoInscricao,$numeroInscricao,
$enderecoSacado,$bairroSacado,$cepSacado,$cidadeSacado,$estadoSacado,$dataVencimento,$urlRetorna,$obsAd1,$obsAd2,
$obsAd3) {
if (strlen($codEmp) != $this->TAM_COD_EMP) {
throw new Exception('Tamanho do código da empresa diferente de 26 posições');
} // if
if (strlen($chave) != $this->TAM_CHAVE) {
throw new Exception('Tamanho da chave diferente de 16 posições');
} // if
if ((int) $pedido == 0 || (int) $pedido > 99999999) {
throw new Exception('Número do pedido inválido');
} // if
if (!preg_match('!^\d{2,8}\,\d{2}$!', $valor)) {
throw new Exception('Valor da compra inválido. Formato [000000]00,00');
} // if
if ((int) $codigoInscricao < 1 || (int) $codigoInscricao > 2) {
throw new Exception('Código de inscrição inválido');
} // if
if (($numeroInscricao = preg_replace('!\D!', '', $numeroInscricao)) && strlen($numeroInscricao) > 14) {
throw new Exception('Número de inscrição inválido');
} // if
if (($cepSacado = preg_replace('!\D!', '', $cepSacado)) && strlen($cepSacado) < 8) {
throw new Exception('CEP inválido');
} // if
if (strlen($estadoSacado) < 2 || strlen($estadoSacado) > 2) {
throw new Exception('O estado deve ser uma sigla de no máximo 2 caracteres (UF)');
} // if
if (!preg_match('!^(3[0-1]|0[1-9]|[1-2][0-9])(0[1-9]|1[0-2])2[0-9]{3}$!', $dataVencimento)) {
throw new Exception('Data de vencimento inválida');
} // if
if (strlen($obsAd1) > 60) {
throw new Exception('Observação opcional #1 inválida');
} // if
if (strlen($obsAd2) > 60) {
throw new Exception('Observação opcional #2 inválida');
} // if
if (strlen($obsAd3) > 60) {
throw new Exception('Observação opcional #3 inválida');
} // if
$codEmp = strtoupper($codEmp);
$valor = substr($valor, 0, strlen($valor) - 3).substr($valor, -2);
$valor = str_pad($valor, 10, '0', STR_PAD_LEFT);
$pedido = str_pad($pedido, 8, '0', STR_PAD_LEFT);
$obs = $this->Corta($obs, 40);
$nomeSacado = $this->Corta($nomeSacado, 30);
$codigoInscricao = $this->Corta($codigoInscricao, 2);
$numeroInscricao = $this->Corta($numeroInscricao, 14);
$enderecoSacado = $this->Corta($enderecoSacado, 40);
$bairroSacado = $this->Corta($bairroSacado, 15);
$cepSacado = $this->Corta($cepSacado, 8);
$cidadeSacado = $this->Corta($cidadeSacado, 15);
$estadoSacado = $this->Corta($estadoSacado, 2);
$dataVencimento = $this->Corta($dataVencimento, 29);
$urlRetorna = $this->Corta($urlRetorna, 60);
$obsAd1 = $this->Corta($obsAd1, 60);
$obsAd2 = $this->Corta($obsAd2, 60);
$obsAd3 = $this->Corta($obsAd3, 60);
$chave = strtoupper($chave);
$ret_DC = $pedido . $valor . $obs . $nomeSacado . $codigoInscricao . $numeroInscricao . $enderecoSacado . $bairroSacado . $cepSacado . $cidadeSacado . $estadoSacado . $dataVencimento . $urlRetorna . $obsAd1 . $obsAd2 . $obsAd3;
$ret_DC = $this->Algoritmo($ret_DC, $chave);
$ret_DC = $this->Algoritmo($codEmp.$ret_DC, $this->CHAVE_ITAU);
return $this->Converte($ret_DC);
} // function geraDados
private function decripto($ret_DC, $chave) {
$s = $this->Desconverte($ret_DC);
$s = $this->Algoritmo($s, $this->CHAVE_ITAU);
$this->codEmp = substr($s, 0, 26);
$s = $this->Algoritmo(substr($s, 26), $chave);
$this->pedido = substr($s, 0, 8);
$this->valor = substr($s, 8, 10);
$this->observacao = substr($s, 18, 40);
$this->nomeSacado = substr($s, 58, 30);
$this->codigoInscricao = substr($s, 88, 2);
$this->numeroInscricao = substr($s, 90, 14);
$this->enderecoSacado = substr($s, 104, 40);
$this->bairroSacado = substr($s, 144, 15);
$this->cepSacado = substr($s, 159, 8);
$this->cidadeSacado = substr($s, 167, 15);
$this->estadoSacado = substr($s, 182, 2);
$this->dataVencimento = substr($s, 184, 29);
$this->urlRetorna = substr($s, 213, 60);
$this->obsAd1 = substr($s, 273, 60);
$this->obsAd2 = substr($s, 333, 60);
$this->obsAd3 = substr($s, 393, 60);
$this->valor = number_format((int) $this->valor / 100, 2, ',', '.');
} // function decripto
} // class Itaucripto
?>
essa é a minha classe_iatu.php
<?php
include('../ecommerce/classe_itau.php');
$cripto = new Itaucripto;
$codEmp = "XXXXXXXXXXXXXXXXXXXXXXXXXX";
$pedido = $_SESSION['CONSUMIDOR']['PEDIDO'];
$valor = "01,00";
$observacao = "";
$chave = "XXXXXXXXXXXXXXXX";
$nomeSacado = "Maria Helena";
$codigoInscricao = "";
$numeroInscricao = "";
$enderecoSacado = "meu endereco";
$bairroSacado = "meu bairro";
$cepSacado = "80000000";
$cidadeSacado = "Curitiba";
$estadoSacado = "PR";
$dataVencimento = date('dmY', strtotime('+1 day'));
$urlRetorna = "/ecommerce/ret_itau.php";
$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 "<form name='form_pgto_itau' id='form_pgto_itau' action='https://shopline.itau.com.br/shopline/shopline.asp' method='post' onsubmit=pg_itau() target='SHOPLINE'>
echo "<form name='form_pgto_itau' id='form_pgto_itau' action='https://shopline.itau.com.br/shopline/emissao_teste.asp' method='post' onsubmit=pg_itau() target='SHOPLINE'>
<input type='hidden' name='DC' value='".$dados."'>
<input type='submit' name='Shopline' value='Itaú Shopline'>
</form>";
?>
meu ret_itau.php
<?php
include('../ecommerce/classe_itau.php');
$dados = '';
$chave = "XXXXXXXXXXXXXXXX";
$codEmp = '';
$pedido = '';
$tipPag = '';
$retorno = $_POST['DC'];
$cripto = new Itaucripto;
$dados = $cripto->decripto($retorno,$chave);
$codEmp = $cripto->retornaCodEmp;
$pedido = $cripto->retornaPedido;
$tipPag = $cripto->retornaTipPag;
echo 'ret '.$retorno.'<br>dados '.$dados.'<br>cod ' .$codEmp.'<br>ped '.$pedido.'<br>pag '.$tipPag;
?>
<html>
<head>
<title> Retorno Online </title>
</head>
<body>
<h1>Dados recebidos</h1>
<br>
</body>
</html> desculpem... o nome correto do 1º código é classe_itau.php e o segundo código é a minha chamada a tela do shopline do itau