novembro 2010 novembro 2010 índice Editorial InfoNews 04 Em setembro último, tivemos o lançamento da nova suíte RAD da Embarcadero, o RAD Studio XE. Claro que a Embarcadero... Delphi 05 Utilizando FinalBuilder com o novo Delphi XE Autor: Vitor M. Rodrigues Autor:Antonio Spitaleri .NET 17 Métodos de Criptografia Certificação Digital para CT-e Autor: Bruno Alcarás Autor: Victory Fernandes Dicas - Dicas Delphi 08 Delphi Conference 2010 Delphi 12 Delphi 20 Boletos e cartões na Web Autor: Luciano Pimenta Desafio The Club 28 - Cruzada 30 Legenda Iniciante Intermediário Avançado novembro 2010 03 Bem-vindo E m setembro último, tivemos o lançamento da nova suíte RAD da Embarcadero, o RAD Studio XE. Claro que a Embarcadero, como já se tornou tradição, promoveu um evento para divulgar e mostrar as novidades dessa nova suíte. Trata-se do Delphi Conference, que esse ano ocorreu no dia 26 de outubro. Nós do The Club estivemos presentes e para relatar como foi o evento, Vitor Manuel Rodrigues traz na abertura da revista uma matéria especial mostrando tudo o que foi abordado, as palestras, mini-cursos, enfim uma geral nesse grande evento. Na sequência, para seguirmos com o foco no Delphi XE, trago para vocês o artigo “Utilizando Final Builder com o novo Delphi XE”, que mostra mais uma das ferramentas agregadas ao novo Delphi para produzir maior agilidade ao desenvolvimento. Com o crescimento do mercado de TI, a segurança de dados tem sido cada vez mais um motivo de preocupação dos desenvolvedores. Para ajudar quem necessita implementar proteção em seus sistemas, nosso consultor Bruno Alcarás traz o artigo “Métodos de Criptografia”, onde nos mostra as formas de criptografia de dados mais utilizadas atualmente. Este mês temos a volta de nosso colaborador Victory Fernandes na reedição do artigo “Certificação Digital para CT-e”, essa reedição prepara o terreno para as matérias que virão sobre esse assunto tão importante atualmente. Para fechar, nosso colaborador Luciano Pimenta, mostra como gerar boletos bancários e trabalhar com pagamento via cartão de crédito em ASP. NET no artigo “Boletos e cartões na Web”. Gostaria de reiterar em nome de toda a equipe The Club os parabéns ao pessoal da Embarcadero pelo grande profissionalismo na criação e condução do Delphi Conference 2010. Av. Profº Celso Ferreira da Silva, 190 Jd. Europa - Avaré - SP - CEP 18.707-150 Informações: (14) 3732-1529 Suporte: (14) 3733-1588 Internet http://www.theclub.com.br Cadastro: [email protected] Suporte: [email protected] Informações: [email protected] Skype Cadastro: theclub_cadastro Skype Suporte: theclub_linha1 theclub_linha2 theclub_linha3 www.twitter.com/theclubbr Copyright The Club Megazine 2009 Diretor Técnico Marcos César Silva Diagramação e Arte Vitor M. Rodrigues Revisão Tassiane Fileto Colunistas Antonio Spitaleri Neto Bruno Alcarás Felipe Santos Leonora Golin Luciano Pimenta Vitor M. Rodrigues Impressão e acabamento: GRIL - Gráfica e Editora Taquarituba-SP - Tel. (14) 3762-1345 Reprodução A utilização, reprodução, apropriação, armazenamento em banco de dados, sob qualquer forma ou meio, de textos, fotos e outras criações intelectuais em cada publicação da revista “The Club Megazine” são terminantemente proibidos sem autorização escrita dos titulares dos direitos autorais. Boa leitura a todos e até dezembro! Antonio Spitaleri Neto - Editor Chefe [email protected] 04 novembro 2010 Delphi é marca registrada da Borland International, as demais marcas citadas são registradas pelos seus respectivos proprietários. InfoNews E stive presente junto com a equipe do “The Club”, no dia 26 de outubro no “Delphi Conference 2010” que aconteceu em São Paulo para a apresentação do “Delphi XE”. Mais de 600 convidados puderam conhecer em 4 salas simultâneas todas as melhorias e novidades do Delphi e da família RAD Studio XE. Para esse evento foi escalado um time de primeira para as palestras. Logo na abertura David I falou sobre novas plataformas e o futuro do Delphi. Ele fez uma demonstração de um aplicativo feito em “Delphi novembro 2010 05 C om a introdução das conferências realizada por David I e com a participação de muitos desenvolvedores, entre eles, Andreano Lanusse, Daniele Teti, Wescley Fey, Kelver Merlotti e Felipe Santos, em quatro salas simultâneas, sendo no auditório, a nota de abertura do evento e encerramento, porém tivemos na sala 1, ministrada por Felipe Santos, a apresentação do novo InterBase XE, que vêm além, com novos parâmetros de segurança que aumentam a proteção do banco, ainda conta com a heterogeneidade, ou seja, uma licença já basta para cada plataforma, além das melhorias de gerenciamento e confiabilidade das principais linguagens de banco de dados, que se dispõem, sendo possível o gerenciamento de múltiplas linguagens de SGBD para uma mesma aplicação de forma mais controlada, não necessitando mais da alternação de ferramentas para cada linguagem, e por fim, a compatibilidade com a ferramenta ToolCloud, que gerencia a execução de todas as licenças sem a necessidade de instalação nas máquinas locais, gerando uma redução do tempo na autenticação o uso e a realocação dessas licenças, do tempo de uso de múltiplas ferramentas Desktop, e a redução nos custos de implementação. E ainda foram abordadas dentro da conferencia ao decorrer das conferencias temas atuais, como o desenvolvimento para aplicativos para iPhone, o desenvolvimento para Cloud Computing da Platafoma Windows® Azure™ e a Amazon EC2, pioneiras no desenvolvimento maciço para as nuvens, além do preview do Delphi XE para MacOS X em sua versão 64 bits. Eduardo Massud Eduardo Massud, Antonio Spitaleri, Felipe Santos e Vitor Andreano Lanusse XE” rodando na nuvem e disponibilizou para os participantes acessarem durante a palestra. Isso só pra “assanhar a lombriga” da galera em relação ao poder do Delphi XE. Na “bota” Andreano Lanusse mostrou todas as novidades do Delphi XE deixando os participantes maravilhados com tantas possibilidades. Ao mesmo tempo na sala 1 Kelver Merlotti falava sobre Threads e DataSnap, na sala 2 Dario Leandro com a palestra “Quando se tem um mar06 novembro 2010 S amuel “Muka” David deu o minicurso sobre criação de componentes visuais. Demonstrou a facilidade de desenvolvimento de componentes personalizados que podem ser instalados na paleta de componentes da IDE, utilizando TGraphicControl, TCustomControl e TScrolling Win Control. Uma dica é usar o Wizard que já traz o Register. Outra é usar um package para compartilhamento de funcionalidades e para armazenar e instalar os componentes criados, pois o componente só pode ser instalado se estiver dentro de um package. E várias outras. É uma pena que não sejam disponibilizados na web. Leonora Golin D David I e Marcos aniele Teti veio da Itália para nos mostrar um pouco sobre a tecnologia Android e como podemos fazer aplicações Android “conversar” com servidores DataSnap. Android é uma tecnologia para desenvolvimento de aplicações e também atua como sistema operacional para plataformas móveis, como celulares e smartphones. Android como sistema operacional é baseado em Linux e a parte de Framework possui funcionalidades semelhantes ao Java, rodando baseado em máquina virtual. Com a possibilidade oferecida pela tecnologia DataSnap de criarmos interfaces REST, podemos criar clientes Android que acessam servidores DataSnap REST. Antonio Spitaleri telo nem tudo se torna prego, prazer sou MVC” e na sala 3 Newton Oliveira tirou a dúvida de muitos com “Implementando Nota Fiscal de serviço com Delphi XE”. Foi árdua a tarefa de decidir a qual palestra assistir no decorrer do dia. Felipe Santos destrinchou o InterBase XE com a palestra “Uma nova era do InterBase começa aqui”. Em uma conversa que tive com o Felipe ele adiantou que baseado nessa palestra teremos uma sequência de artigos publicados aqui na The Club Megazine. A primeira dessa sequência já está nesta edição. Ponto positivo para os intervalos entre as palestras onde os participantes puderam aproveitar para trocar experiências e conhecer outros usuários do Delphi. Parabéns á todos que colaboraram na organização do Delphi Conference 2010. A cada ano vocês estão se superando na realização dos eventos. Um agradecimento especial a Lisa Flores, Andreano Lanusse, David I e Ernani Augusto que sempre nos recebem muito bem nos eventos da Embarcadero. Vitor, David I, Lisa Flores e Marcos Por hora é só! Até a próxima! novembro 2010 07 Delphi Utilizando FinalBuilder com o novo Delphi XE No último mês de setembro tivemos o lançamento da nova versão das ferramentas RAD Studio da Embarcadero. Essa nova versão recebeu o nome de RAD Studio XE. desenvolvimento. Agilizar o desenvolvimento passa pela automatização de processos repetitivos no build de projetos e análise de pontos no código que podem causar lentidão. consagradas nessa área. Essas ferramentas integradas a IDE realizam as tarefas de automação de build, profiling de performance entre outras. Na suíte RAD Studio XE estão inclusos o Delphi XE, C++ Builder XE, Delphi Prism XE e RAD PHP XE. Ao contrário das últimas versões que recebiam o número do ano, como RAD Studio 2009 e 2010, neste ano a Embarcadero resolveu apostar em uma nova nomenclatura. A agilidade no desenvolvimento tem como objetivo reduzir o tempo com planejamento e análise e permitir que os programadores Delphi possam investir maior tempo na construção dos projetos. Nessa nova versão do Delphi, temos as seguintes ferramentas integradas na IDE: - AQ Time; - Code Site Preview; - Collab Net Subversion; - Final Builder. Desde seu lançamento, em 1994, a ferramenta Delphi sempre teve como principal foco a produtividade, focando na automatização de tarefas repetitivas que consomem tempo precioso do desenvolvimento. Além disso, a parte de diagramação dos projetos também recebeu grande foco por parte da Embarcadero. A geração de diagramas de classe e demais partes do projeto agora está com maior integração na IDE Delphi. Finalbuilder é a ferramenta destinada a automação do processo de build. Finalbuilder já vem sendo utilizada há algum tempo por programadores Delphi de todo o mundo, e agora está integrada ao novo Delphi. A nova versão do Delphi, incluída na suíte RAD Studio, mantém esse foco na agilidade no A parte de agilização do desenvolvimento conta com ferramentas que já são 08 novembro 2010 Nesse artigo estarei mostrando a integração da ferramenta FinalBuilder com o novo Delphi XE. FinalBuilder No dia a dia do desenvolvimento em Delphi, uma das tarefas mais importantes é o build, a construção do aplicativo a partir do código escrito. Várias ações que realizamos no build, quando estamos em projetos extensos acabam por se tornar repetitivas. É para essas situações que o Final Builder foi integrado com a IDE Delphi. O Final Builder é uma ferramenta que permite ao desenvolvedor planejar, depurar manter e executar o processo de build. Isso traz inúmeras vantagens ao desenvolvedor, que passa a usufruir de maior tempo para a codificação do projeto. Ao instalar o Delphi XE, será instalada também a ferramenta Final Builder. Abra a mesma a partir do menu iniciar. Imagem 1. Na janela principal do Final Builder crie um novo projeto. Será exibida a seguinte tela: Veja a imagem 1 Veja que do lado esquerdo temos uma lista das ações que irão acontecer quando o projeto for executado, falhar, etc. Além disso, no Final Builder é possível a definição de variáveis para o projeto. Clique na aba actions e em seguida na pasta Compilers, localizada no lado esquerdo da tela. Serão exibidas algumas opções: Veja a imagem 2. Veja que temos opção de trabalhar com informações de Assembly de um projeto e builds para Delphi Win32, inclusos várias versões do Delphi. Temos a opção de Build para o C++ e ainda para arquivos de recurso e Chrome Project. Selecione “Build Delphi Win32 Project”. Será exibida a tela a seguir: Veja a imagem 3. Nessa tela iremos carregar o projeto Delphi a Imagem 2. novembro 2010 09 ser automatizado e definir várias opções, entre elas comentários, opções do compilador, arquivos de recursos, opções do linker, entre outras. Após carregar o projeto, clique na aba Run e execute a aplicação. Se tudo estiver correto, será apresentada uma mensagem de sucesso. Do contrário, será mostrada a mensagem de erro, e caberá ao desenvolvedor corrigir o erro para seguir adiante. Nessa parte de correção dos erros é que a integração com a IDE Delphi se mostra essencial, já que não precisamos de várias ferramentas externas de debugger para realizar a tarefa, já que o próprio debugger Delphi é utilizado. Vamos definir uma nova ação no build. Clique na aba Projects e em Variables crie uma nova variável com o nome de SpaceBegin. Clique na aba actions e selecione a pasta Disk Management. Nessa parte definiremos variáveis que mostrarão o espaço em disco antes e depois do build. Imagem 3. Selecione GetDiskFreeSpace. Será exibida a janela a seguir: Veja a imagem 4. Em “Read into Variable” selecione a variável SpaceBegin definida anteriormente. Ainda na janela Actions altere a ordem de ocorrência da ação de GetDiskFreeSpace que definimos agora. Coloque ela antes do build. Salve e execute o projeto. Veja que foi exibida a quantidade em disco livre antes do build. Para complementar essa funcionalidade, podemos definir uma outra variável com o nome de SpaceEnd e colocar a ação para essa variável após o build. Dessa forma teremos a quantidade de espaço livre em disco antes e depois o build. Mostrar o espaço em disco livre antes e depois do build é importante para termos controle do nível de consumo de recursos do projeto. E essa é apenas uma das tarefas que podem ser automatizadas utilizando-se o FinalBuilder. Imagem 4. 10 novembro 2010 Conclusão Com as ferramentas integradas a IDE em sua versão XE, Delphi dá mais um passo para tornar o desenvolvimento de aplicações uma tarefa mais tranquila. A automatização de builds propiciada pelo FinalBuilder torna processos repetitivos que tem de ser feitos na montagem do projeto mais práticos e agrega ganho de tempo para o desenvolvedor. Sobre o autor Antonio Spitaleri Neto Consultor Técnico The Club. Espero eu tenham gostado e aguardem as próximas novidades do Delphi XE! [email protected] Referência: Andreano Lanusse Blog: http://www.andreanolanusse.com/blogpt/ novembro 2010 11 Metodos de Criptografia A criptografia é o estudo de técnicas para transformação de informações legíveis para formas ilegíveis, dificultando assim sua leitura por pessoas que não sejam o receptor destinado aquela mensagem que tem o conhecimento do “segredo” dessa criptografia. Os dados digitais, que são a maioria nos dias atuais, são criptografados se embaralhando os bits através de algoritmos a partir de uma determinada chave ou par de chaves. Imagem 1 – Cifra de César Um pouco de história... A primeira mensagem criptografada (ou cifrada, termo que era usado antes) data de 1900 AC quando um escriba egípcio enviou uma mensagem contendo hieróglifos fora de padrão para confundir possíveis receptores, séculos mais tarde surgiu uma das mais famosas técnicas de criptografia, a “Cifra de César”, essa técnica consistia na substituição de letras, cada letra era substituída se avançando três casas no alfabeto (veja figura 1), essa técnica nos dias de hoje pode ser considerada muito simples 12 novembro 2010 e de fácil reversão, mas contam as histórias, foi responsável por enganar inúmeros inimigos do Império Romano até ser descoberta. Veja a Imagem 1. Agora uma função em Delphi que gera a “Cifra de Cesar”: function CifraDeCesar(Mensagem: String): String; var i: integer; letra: char; final: String; begin final:= ‘’; for i:= 0 to length(Mensagem) do begin if (Mensagem[i] >= ‘A’) and (Mensagem[i] <= ‘Z’) then final:= final + chr((ord(mensagem[i]) ord(‘A’) + 3) mod 26 + ord(‘A’)) else final:= final + Mensagem[i]; end; Delete(final,1,1); Result:= final; end; A mensagem nessa função deve ser escrita toda com letras maiúsculas, por exemplo, se entrássemos com a mensagem: THE CLUB – O MAIOR CLUBE DE PROGRAMADORES DO BRASIL O retorno seria o seguinte: WKH FOXE - R PDLRU FOXEH GH SURJUDPDGRUHV GR EUDVLO Na idade moderna destacam-se os estudos de Arthur Scherbius que criou a primeira “máquina” de criptografia, essa máquina tinha o nome de Enigma e foi amplamente usada pela marinha alemã durante a guerra como sua principal forma de comunicação. Em 1928 surgiu uma “evolução” do antigo Enigma, a Enigma G que garantia a segurança das mensagens com a troca mensal da Chave Criptográfica. As máquinas Enigma reinaram por vários anos transmitindo mensagens indecifráveis pelos Aliados, até que, após o roubo de uma máquina Enigma surgiu a Colussus, fruto do estudo e de engenharia reversa da máquina Enigma roubada. A princípio a Colussus serviu com uma máquina de decriptação das mensagens alemãs, mas depois acabou se tornando uma máquina de envio de mensagens criptografadas assim como o Enigma. Existem atualmente diversos tipos de criptografia, como por exemplo: Chave Simétrica, Chave Assimétrica, Hash e a atualmente em desenvolvimento Criptografia Quântica. Seu maior uso atual se dá na Web em segurança a fim de autenticar usuários para fornecer o acesso, na proteção de transações financeiras e em comunicação. Chave Criptográfica A chave criptográfica é um valor secreto que altera o algorítmico de encriptação. Uma analogia para se entender a chave criptográfica é a seguinte: pense na fechadura de sua porta, ela contém múltiplos pinos, quando você põe a chave na fechadura e a gira, essa chave gira esses pinos para as posições de acordo com a chave, se as posições para quais são movidos esses pinos forem às posições corretas a porta se abrirá. Objetivos São quatro os objetivos principais da criptografia: 1. Confidencialidade – só o destinatário da mensagem deve ser capaz de extrair o conteúdo da mensagem; 2. Integridade – o destinatário deve ser capaz de perceber se a mensagem foi alterada durante a transmissão; 3. Autenticação – o destinatário deve ser capaz de saber quem lhe enviou a mensagem; 4. Não repúdio – o emissor não deve ser capaz de negar a autoria da mensagem. Métodos Criptografia Assimétrica A criptografia assimétrica é também conhecida como criptografia de chave pública e se utiliza de duas chaves, a pública e a privada que são matematicamente relacionadas. Enquanto a chave pública pode ser livremente distribuída, a chave privada deve ser mantida no mais absoluto segredo pelo seu dono. A transmissão de uma mensagem utilizando esse tipo de criptografia ocorre da seguinte forma: o emissor, se utilizando da chave pública, criptografa a mensagem e a envia, qualquer pessoa que porventura capturar essa mensagem durante esse envio não será capaz de saber seu conteúdo, pois para trazer essa mensagem a sua forma original deverá ser usada a chave privada, o contrário também é possível, ou seja, criptografar com a chave privada e volta-la ao original com a chave pública. Esse tipo de criptografia atende dois dos quatro objetivos da criptografia, a confidencialidade(só o dono da chave privada poderá saber o conteúdo da mensagem) e a autenticidade(só o criador das chaves pode codificar a mensagem que foi decifrada com a chave pública). Em 1977 três amigos desenvolveram o algoritmo assimétrico denominado RSA (RSA faz referência ao sobrenome deles). O algoritmo RSA é a base, atualmente, da maioria das aplicações que utilizam criptografia assimétrica. O tamanho desta chave varia entre 512 a 2048bits. Imagem 2 – Alice criptografa a mensagem se utilizando da chave pública novembro 2010 13 Veja a Imagem 3. O processo para criptografar com a chave privada e decifrar com a pública ocorre de forma semelhante. Criptografia Simétrica A criptografia simétrica se utiliza de chaves criptográficas relacionadas para as operações de criptografia ou descriptografia. As chaves podem ser idênticas ou não. Essas chaves funcionam como um segredo partilhado por duas ou mais pessoas e são usadas para manter um canal de comunicação entre elas. Essas chaves devem ser conhecidas apenas pelos envolvidos no processo da troca de mensagens. Imagem 3 – Beto, o possuidor da chave privada, decifra a mensagem. Elas são divididas entre algoritmos de cifras de fluxo (os bits da mensagem são cifrados um a um) ou por bloco (são cifrados blocos de bits, em geral 64). Os algoritmos mais famosos que se utilizam da criptografia simétrica são: AES, Blowfish, RC4, entre outros. Na comparação de velocidade entre os algoritmos de criptografia assimétrica e algoritmos de criptografia simétrica, esses últimos levam grande vantagem por necessitarem de muito menos capacidade computacional do que os assimétricos. Uma chave assimétrica de qualidade é centenas ou milhares de vezes mais lentas do que uma chave simétrica. Veja a imagem4. Resumo Criptográfico (Hash) A palavra Hash quer dizer: picar, misturar, confundir, uma informação passada por esse método criptográfico ganha uma espécie de assinatura digital, na teoria um grande número de informações são transformadas em um pequeno número de informações. O retorno criptografado desse método busca ser exclusivo, embora isso não seja possível, pois pelo tamanho limitado da sequência pode ser que dados diferentes retornem valores iguais. Uma das características mais interessantes desse método é que é inviável fazer uma informação gerada 14 novembro 2010 Imagem 4 por ele voltar ao seu valor original, ou seja, depois de criptografada essa informação jamais voltará ao seu estado original. Os principais métodos de hash são: MD5, SHA1, WHIRPOOL, entre outros. O MD5 é muito usado em sites da web e no Linux para proteger dados de usuário, no momento do login, por exemplo, o valor digitado no campo senha passa pelo método MD5 e é comparado com o valor no banco de dados, já criptografado com o método, se eles forem iguais é liberada a entrada no site. Na imagem vemos um exemplo de função hash que, por exemplo, através de um nome retornaria um valor integer, podemos perceber que esse algoritmo não gerou valores iguais para nomes diferentes, apesar de serem poucos dados testados podemos afirmar que ele é um bom método hash. Imagem 5 Algumas funções de criptografia em Delphi. As funções aqui apresentadas são destinadas a criptografar strings: 1- function TForm1. Crypt(Action, Src: String): String; Label Fim; var KeyLen : Integer; KeyPos : Integer; OffSet : Integer; Dest, Key : String; SrcPos : Integer; SrcAsc : Integer; TmpSrcAsc : Integer; Range : Integer; begin if (Src = ‘’) Then begin Result:= ‘’; Goto Fim; end; Key := ‘YUQL23KL23DF90WI5E1JA S467NMCXXL6JAOAUWWM CL0AOMM4A4VZYW9K HJUI2347EJHJKDF3424SKL K3LAKDJSL9RTIKJ’; Dest := ‘’; KeyLen := Length(Key); KeyPos := 0; SrcPos := 0; SrcAsc := 0; Range := 256; if (Action = UpperCase(‘C’)) then begin Randomize; OffSet := Random(Range); Dest := Format(‘%1.2x’,[OffSet]); for SrcPos := 1 to Length(Src) do begin Application. ProcessMessages; SrcAsc := (Ord(Src[SrcPos]) + OffSet) Mod 255; if KeyPos < KeyLen then KeyPos := KeyPos + 1 else KeyPos := 1; SrcAsc := SrcAsc Xor Ord(Key[KeyPos]); Dest := Dest + Format(‘%1.2x’,[SrcAsc]); OffSet := SrcAsc; end; end Else if (Action = UpperCase(‘D’)) then begin OffSet := StrToInt(‘$’+ copy(Src,1,2)); SrcPos := 3; repeat SrcAsc := StrToInt(‘$’+ copy(Src,SrcPos,2)); if (KeyPos < KeyLen) Then KeyPos := KeyPos + 1 else KeyPos := 1; TmpSrcAsc := SrcAsc Xor Ord(Key[KeyPos]); if TmpSrcAsc <= OffSet then TmpSrcAsc := 255 + TmpSrcAsc - OffSet else TmpSrcAsc := TmpSrcAsc - OffSet; Dest := Dest + Chr(TmpSrcAsc); OffSet := SrcAsc; SrcPos := SrcPos + 2; until (SrcPos >= Length(Src)); end; Result:= Dest; Fim: Para usar essa função o procedimento é o seguinte: Crypt(‘C’,Edit1.Text), para criptografar e Crypt(‘D’,Edit1.Text) para descriptografar. 2- function EncryptSTR(const InString: string; StartKey, MultKey, AddKey: Integer): string; var I : Byte; begin Result := ‘’; for I := 1 to Length(InString) do begin Result := Result + CHAR(Byte(InString[I]) xor (StartKey shr 8)); StartKey := (Byte(Result[I]) + StartKey) * MultKey + AddKey; end; end; function DecryptSTR(const InString: string; StartKey, MultKey, AddKey: Integer): string; var I : Byte; begin Result := ‘’; for I := 1 to Length(InString) do begin Result := Result + CHAR(Byte(InString[I]) xor (StartKey shr 8)); StartKey := (Byte(InString[I]) + StartKey) * MultKey + AddKey; end; end; Nessas funções informam-se a string e três valores inteiros que funcionarão como “Chaves Criptográficas”, exemplo: EncryptSTR(Edit1. Text,48,27,2); Para reverter à criptografia passam-se os mesmos valores: DecryptSTR(Edit1. Text,48,27,2); 3- function Cript(mCad, mOp : string):string; var i, ate, x1, x2 : integer; r1, r2 : string[1]; begin if Odd(Length(mCad)) novembro 2010 15 then mCad := mCad + ‘ ‘; ate := Length(mCad) div 2; for i := 1 to ate do begin x1 := ord(mCad[((i-1) * 2) + 1]); Conclusão A proteção dos dados é uma coisa muito importante nos dias atuais, esses diversos métodos buscam fazer isso da melhor maneira possível. Existem ainda muitos outros métodos que não foram citados nesse artigo, e os aqui citados foram apenas vagamente. Esse é um assunto muito interessante que com certeza merece um melhor estudo. E isso é tudo pessoal, até outra hora! x2 := ord(mCad[((i-1) * 2) + 2]); if mOp = ‘DESCRIPT’ then Sobre o autor begin r2 := chr((-x2 + x1 + 90) div 2); r1 := chr(x1 - Bruno Alcarás Consultor Técnico The Club. ((-x2 + x1 + 90) div 2)); end else [email protected] begin r2 := chr(x1 + 90 - x2); r1 := chr( x1 + x2); end; result := result + r1 + r2; if Result[Length(Result)]=’ ‘ then Delete(Result, Length(Result), 1); end; end; Essa função se utiliza do embaralhamento das letras, seu uso ocorre da seguinte forma: Cript(Edit1.Text,’CRIPT’); Para descriptografar: Cript(Edit1. Text,’DESCRIPT’); 16 novembro 2010 Certificação Digital para CT-e Abordagem prática CertiSign Reedição da matéria publicada na “The Club - Megazine” de Maio de 2010 edição 188 Atualmente tenho sido cobrado por todos os lados a respeito de soluções para Conhecimento de Transporte Eletrônico (CT-e). Os clientes precisam adequar seus sistemas, a empresa precisa fornecer solução imediata, os leitores querem saber mais sobre o tema. O CT-e é um documento emitido e armazenado eletronicamente, com validade jurídica garantida por processo de assinatura digital. Este novo modelo de documento fiscal eletrônico, instituído pelo AJUSTE SINIEF 09/07 (25/10/2007), pode ser utilizado para substituir um dos seguintes documentos fiscais: • Conhecimento de Transporte Rodoviário de Cargas, modelo 8; • Conhecimento de Transporte Aquaviário de Cargas, modelo 9; • Conhecimento Aéreo, modelo 10; • Conhecimento de Transporte Ferroviário de Cargas, modelo 11; • Nota Fiscal de Serviço de Transporte Ferroviário de Cargas, modelo 27; • Nota Fiscal de Serviço de Transporte, modelo 7, quando utilizada em transporte de cargas. certisign.com.br). O CTe é parte integrante do sistema público de escrituração digital, cuja documentação completa encontra-se disponível em http://www1.receita. fazenda.gov.br/, juntamente com demais itens que tem ocupado e muito os desenvolvedores em todo o Brasil, tais como SPEDContábil, SPEDFiscal, NFe e NFSe. De maneira simplificada o modelo operacional do CT-e pode ser assim descrito: O principal objetivo da implantação desta nova modalidade de conhecimento de transporte é o acompanhamento em tempo real das operações de transporte pelo Fisco e a substituição do modelo atual de emissão de documentos fiscais em papel, de forma a simplificar uma série de obrigações do contribuinte. Maiores informações podem ser obtidas através do portal nacional de Cte no ambiente de produção em http://www.cte.fazenda. gov.br, ou do portal nacional de Cte ambiente de homologação (versão de testes de CTe para clientes que ainda não estão emitindo Cte) em http://hom. cte.fazenda.gov.br/. Nesta série de artigos abordaremos os inúmeros conceitos envolvidos no desenvolvimento e implantação de soluções para CT-e. Neste artigo, no entanto, daremos foco ao processo de assinatura digital de CT-e emitidas, utilizando certificados emitidos pela empresa certificadora CertSign (www. Descrição Simplificada do Processo 1. A empresa emissora do CT-e gera um arquivo eletrônico contendo as informações fiscais da operação comercial em questão. a. O arquivo eletrônico tem extensão .XML (Extensible Markup Language) e deve ser gerado conforme padrão pré-estabelecido vigente. b. Este documento eletrônico contém informações equivalentes às informações contidas no modelo atual de notas fiscais em papel. 2. O documento do CT-e emitido deve ser assinado digitalmente, de maneira a garantir a integridade dos dados, a autoria do emissor e a validade jurídica do documento. a. O processo de assinatura digital deve ser feito utilizando-se certificado digital tipo A1 ou A3 emitido por autoridade certificadora credenciada pela Infra-estrutura de Chaves Públicas Brasileira – ICP-Brasil (www.icpbrasil.gov.br). b. Neste artigo foram utilizados certinovembro 2010 17 ficados emitidos pela empresa CertSign (www. certisign.com.br), devidamente credenciada no ICP-Brasil. c. A escolha do fornecedor do certificado abordado neste artigo se deu primeiramente pela CertSign ser devidamente certificada no ICP-Brasil e também pelo fato de ser uma das empresas líderes deste mercado e dispor de Autoridade de Registro (AR) sediada em nossa cidade, Salvador – Ba. No entanto sinta-se o leitor livre para escolher entre qualquer uma das empresas disponíveis no mercado, todas elas dispõem de processos semelhantes aos apresentados e toda a teoria mostrada no que tange o CT-e continua sendo válida. 3. O arquivo deve então ser transmitido, via Internet, para a Secretaria da Fazenda do Estado (SEFAZ) onde reside o contribuinte emissor. 4. Após receber o arquivo, a SEFAZ realiza um processo de pré-validação e devolve uma Autorização de Uso, permitindo com isso o trânsito da mercadoria e a continuação da transação comercial. 5. Para acompanhar o trânsito da mercadoria o sistema deve imprimir, em papel comum, geralmente em única via, uma representação gráfica simplificada da CT-e, chamada de DANFE (Documento Auxiliar do Conhecimento de Transporte Eletrônico) a. O DACTE deve conter impressa uma chave de acesso que possibilita a consulta do CT-e na internet, de forma que qualquer pessoa possa confirmar as informações impressas com as informações contidas no site da SEFAZ. b. O DACTE não é uma nota fiscal, nem a substitui, servindo apenas como instrumento auxiliar para consulta da CT-e na internet. 2. Os clientes iniciam o teste dos seus sistemas através do modo de homologação, onde é possível testar e validar livremente o sistema de software sem que os testes tenham valor fiscal. Uma vez validado o sistema o cliente solicita o acesso ao ambiente de produção e estará livre para emitir o conhecimento de transporte sob a forma eletrônica. Atualmente, conforme consta no FAQ disponível no portal da CT-e, a estratégia de implantação nacional é voluntária, onde as empresas, independente do porte, por livre e espontânea vontade se interessam em adotar e emitir Conhecimento de Transporte Eletrônico. Diferentemente da NFe, o processo de CTe ainda é facultativo, e mesmo após o início das operações em modo de produção é possível emitir Cte no padrão antigo. Certificados Digitais Os certificados digitais são documentos eletrônicos que identificam pessoas físicas ou jurídicas e através do uso de criptografia asseguram a confiabilidade, privacidade, integridade, inviolabilidade e autenticidade de informações de transações realizadas via Internet. 18 novembro 2010 O processo de assinatura digital utilizando certificados digitais nas operações via Internet tem validade jurídica para ser utilizado como assinatura de próprio punho, comprovando que seu proprietário concorda com o documento assinado. Segundo informações do suporte online da Certisign e resultados de testes executados, caso o usuário já possua um certificado emitido para fins de assinatura e transmissão de NFe, não é preciso adquirir novo certificado. Os tipos mais comuns de certificados digitais Sendo assim, para o desenvolvimento do projeto de CT-e, optou-se pelo certificado tipo A3, token USB, adquirido previamente para o projeto de NF-e devido à sua flexibilidade e praticidade, principalmente considerando o ambiente de desenvolvimento do projeto realizado vários desenvolvedores diferentes e o processo de atendimento na sede do cliente quando utilizamos notebooks. são: • Certificados tipo A3 oferecem maior segurança, já que seu certificado é gerado, armazenado e processado em cartão inteligente (SmartCard) ou token (espécie de hardlock para conexão na porta USB), que permanece assim inviolável e único. Apenas o detentor da senha de acesso, criada no momento da validação, pode utilizar a chave privada. O certificado digital tipo A3 possui validade de 3 anos. • Certificados tipo A1 são gerados e armazenados no computador pessoal do usuário, não sendo necessário o uso de cartões inteligentes ou tokens. Os dados podem ser protegidos por uma senha de acesso, criada pelo usuário. Somente com esta senha é possível acessar, mover e copiar sua chave privada. Por medida de segurança, recomenda-se que um único computador armazene o par de chaves tipo A1 e apenas uma cópia de segurança seja criada. A validade deste tipo de certificado é de 01(um) ano, contado a partir de sua data de emissão. A escolha do tipo de certificado a ser utilizado no desenvolvimento da sua aplicação depende muito das suas necessidades e possibilidades financeiras. Os certificados tipo A1 são mais baratos, no entanto são menos flexíveis, pois estão instalados em uma única máquina, têm prazo de validade reduzido e são considerados menos seguros. Os certificados tipo A3 do tipo SmartCard têm um custo intermediário, mas num primeiro momento, dependem da aquisição de um leitor de cartão que deve estar instalado na máquina onde o cartão será utilizado. A vantagem, no entanto é que, após o prazo de 3 anos da compra do primeiro cartão, não será necessário adquirir novo leitor de cartão, o que torna o custo a longo prazo mais interessante. Os certificados tipo A3 do tipo token USB têm maior flexibilidade quando comparados aos outros formatos pois depende apenas da disponibilidade de uma porta USB na máquina onde o mesmo será utilizado, facilitando e muito o processo de desenvolvimento. O custo, no entanto, é o mais elevado tendo em vista que o prazo de validade é o mesmo quando comparado ao modelo SmartCard. Existem diversas certificadoras oferencendo produtos e serviços de assinatura digital, dentro as quais é possível destacar a Certisign (www.certsign. com.br) Serasa (www.serara.com.br). Acessando o site da CertSign no link específico de certificados digitais para emissão de CT-e, temos acesso aos seguintes custos, por tipo de certificado, conforme mostrado na Figura 03. O processo de aquisição foi feito através do site da CertSign com pagamento em 2 vezes via cartão de crédito. Para a geração da chave, a certificadora exige documentação da empresa e de um dos sócios e a entrega da mesma foi realizada somente com a presença física do mesmo na sede da representante, aqui em nossa cidade (Salvador - Bahia), a Autoridade de Registro (AR) de nome Dossier Digital (www.dossierdigital.com.br). Todo o processo de pagamento, entrega de documentação e aquisição da chave foi realizado em 2 dias úteis. Uma vez com o certificado em mãos, é possível realizar a instalação do CD que acompanha o mesmo, através de wizard de instalação. Concluída a instalação, reinicia-se o computador, e sempre, ao conectar o token na porta USB, é apresentada a mensagem, indicando a correta detecção do dispositivo por parte do sistema operacional. O processo de instalação cria duas pastas no menu Iniciar do Windows que dão acesso principalmente à documentação de ajuda e ao aplicativo eToken Properties. O aplicativo eToken Properties permite a visualização das informações armazenadas no token, bem como diversas características do mesmo. Clicando no botão “etoken PRO” do lado esquerdo da tela e depois clicando no botão “Advanced”, é solicitada uma senha para acesso às configurações avançadas do token. No momento da aquisição do token, uma senha de acesso ao mesmo deve ser fornecida, e é muito importante ressaltar que a certificadora informa que, caso a senha seja digitada incorretamente por 10 vezes consecutivas, todo o conteúdo do token é apagado e perdido, inutilizando o mesmo para qualquer tipo de aplicação e sendo necessária a aquisição de novo certificado frente à certificadora. Então, muita atenção, não erre a senha por 10 vezes consecutivas! Na paleta “Certificate & Keys” pode-se visualizar todos os certificados armazenados no token e que serão utilizados para assinar digitalmente os documentos de CT-e emitidos. Para testar o seu certificado acesse o link https://nfe.prefeitura.sp.gov.br/Loginicp.aspx Se o certificado estiver instalado corretamente, após selecionar o certificado e digitar a senha surgirá uma seguinte mensagem. Gerando uma CT-e para testes de assinatura Para testar a assinatura digital em um CT-e de teste, utilizamos o aplicativo disponibilizado no site http://www.igara.com.br/produto.php?cod_ produto=116. O aplicativo é um demo desenvolvido em Delphi, totalmente funcional que permite a geração de CT-e a partir de informações digitadas pelo usuário em campos de texto que seguem o layout específico vigente. Após abrir o aplicativo, clicamos no botão “Novo CT-e” e depois no botão “Salvar CT-e”. Por fim selecionamos o diretório onde desejamos salvar o arquivo .xml gerado. O aplicativo sugere um nome para o arquivo gerado e este nome não deve ser alterado, pois segue padrão de nomenclatura específico exigido com base no conteúdo da CT-e em questão. O arquivo gerado pode ser visualizado no Internet Explorer ou em qualquer outro browser de internet com suporte a XML. Neste artigo não entraremos em detalhes sobre o processo de geração da CT-e, pois este será o tema do próximo artigo. Até o momento, o arquivo gerado não tem valor jurídico, pois ainda não foi assinado de forma que o emissor possa certificar a validade das informações fornecidas, bem como não há nada que garanta que este documento não foi alterado por terceiros sem o conhecimento prévio do emitente. Para tanto é preciso assinar este documento e para isso vamos utilizar o aplicativo de assinatura de Notas Fiscais Eletrônicas (NF-e) disponibilizado para download gratuito no portal oficial em http://www. nfe.fazenda.gov.br/portal/assinador.aspx. Apesar do aplicativo sugerido ter a nomenclatura referente a assinatura de NFe ele é genérico e 100% funcional para assinatura de CT-e, desde que seu diretório de Schema seja devidamente configurado com o Schema vigente de CT-e disponível no portal nacional do projeto no link de download dos Schemas XML http://www.cte.fazenda.gov. br//schemas.aspx Após fazer o download e instalação do aplicativo siga os seguintes passos: • Menu> Tarefas> Configura Diretório de Entrada. Selecione esta opção para indicar o diretório onde estão localizadas as NF-e que você deseja assinar. • Menu> Tarefas> Configura Diretório de Saída. Selecione esta opção para indicar o diretório onde serão armazenadas as NF-e assinadas. • de Schemas. Selecione esta opção para indicar o diretório onde se encontram armazenados os schemas que determinam o layout vigente da CT-e. O download do schema vigentes pode ser feito no portal e deve-se operar sempre com o layout mais novo. Uma vez configurados os diretórios, antes de realizar o processo de assinatura, faz-se necessário selecionar qual certificado será usado no processo. Para isso acesse a opção Menu> Tarefas> Seleciona Certificado e selecione o certificado contido no token. Clicando no botão “Mostrar o Certificado” é possível visualizar informações detalhadas do mesmo através do visualizador de certificados padrão do Windows. Uma vez realizados corretamente todo o processos de configuração, estamos prontos para assinar nosso primeiro CT-e. Visualizamos no grid do lado esquerdo todas os arquivos de CT-e disponíveis a serem assinadas. Marcando o check-box dos CT-e desejados, basta então clicar na opção Menu> Tarefas> Efetuar Assinatura XML, para que todos os CT-e selecionadas sejam devidamente assinados, utilizando o certificado selecionado. A CT-e assinado será armazenada no diretório indicado anteriormente e é possível visualizá-lo no grid do lado direito do aplicativo. A diferença entre o arquivo não assinado e o arquivo assinado digitalmente estará no conteúdo das últimas chaves do arquivo XML em questão, que anteriormente estavam sem preenchimento, e após a assinatura terão um conteúdo. Após o processo de assinatura, os campos de DigestValue, SignatureValue e X509Certificate passaram a conter dados criptografados que identificam unicamente o arquivo .xml em questão e atestam que o mesmo foi assinado somente por pessoa detentora do token. Neste momento fica claro que o token, por ter validade jurídica para assinatura de documentos, deve ser manipulado somente por pessoas devidamente autorizadas. Portanto, todo cuidado é pouco! Para validar o arquivo gerado o primeiro passo é acessar o do validador online de CTe no site da SEFAZ-RS em http://www.sefaz.rs.gov.br/CTE/ CTE-VAL.aspx O validador online é extremamente útil para auxiliar na localização de erros na sintaxe e conteúdo dos arquivos XML gerados. Para utiliza-lo é preciso abrir o arquivo XML de Cte assinado no Bloco de Notas do Windows e copiar todo o conteúdo do arquivo. Se você copiar o conteúdo do browser a informação copiada apresentará problemas no validador por incluir caracteres de controle como sinais de + e – bem como quebras de linha e etc. Depois basta colar o conteúdo copiado no campo do validador e pressionar o botão “Validar”. O validador irá processar o arquivo XML em questão e apresentará a lista de erros e problemas encontrados. A partir deste ponto basta corrigir cada um dos problemas que eventualmente possam ser apresentados, tomando com base as instruções detalhadas de cada campo apresentadas no manual de integração de CTe disponível para download em http://www.cte.fazenda.gov.br//integracao.aspx, até que o sistema apresenta a mensagem “Assinatura Válida”, informando que o arquivo de Cte está válido, tanto em forma quanto em conteúdo. Pronto! O arquivo de CT-e está pronto para ser transmitido! Mas, por enquanto, é só, pois o processo de envio da CT-e será tema de outros artigos que virão. Continue acompanhando a coluna que em breve teremos mais artigos sobre o tema. Conclusão Com este artigo abordamos conceitos gerais de certificação digital e assinatura digital no que tange o conchecimento de transporte eletrônico e vimos como é fácil emitir e assinar tais documentos. O CT-e já é uma realidade, e muito em breve as empresas adotarão este novo formato. Mostramos como fazer a assinatura usando como exemplo o certificado digital emitido pela empresa CertSign. No entanto, apesar das informações apresentadas sobre certificados digitais envolverem dados específicos do fabricante, os conceitos abordados são semelhantes independente da certificadora escolhida. Sendo assim, o conhecimento adquirido é de grande utilidade na implementação da comunicação com outras marcas e modelos. Sobre o autor Victory Fernandes Professor do Departamento de Engenharia da UNIFACS, Engenheiro Mestrando em Redes de Computadores, e desenvolvedor sócio da TKS Software - Soluções de Automação e Softwares Dedicados. Pode ser contatado em [email protected], ou através dos sites www.igara.com.br – www. igara.com.br/victory [email protected] Menu> Tarefas> Configura Diretório novembro 2010 19 Boletos e cartão na Web O ASP.NET proporciona uma produtividade muito grande, comparado a outras tecnologias para desenvolvimento Web. Mas existem situações que devemos recorrer a terceiros para implementar alguma funcionalidade. Imagine que sua aplicação e-commerce tenha a opção para os usuários realizarem o pagamento das compras via cartão de crédito ou transferência eletrônica. Implementar uma solução desse porte, com certeza é muito trabalhoso. Mas, como diz o filósofo: “para tudo na vida existe uma solução”, e ela se chama CobreBemX. Essa ferramenta proporciona um ganho de produtividade com a geração de boletos na Web de forma rápida e eficaz, alterando-se algumas propriedades. Contamos também com a cobrança via cartão de crédito, onde o desenvolvedor terá 20 novembro 2010 em sua aplicação uma funcionalidade necessária atualmente para sites de e-commerce. Baixando o CobreBemX Podemos utilizar uma versão de avaliação da ferramenta no site, onde temos apenas duas restrições: a data de vencimento é fixa e o valor cobrado no boleto é R$ 1,90. Baixe essa versão em: www.cobrebem.com/ downloads/cbx/InstalarCobreBemX.zip e descompacte o arquivo. Clique em Instalar.exe para registrar a DLL. O controle é um componente COM/DCOM e não podemos instalar no IDE do Visual Studio. Devemos gerar um arquivo, que será a licença de teste e o tipo de cobrança do boleto. Acesse o endereço www.cobrebem.com/cgi-bin/GeraArquivoLicencaTeste, escolha o banco e em Carteira, escolha uma cobrança simples (Figura 1). Clique em Gerar Arquivo e salve o arquivo. Veja a figura 1. Criando a aplicação ASP.NET Para dar mais realismo ao nosso exemplo, criei um exemplo de loja virtual, utilizando o banco de dados Northwind do SQL Server. Como a criação da loja, foge ao escopo do artigo, a mesma esta disponível para download. Nota: Para aprender a construir uma loja virtual, indico meu treinamento multimídia onde é mostrado como criar uma aplicação e-commerce com o Visual Web Developer. Para saber mais, acesse www. lucianopimenta.net. Abra o Visual Studio 2010 e crie uma nova aplicação Web, dando o nome de “boletosweb”. Vamos adicionar a referencia do componente, através do menu Website>Add Reference. Clique na aba COM e escolha CobreBemX Library. No using adicione CobreBemX. Existem algumas configurações e arquivos a serem baixados para gerar corretamente os boletos. Acesse o endereço www.cobrebem.com/ downloads/cbx/ImagensBoleto.zip para baixar as imagens do boleto, onde as mesmas devem ser descompactadas na pasta da aplicação, dentro de uma pasta que daremos o nome de “imagens”. Não altere o nome das imagens, pois elas serão usadas para informações do boleto e no código de barras. Coloque na pasta da aplicação o arquivo de licença gerado anteriormente no site. Voltando a aplicação, criei uma página com as informações dos produtos (tabela Products) em um GridView que possui um link que redireciona para uma página onde contém todos os dados do respectivo produto e com a opção de comprar o mesmo (Figura 2). Veja a Figura 2. Nessa página temos um botão para comprar o produto e redirecionar para o carrinho de compras (Figura 3). Figura 1. Gerando o arquivo de licença de teste e o tipo de carteira Veja a Figura 3. O botão Continuar Comprando, volta para a página inicial, enquanto o Finalizar redireciona para a página (Figura 4) onde o usuário escolherá o tipo de pagamento (boleto ou cartão). Figura 2. Página com a opção de compra do produto Figura 4. Página para finalizar compras na loja virtual Gerando o boleto Para gerar o boleto, vamos criar um WebForm com o nome de “boleto.aspx” e adicionar no evento Load o código da Listagem 1. Figura 3. Carrinho de compras da aplicação novembro 2010 21 Listagem 1. Gerando o boleto bancário na aplicação ASP.NET DataSet ds = Session[“venda”] as DataSet; //Cria a instância do CobreBemX CobreBemX. ContaCorrenteClass aCobreBemX = new CobreBemX. ContaCorrenteClass(); //Indica o arquivo de teste gerado no site, //precisa ser o caminho completo aCobreBemX.ArquivoLicenca = Server.MapPath(“001-16. conf”); //Dados da conta corrente aCobreBemX.CodigoAgencia = “1234-5”; aCobreBemX. NumeroContaCorrente = “00000123-X”; aCobreBemX.CodigoCedente = “123456”; aCobreBemX. OutroDadoConfiguracao1 = “019”; aCobreBemX. InicioNossoNumero = “00001”; aCobreBemX.FimNossoNumero = “99999”; aCobreBemX. ProximoNossoNumero = “00015”; //logotipo da empresa aCobreBemX.PadroesBoleto. PadroesBoletoEmail. URLLogotipo = “/imagens/logoboleto. gif”; //pasta das imagens do boleto aCobreBemX.PadroesBoleto. PadroesBoletoEmail. URLImagensCodigoBarras = “/imagens/”; //Documento de cobrança 22 novembro 2010 CobreBemX. IDocumentoCobranca aBoleto = aCobreBemX. DocumentosCobranca.Add; //Dados do sacado aBoleto.NomeSacado = “Luciano Almeida Pimenta”; //Para Pessoa Juridica, utilize a property CNPJSacado aBoleto.CPFSacado = “111.111.111-11”; aBoleto.EnderecoSacado = “Rua do Sacado”; aBoleto.BairroSacado = “Bairro do Sacado”; aBoleto.CidadeSacado = “Cidade do Sacado”; aBoleto.EstadoSacado = “SP”; aBoleto.CepSacado = “01001-001”; //Dados do documento de cobrança aBoleto.DataDocumento = DateTime.Now. ToShortDateString(); //Data de Vencimento aBoleto.DataVencimento = DateTime.Now.AddDays(3). ToShortDateString(); aBoleto.NumeroDocumento = “12345”; aBoleto.ValorDocumento = Convert.ToDouble(ds. Tables[0].Rows[0] [“TOTAL”]); aBoleto.PadroesBoleto. Demonstrativo = “Referente a compras no Site<br><b>”+ “O melhor site da Internet</b>”; aBoleto.PadroesBoleto. InstrucoesCaixa = “<br><br>Juros de 5% ao mês e multa de R$ 0,10 ao dia”; //Gera o boleto Response.Write(aCobreBemX. get_GeraHTMLBoleto(0)); aCobreBemX = null; O código tem comentários para indicar as propriedades que configuramos. Primeiramente, eu recupero de uma variável de sessão um DataSet com informações da venda (que é salva quando finalizamos a compra no carrinho). Claro, que em uma aplicação real, esses dados estariam no banco de dados e bastaria consultar os mesmos. No código, criamos uma instancia de CobreBemX.ContaCorrenteClass, passemos o arquivo de licença gerado no site. Após, informamos os dados da conta corrente e o caminho do logotipo e imagens do boleto. Em seguida, configuramos as informações do cliente (nome, endereço etc), dados esses facilmente conseguidos com uma consulta ao banco do usuário logado na aplicação. Por fim, temos a data do documento, vencimento, número, valor (no DataSet em sessão) e informações gerais que podemos colocar no boleto. Para gerar o boleto, basta usar o código: Response.Write(aCobreBemX. get_GeraHTMLBoleto(0)); Simples e rápido. Execute a aplicação e veja o boleto bancário sendo gerado (Figura 5 e 6). Veja a figura 5. Veja a figura 6. Nota: Para esse artigo, foi gentilmente fornecida uma licença do componente, então os valores mostrados no boleto são os valores reais da aplicação. Com pouco mais de 30 linhas de código, foi gerado um boleto bancário em uma aplicação ASP.NET. Enviando o boleto por e-mail E se o usuário desejar que o boleto seja enviado por e-mail? O CobreBemX tem essa funcionalidade e também é muito fácil de ser implementada. Adicione o método da Listagem 2 na aplicação. Listagem 2. Enviando o boleto por e-mail private void EnviaBoleto(CobreBemX. ContaCorrenteClass aCobreBem, CobreBemX. IDocumentoCobranca aBoleto) { //configurações do servidor SMTP aCobreBem. PadroesBoleto. PadroesBoletoEmail.SMTP. Servidor = “servidor de e-mail”; aCobreBem. PadroesBoleto. PadroesBoletoEmail.SMTP. Porta = 25; aCobreBem. PadroesBoleto. PadroesBoletoEmail. SMTP.Usuario = “nome do usuário”; aCobreBem. PadroesBoleto. PadroesBoletoEmail.SMTP. Senha = “senha”; aCobreBem. PadroesBoleto. PadroesBoletoEmail. URLImagensCodigoBarras = “/imagens/”; aCobreBem. PadroesBoleto. PadroesBoletoEmail. URLLogotipo = “/images/logoboleto. gif”; aCobreBem. PadroesBoleto. PadroesBoletoEmail. PadroesEmail.Assunto = “Boleto de cobrança”; aCobreBem. PadroesBoleto. PadroesBoletoEmail. PadroesEmail.EmailFrom. Endereco = “[email protected]. br”; aCobreBem. PadroesBoleto. PadroesBoletoEmail. Figura 5. Parte superior do boleto bancário com o logotipo da empresa Figura 6. Parte inferior do boleto bancário com informações de cobrança PadroesEmail.EmailFrom. Nome = “Nome do cliente”; aCobreBem. PadroesBoleto. PadroesBoletoEmail. PadroesEmail.FormaEnvio = FormaEnvioEmailEnum. feeSMTPBoletoHTML; aBoleto. EnderecosEmailSacado.Add. Nome = “Nome do cliente”; aBoleto. EnderecosEmailSacado.Add. Endereco = “fulano@email. com.br”; aBoleto. ControleProcessamento novembro 2010 23 Documento.EnviaEmail = StatusControleProcessamento Enum.scpExecutar; //envia o e-mail aCobreBem. EnviaBoletosPorEmail(); } Os dados referentes a e-mail e nome do cliente, podem ser conseguidos no banco de dados da sua aplicação. Altere o código do evento Load, chamado o método da listagem anterior, após a geração do boleto. Execute novamente a aplicação, para gerar o boleto e enviar o mesmo por e-mail. Claro, que você pode mudar a página finalizar.aspx para que o usuário escolha (com um CheckBox) se deseja receber o boleto por e-mail. Figura 7. Formulário para solicitação de compra com o cartão de crédito testes e o mesmo é feito em ordem aleatória). Response.Write(“Cartão <b> Aprovado!</b><br> Obrigado por comprar na Nota: Em uma aplicação real mais informações deveriam estar presentes no boleto, como dados do sacado (endereço, CPF etc). The Club!”); Response.Write( “<br><br><b>Comprovante:</ b>”); Response.Write( Você pode baixar o AprovaFácil (outra solução para venda com cartão de crédito) e usar o cartaoteste.conf presente no arquivo zipado, bastando colocá-lo no diretório do projeto. Crie uma nova página (chamada “cartao.aspx”), onde criaremos o layout para que o usuário possa preencher as informações do cartão a ser consultado. “<br>” + Request. Cobrança com cartão de crédito Vamos implementar agora a funcionalidade do pagamento das compras do cliente na loja virtual, utilizando cartão de crédito. Vamos criar uma página para informar o resultado da consulta, se aprovado ou não. Crie um novo WebForm com o nome de “status.aspx”. No Load adicione o código da Listagem 3. Listagem 3. Verificando se a consulta foi aprovada para pagamento da compra QueryString[“comprovante” ].ToString()); Adicione alguns Labels, TextBoxes e um botão. Configure os componentes conforme a Figura 7. } else { Response.Write(“Cartão <b> não </b> foi Nota: Essa página é chamada na escolha do usuário por pagamento com cartão de crédito, após finalizar as compras. aprovado”); Response. Veja a figura 7. Write(“<br><b>Motivo:</ b>”); Response. Write(“<br>” + Request. Adicione no using novamente o namespace do CobreBemX. No botão adicione o código da Listagem 4. QueryString[“motivo”]. ToString()); } Listagem 4. Solicitando a confirmação da compra com o cartão de crédito string aprovado = Request. QueryString[“status”]. ToString(); if (aprovado == “T”) { 24 novembro 2010 O arquivo CONF gerado anteriormente pode ser usado para a cobrança de cartão de crédito, mas a consulta de cartão quase sempre retorna como não aprovado (claro, que estamos trabalhando com CobreBemX. ContaCorrenteClass aCobreBem = new CobreBemX. ContaCorrenteClass(); //arquivo de licença MesValidade = Convert. Administradora); gerado no site ToInt32(TextBox2.Text); } aCobreBem. aCartao.CartaoCredito. else ArquivoLicencaCartoes AnoValidade = Convert. { Credito = Server.MapPath( ToInt32(TextBox3.Text); //cartão reprovado “cartaoteste.conf”); aCartao.ValorDocumento = Response. //moacTeste = Teste, 1.99; Redirect(“status. //moacSimulacao = aCartao.CartaoCredito. aspx?status=F&motivo=”+ Simulação, CodigoSeguranca = aCartao.CartaoCredito. //moacProducao = Produção TextBox4.Text; ResultadoSolicitacao aCobreBem. aCartao.CartaoCredito. Aprovacao); PadroesAprovacaoCartoes. QuantidadeParcelas = } ModoOperacao = Convert.ToInt32(TextBox5. aCobreBem. ModoOperacaoAprovacao Text); DocumentosCobranca. CartaoEnum.moacTeste; //Solicita a aprovação do Clear(); aCobreBem. cartão aCobreBem = null; DocumentosCobranca. if (aCobreBem.get_ Clear(); SolicitaAprovacaoCartao(0)) //dados do cartão de { crédito //solicitação aprovada CobreBemX. IDocumentoCobranca aCobreBem.Confirma AprovacoesCartoes(); aCartao = aCobreBem. Response. DocumentosCobranca.Add; Redirect(“status. aCartao.CartaoCredito. aspx?status=T&comprovante=” Numero = TextBox1.Text; + Cartao.CartaoCredito. aCartao.CartaoCredito. Comprovante Rode a aplicação, adicione as informações do cartão e veja o resultado (Figura 8). Veja a figura 8. Note que temos um “modo de operação” que pode ser Teste, Simulação ou Produção, sendo que podemos testar a vontade usando o moacTeste. Os dados do cartão mostrados na Figura anterior são de testes. Figura 8. Solicitando a aprovação do cartão de crédito novembro 2010 25 O funcionamento é bastante semelhante ao do boleto, onde inicializamos as variáveis, configuramos as propriedades. Através do get_SolicitaAprovacaoCartao(0) verificamos se a consulta foi aprovada, assim podemos realizar o que precisamos. É interessante guardar o comprovante (propriedade ComprovanteAdministradora), salvando-o em uma tabela do banco, caso necessite consultar, posteriormente essa informação. 64 Bits Se você estiver usando um SO de 64bits, terá de configurar o Application pool do IIS para aceitar aplicativos 32 bits. Acesse o IIS e na opção Pools de Aplicativos, escolha o item responsável pelo Application pool da sua aplicação. Va até a opção Configurações Avançadas e no item Habilitar Aplicativos de 32 bits altere para True (Figura 9). Figura 9. Propriedade a ser modificada no aplication pool Veja a figura 9. Conclusão Vimos neste artigo, a solução CobreBemX, que gera boletos bancários e cobrança de cartão de crédito em aplicações ASP.NET, trazendo grande produtividade. No site do fabricante existem exemplos em outras linguagens e muita documentação sobre o produto. Um grande abraço a todos e até a próxima! Sobre o autor Luciano Pimenta É Técnico em Processamento de Dados, desenvolvedor Delphi/C# para aplicações Web com ASP.NET e Windows com Win32 e Windows Forms. Palestrante da 4ª edição da Borland Conference (BorCon). Autor de mais de 60 artigos e de mais de 300 vídeos aulas publicadas em revistas e sites especializados. É consultor da FP2 Tecnologia (www.fp2.com.br) onde ministra cursos de programação e banco de dados. É desenvolvedor da Paradigma Web Bussiness em Florianópolis-SC. www.lucianopimenta.net 26 novembro 2010 novembro 2010 27 Dicas DELPHI e escolha Align/VerticalCenters. 8) RAVE REPORT – CARREGANDO IMAGENS DINAMICAMENTE Salve na mesma pasta em que salvou o projeto.dpr. 9) Volte ao form do Delphi. Clique no RvProject1 e, no Object Inpector, propriedade Project File, associe ao projeto o arquivo Rave anteriormente criado. Para manipular um relatório Rave via programação: 1) Abra um novo projeto. 2) Adicione à cláusula uses as seguintes units: RpBase, RpCon, RpConDS, RpDefine, 10) SE A SUA IMAGEM NÃO ESTIVER SALVA NUM BANCO DE DADOS: RpDevice, RpRave, RpSystem, RvClass, RvCsData, RvCsDraw, 11) No evento OnAfterOpen, do RvProject1, insira o código abaixo: RvCsStd, RvCsRpt, RvData, RvDefine, RvDirectDataView, RvUtil; var B: TRaveBitmap; C: TRaveRectangle; 3) Adicione um Button. No evento OnClick insira o código abaixo: P: TRavePage; begin P := RvProject1.ProjMan. Begin FindRaveComponent(‘Report1.Page1’, RvProject1.Execute; nil) as TRavePage; End. B := RvProject1.ProjMan. FindRaveComponent(‘Bitmap1’, P) as TRaveBitmap; C := RvProject1.ProjMan. 4) Adicione um componente RvProject, da guia Rave. Dê dois cliques para abrir o Rave. FindRaveComponent(‘Rectangle1’, P) as TRaveRectangle; 5) Adicione um componente retângulo da guia Standard. if B <> Nil and C <> Nil then Configure sua propriedade height para 1,1. Configure sua propriedade widht para 3,1. begin B.FileLink := ‘D:\new_logo_the_ club.bmp’; B.Height := 3,0; 6) Adicione um componente BMP da guia Standard. Clicando na propriedade Image abre a caixa Bitmap Selector para buscar a imagem no arquivo desejado. B.Widht := 6,0; C.Height :=3,1; C.Widht := 6,1; C.FillColor := clInactiveCaption; Insira a imagem e configure as propriedades para altura (height) = 1 e largura (widht) = 3. 7) Selecione ambos os componentes (retângulo e imagem), clique com o lado direito e escolha Align/HorizontalCenters e depois, clique de novo 28 novembro 2010 end; 12) SE A SUA IMAGEM ESTÁ SALVA NUM BANCO DE DADOS: 13) Insira o código abaixo, no evento OnGetRow, do RvDataSetConnection: var B: TRaveBitmap; C: TRaveRectangle; P: TRavePage; begin P := RvProject1.ProjMan. FindRaveComponent(‘Report1.Page1’, nil) as TRavePage; B := RvProject1.ProjMan. FindRaveComponent(‘Bitmap1’, P) as TRaveBitmap; C := RvProject1.ProjMan. FindRaveComponent(‘Rectangle1’, P) as TRaveRectangle; if B <> Nil and C <> Nil then begin B.FileLink := ‘D:\new_logo_the_ club.bmp’; B.Height := 3,0; B.Widht := 6,0; C.Height :=3,1; C.Widht := 6,1; C.FillColor := clInactiveCaption; Connection.DoGetRow; end; 14) Compile e rode. 15) Clique Ok. novembro 2010 29 30 novembro 2010 novembro 2010 novembro 2010