PHP: Itaú Shopline em PHP

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:


Publicado em: PHP

35 comentários sobre “PHP: Itaú Shopline em PHP

  1. Rodrigo disse:

    infelizmente o decripto nao funciona, em nenhuma versao desse script que encontrei.. se alguem encontrou uma que funcione…por favor.. poste aqui o link..

  2. Lucas Martins disse:

    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???

  3. Marcio Rosa disse:

    Salve galera!

    Descobri o motivo do erro desse bendito Itaucripto. Na verdade o erro não é dele, é que o PHP não localiza os arquivos .class mas sim .jar
    Então para resolver o problema basta transformar o Itau.Itaucripto em um jar (transformei em Itau.zip sem compactacao nenhuma, depois renomeei para Itau.jar e salvei na pasta extensions do PHP).

    No PHP.ini fica assim:
    [Java]
    java.class.path = “D:\Arquivos de programas\php\extensions\php_java.jar;D:\Arquivos de programas\php\extensions\Itau.jar”

    Espero ter ajudado, poi perdi umas boas horas até descobrir isso.

    Que Deus abençoe a todos!

  4. Helena disse:

    Boa tarde pessoal… alguém conseguiu ler o retorno do itaú? a classe que estou usando é a do Caio… (a mesma postada aqui) mas o decripto não funciona…
    preciso disso urgente… alguém pode me ajudar?
    Obrigada

  5. Ricardo Gudwin disse:

    O decripto não funciona porque a tradução de Java para PHP está com defeito em duas funções. Basta trocar o código das seguintes funções para que tudo funcione como deve.

    function Desconverte($s)
    {
    $s1 = “”;
    $sL= strlen($s);
    for($i = 0; $i 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;
    }

  6. Ricardo Gudwin disse:

    O decripto não funciona porque a tradução de Java para PHP está com defeito em duas funções. Basta trocar o código das seguintes funções para que tudo funcione como deve.

    function Desconverte($s)
    {
    $s1 = “”;
    $sL= strlen($s);
    for($i = 0; $i \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;
    }

  7. Ricardo Gudwin disse:

    O wordpress está comendo todo o código depois do “menor” … como fazer para postar comentários com o menor ? Ele está tentando interpretar o código como HTML …. rss

  8. Ricardo Gudwin disse:

    O decripto não funciona porque a tradução de Java para PHP está com defeito em duas funções. Basta trocar o código das seguintes funções para que tudo funcione como deve.

    Testando … para ver se o código correto agora vai ….

    function Desconverte($s)
    {
    $s1 = “”;
    $sL= strlen($s);
    for($i = 0; $i 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;
    }

  9. Ricardo Gudwin disse:

    O decripto não funciona porque a tradução de Java para PHP está com defeito em duas funções. Basta trocar o código das seguintes funções para que tudo funcione como deve.

    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;
    }

  10. Filipi Santana de Assis disse:

    Bom dia,

    Utilizei esse script e no retorno do Itaú falou que a Loja não está cadastrada no sistema.

    P.S: Eu utilizei os códigos referenciados pelo banco de forma correta. Alguém já passou por isso?

  11. Rafael Lain disse:

    Estou usando essa classe e está me dando erro 9, duvido que seja a classe, mas existe a possibilidade? Mais alguem esta tendo esse problema?

  12. Marlon disse:

    A descripto sua tb não funciona, alias a decripto de nenhum de vocês funciona….continua a busca…senão precisarei fazer mesmo.

    • gabrielrcouto disse:

      Marlon, fiz o commit de uma nova versão, o problema é que as pessoas estavam usando a chave do itau com as letras em minúsculo. Testado e funcionando ;-)

      • Jefferson C Souza disse:

        Gabriel, tudo bom? Obrigado pelo seu código me ajudou bastante,
        mas estou com uma dificuldade, quando faço a consulta, o xml é gerado na página do itaú, como eu faço para pegar estes dados? tem alguma coisa que eu tenha que habilitar no php.ini ? ou tem algum código ? você conseguiu gerar o xml? vi no manual que tem como o banco gerar em arquivo txt de remessa e te enviar, mas sabe como faz isto? ou pelo arquivo txt ou pelo xml ?

      • gabrielrcouto disse:

        Putz, vou ficar te devendo essa Jefferson, fiz essa biblioteca 3 anos atrás e não utilizei esse fluxo.

  13. Marcelo Carneiro disse:

    Também estou recebendo o Erro 9 Contate o Atendimento CESE. Usei a sua classe mais recente em PHP, Gabriel. O código da empresa e a chave estão ok.

    • gabrielrcouto disse:

      Marcelo, fiz o commit de uma nova versão, o problema é que as pessoas estavam usando a chave do itau com as letras em minúsculo. Testado e funcionando ;-)

  14. zata2ltb disse:

    Essa parte esta incorreta:
    if($s6 == “02” && $s6 == “01” && $s6 == “”)
    Nunca vai chegar ai porque o $s6 nunca vai conter os 3 valores ao mesmo tempo

    O correto seria:
    if($s6 != ’02’ && $s6 != ’01’ && $s6 !=”){

    Estou correto? Rs

    (no java)
    if(s6.compareTo(“02”) != 0 && s6.compareTo(“01”) != 0 && s6.compareTo(“”) != 0)

    o compareTo() no java retorna 0 caso esteja identico, então s6.compareTo(“02”) !=0 esta perguntando se o s6 for diferente de 02.

  15. Jefferson C Souza disse:

    Não precisa usar o descripto, solicite os dados via txt ou xml, estou tentando fazer isto pelo xml consegui fazer gerar na tela o xml, mas não consegui recuperar os dados do xml ainda porque ele gera o xml na página do itau. alguém conseguiu ler o xml ?

  16. Sovarais Varais disse:

    BOA TARDE! PESSOAL
    a hospedagem onde esta loja virtual é compartilhada, e não permite rodar (JAVA),como eu faço para PHP abrir pagina consulta de pagamentos e consulta retorno dados xml ou mesmo no php.

    se alguém puder me ajudar.

    grato

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s