Archive for January, 2008

PHP: Itaú Shopline em PHP

Wednesday, January 16th, 2008

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:


Fedora 8: Apache 2 + PHP5 + Mysql 5 + PHPMYadmin

Wednesday, January 9th, 2008

Hoje eu rodei igual um bicho atrás de informações sobre Apache 2 + PHP5 + Mysql 5 + PHPMyadmin para o meu Fedora 8, e agora, às 00:00 que consegui fazer tudo o que eu queria. Como sempre, é nosso prazer ajudar-lhe com o que há de mais simples em artigos e informações.

Terreno

Necessidade de instalação do LAMP2 em meu PC. Ter uma internet bacana, ou “bacaninha”.

Partindo para cima

Primeiros passos (creio que você já atulizou seu fedora 8) sempre devem ser checagens simples. Rode os comandos abaixo como root:

yum -y install httpd php mysql mysql-server php-mysql

Esse comando aí instala o apache 2.2.6, php 5.2.4 e mysql 5.0.45 e já integra os serviços entre si.

Para fazer com que os serviços rodem automaticamente, usemos os comandos abaixo:

/sbin/chkconfig httpd on
/sbin/chkconfig –add mysqld
/sbin/chkconfig mysqld on
Para startar os serviços use os comandos:

/sbin/service httpd start
/sbin/service mysqld start

Para ajustar o password do mysql use o comando:

mysqladmin -u root password ‘new-password’
Para “adicionar” alguma segurança ao mysql, use:

mysql -u root -p
mysql> DROP DATABASE test;
mysql> DELETE FROM mysql.user WHERE user = ”;
mysql> FLUSH PRIVILEGES;

Para ver se rodou legal, vá em /var/www/html/ e crie um arquivo index.php e coloque o conteúdo abaixo dentro dele:

<?php
phpinfo();
?>

Para testar, abra o firefox e coloque o endereço –> http://localhost/
Se for exibida a diretiva completa do php.ini, MARAVILHA, se não, volte para o início deste tutorial.
Agora o mr PHPMYAdmin, para ajusta-lo use o comando abaixo:

yum install phpmyadmin
Feito isso, copie o diretório da forma que eu farei:

cp -r /usr/share/phpMyAdmin/ /var/www/html/

Pronto, o phpmyadmin pode ser acessado da seguinte forma em seu Firefox (eu espero que seja ele):

http://localhost/phpMyAdmin/

Espero ter ajudado e algo, talvez possa ser útil.