Ir para conteúdo
Fórum Script Brasil
  • 0

retorno do shopline itaú


mhfferreira

Pergunta

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&oacute;digo da empresa diferente de 26 posi&ccedil;&otilde;es');
        } // if
        if (strlen($chave) != $this->TAM_CHAVE) {
            throw new Exception('Tamanho da chave diferente de 16 posi&ccedil;&otilde;es');
        } // if
        if ((int) $pedido == 0 || (int) $pedido > 99999999) {
            throw new Exception('N&uacute;mero do pedido inv&aacute;lido');
        } // if
            if (!preg_match('!^\d{2,8}\,\d{2}$!', $valor)) {
                throw new Exception('Valor da compra inv&aacute;lido. Formato [000000]00,00');
        } // if
        if ((int) $codigoInscricao < 1 || (int) $codigoInscricao > 2) {
            throw new Exception('C&oacute;digo de inscri&ccedil;&atilde;o inv&aacute;lido');
        } // if
        if (($numeroInscricao = preg_replace('!\D!', '', $numeroInscricao)) && strlen($numeroInscricao) > 14) {
            throw new Exception('N&uacute;mero de inscri&ccedil;&atilde;o inv&aacute;lido');
        } // if
        if (($cepSacado = preg_replace('!\D!', '', $cepSacado)) && strlen($cepSacado) < 8) {
            throw new Exception('CEP inv&aacute;lido');
        } // if
        if (strlen($estadoSacado) < 2 || strlen($estadoSacado) > 2) {
            throw new Exception('O estado deve ser uma sigla de no m&aacute;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&aacute;lida');
        } // if
        if (strlen($obsAd1) > 60) {
            throw new Exception('Observa&ccedil;&atilde;o opcional #1 inv&aacute;lida');
        } // if
        if (strlen($obsAd2) > 60) {
            throw new Exception('Observa&ccedil;&atilde;o opcional #2 inv&aacute;lida');
        } // if
        if (strlen($obsAd3) > 60) {
            throw new Exception('Observa&ccedil;&atilde;o opcional #3 inv&aacute;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

Link para o comentário
Compartilhar em outros sites

5 respostass a esta questão

Posts Recomendados

  • 0

Pois é, se você reparar as mensagens no site do Caio são bem antigas, há uma ou outra nova.

Isso significa que o Shopline continua um desastre. Estou passando pelo mesmo problema há meses e ainda não consegui resposta de ninguém, muito menos do Itau.

Se você fizer um teste vai reparar que a função Decripto vai funcionar logo depois que você criptografar, mas com o DC que o banco envia para a URLRetorno não funciona.

Estou fazendo vários testes, se eu conseguir resolver vou postar a solução.

Link para o comentário
Compartilhar em outros sites

  • 0

Existe um erro na tradução do Java para o PHP em duas funções. Basta substituir as funções Desconverte e decripto pelas funções abaixo que o decripto passa a funcionar normalmente ... !!!

function Desconverte($s)                                                    
        {                                                                           
            $s1 = "";                                                                  
            $sL=   strlen($s);                                                      
            for($i = 0; $i < $sL; $i++)                                                
            {                                                                       
                $s2 = "";                                                           
                for($c = substr($s, $i, 1); is_numeric($c); $c = substr($s, $i, 1)) 
                {                                                                   
                    $s2 = $s2 . substr($s, $i, 1);                                  
                    $i++;                                                           
                }                                                                   
                if(strlen($s2) !=0)                                                 
                {                                                                   
                    $j = chr($s2);                                                  
                    $s1 = $s1 . $j;                                                 
                }                                                                   
            }                                                                       
                                                                                    
            return $s1;                                                             
        }      

function decripto($s, $s1)
        {
            $s = $this->Desconverte($s);
            $s2 = $this->Algoritmo($s, $s1);
            $this->codEmp = substr($s2, 0, 26);
            $this->numPed = substr($s2, 26, 8);
            $this->tipPag = substr($s2, 34, 2);
            return $s2;
        }

Editado por Ricardo Gudwin
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...