Manual Técnico Boleto Eletrônico Online Gateway de Pagamentos HSBC Cobrança Não Registrada Versão: 2.5 Julho/2014 PUBLIC
SUMÁRIO APRESENTAÇÃO 03 1. NOTAS PRELIMINARES 04 2. LEGISLAÇÃO 05 3. PROCESSOS DE CONTRTAÇÃO DO SERVIÇO 05 4. INTERFACE DO COMÉRCIO ELETRÔNICO DO CLIENTE 06 5. DATA DE VENCIMENTO 07 6. NÚMERO DO DOCUMENTO 08 7. INSTRUÇÕES 08 8. DADOS DO SACADO 08 9. RE-EMISSÃO 08 10. LOGO DO HSBC 08 11. TESTES 08 12. ANEXO I Check List de Integração 09 13. ANEXO Il Exemplo de desenvolvimento em ASP 12 14. ANEXO lll Exemplo de desenvolvimento em PHP 14 15. ANEXO IV Exemplo de desenvolvimento em JSP 15 16. ANEXO V Exemplo de desenvolvimento em ASP.NET/C# 17 PUBLIC - 2
EMISSÃO ONLINE PELO LINK DO HSBC - COBRANÇA NÃO REGISTRADA NOTAS PRELIMINARES PREENCHIMENTO DO BLOQUETO APRESENTAÇÃO Prezado Cliente. Nós do HSBC Bank Brasil S.A. Banco Múltiplo estamos lhe entregando o Manual Técnico Módulo da Cobrança Não Registrada - Emissão On-line pelo Link do HSBC, pois através dele, aqueles que lhe prestam suporte em Informática terão as orientações necessárias para manter a integração com a qualidade e agilidade de nossos serviços. O Manual Técnico da Cobrança Não Registrada - Emissão On-line pelo Link do HSBC fornece todas as informações para que a emissão dos bloquetos de cobrança possa ser realizada em nosso ambiente de processamento, o que lhe proporcionará agilidade e eficiência no momento de cobrar suas vendas on-line. No caso de dúvidas, contate seu gerente. PUBLIC - 3
1. NOTAS PRELIMINARES O QUE É A COBRANÇA NÃO REGISTRADA? A Cobrança Não Registrada Emissão On-line pelo link do HSBC é uma modalidade da Cobrança do HSBC, e objetiva atender aos clientes que efetuam vendas on-line e querem oferecer essa forma de pagamento a seus clientes. Assim, a emissão do bloqueto on-line é realizada nos sistemas do HSBC, com dados fornecidos pelo Cliente, disponibilizando uma imagem de bloqueto na Internet, para ser impressa por seus clientes sem que o Cliente tenha que desenvolver em seus sistemas a inteligência de formatação do boleto e do código de barras. Para operacionalizar o intercâmbio de informações pelas quais o Cliente saberá quais boletos emitidos pelo Link do HSBC foram pagos, este manual é complementado pelo Manual Técnico Padrão CNAB 400 ou CNAB 240. PUBLIC - 4
2. LEGISLAÇÃO A padronização do bloqueto de Cobrança, especificamente da Ficha de Compensação, obedece ao modelo CADOC 24044-4, instituído pelo Banco Central do Brasil, através da Carta Circular nº 2.414, de 07.10.93. e alterado pela Carta-Circular nº 2790 de 04.03.98. A alteração nas especificações do Código de Barras, com a introdução do Dígito de Autoconferência (DAC), ocorreu pela Carta Circular nº 2.531 do Bacen, de 24.02.95. A alteração nas especificações do Código de Barras, com a introdução do Fator de vencimento nos bloquetos de cobrança, ocorreu pela Carta Circular nº 125/2000 do Bacen, de 02.05.2000. 3. PROCESSO DE CONTRATAÇÃO DO SERVIÇO O Cliente deve contratar a Cobrança Não Registrada ofertada pelo HSBC. Esse módulo da cobrança é o mais recomendado porque em vendas pela Internet a mercadoria só é entregue ou o serviço só é realizado após a confirmação do pagamento realizado. O não pagamento do boleto emitido na internet não caracteriza dívida, portanto não pode haver processo de protesto do comprador. O Cliente assina também o Contrato de Prestação de Serviços para Disponibilização de Boletos de Cobrança por Meio Eletrônico. Após a contratação da Cobrança Não Registrada o HSBC definirá o CÓDIGO DE CEDENTE e o informará ao Cliente. O Cliente deverá informar o(s) número(s) de IP de seu(s) servidor(es) para o banco, que o(s) utiliza como parâmetro(s) de segurança. Não há limitação de quantidade de IPs que podem ser cadastrados. O motivo é que a solução exige que o servidor Web do Cedente abra uma conexão direta (Server-to-Server) com o servidor do HSBC. Esta conexão só é aceita se o IP de origem estiver cadastrado. (Ver item INTERFACE DO COMÉRCIO ELETRÔNICO DO CLIENTE COM O HSBC). PUBLIC - 5
4. INTERFACE DO COMÉRCIO ELETRÔNICO DO CLIENTE COM O HSBC O processo de Emissão On-line funciona da seguinte maneira (ver figura): 1. SACADO acessa o site da empresa e realiza sua compra, 2. SACADO, após cadastrar-se no site do cedente, seleciona forma de pagamento "Boleto de compensação". 3. SACADO efetua um submit para um link hospedado no servidor do CEDENTE 4. O Servidor do CEDENTE efetua uma conexão direta (Server-to-Server) via post (ver item observações abaixo do item 9) para o endereço: https://wwws5.hsbc.com.br/ofb-bol-cnr/servlets/geraboleto?servletstate=10 5. O POST enviado pelo Servidor do Cliente para o link do HSBC deve conter os seguintes dados para que a geração do boleto ocorra com sucesso: Nome do Campo Tipo de Dado Tamanho Formato Preenchimento Obrigatório? codigocedente NUMÉRICO 7 9999999 S datavencimento DATA 10 DD/MM/AAAA S valordocumento ALFANUMÉRICO 10 9999999.99 S numeroparcela NUMERICO 02 99 N totalparcelas NUMERICO 02 99 N numerodocumento NUMERICO 13 9999999999999 S L1 ALFANUMÉRICO 66 N L2 ALFANUMÉRICO 66 N L3 ALFANUMÉRICO 66 N L4 ALFANUMÉRICO 66 N L5 ALFANUMÉRICO 66 N unidadecedente ALFANUMÉRICO 54 N nomesacado ALFANUMÉRICO 30 S cpfcnpjsacado NUMERICO 14 99999999999999 S enderecosacado ALFANUMÉRICO 40 N numerosacado NUMERICO 05 N complementosacado ALFANUMÉRICO 10 N cepsacado ALFANUMÉRICO 10 99.999-999 N bairrosacado ALFANUMÉRICO 15 N cidadesacado ALFANUMÉRICO 15 N estadosacado ALFANUMÉRICO 02 N Obs. Mensagens que serão mostradas no boleto Atenção: os caracteres maiúsculos e minúsculos têm de ser respeitados, tanto os da URL quanto os do nome dos parâmetros do post. Os campos indicados na tabela acima com Preenchimento obrigatório n devem ser gerados com conteúdo branco. 6. HSBC valida se o cedente está cadastrado e se a requisição tem como origem os servidores do cedente. PUBLIC - 6
7. HSBC obtém informações do cedente, linha digitável e código de barras e monta o boleto. 8. HSBC devolve o boleto gerado em PDF para o Servidor do Cliente. 9. O Servidor do Cedente captura o PDF gerado e apresenta o mesmo em uma página própria (hospedada no seu servidor). Observações - Os dados informados pelo CEDENTE não são validados pelo HSBC (sacado, valor, data de vencimento, etc.). Portanto é responsabilidade do Cliente enviá-los com correção - IMPORTANTE: A chamada para a URL do HSBC, deve ser efetuada internamente através de conexão Server-to-Server do servidor do CEDENTE para o Servidor do HSBC. Caso o cedente disponibilize o link do HSBC em sua própria página (ex: se colocar a URL do HSBC como Action de um Form HTML), o boleto não será gerado, pois neste caso a requisição / conexão estará partindo do IP do sacado e não do IP do Servidor do CEDENTE. Vide figura abaixo: 1. Efetua requisição para uma página hospedada no servidor do cedente 2. Cedente efetua uma REQUISIÇÃO INTERNA para o link de geração de boleto do HSBC SACADO CEDENTE HSBC 5. Cedente apresenta boleto gerado como se o mesmo fosse gerado em seu servidor 4. Cedente captura PDF retornado e o apresenta em uma página hospedada no seu servidor 3. HSBC devolve PDF com o boleto gerado 5. Data de Vencimento Recomendamos que a data de vencimento definida pelo Cliente seja sempre a do dia posterior à compra ou maior, para possibilitar a seu cliente o pagamento, caso ele realize a compra após o horário do expediente bancário. PUBLIC - 7
6. Número do Documento - campo numerodocumento Este número é único para o título, deve ser controlado pelo Cliente e será utilizado na conciliação dos pagamentos liquidados, pois será enviado ao Cliente no arquivo retorno de liquidação. 7. Instruções O campo instruções tem por finalidade orientar o Caixa quanto ao recebimento do bloqueto. Para compor o conjunto de mensagens, o Cliente poderá utilizar como modelo as instruções padrões listadas na seção Tabela de Notas Explicativas - nota 9, do Manual Técnico - Módulo I, Padrão CNAB 400. As instruções serão enviadas nos campos L1, L2, L3, L4 e L5 da mensagem. 8. Dados do sacado Como o boleto será emitido pelo site, dados do sacado além de nome e CPF/CNPJ não são obrigatórios. 9. RE-EMISSÃO Sugerimos ao Cliente que coloque em seu site, de forma acessível ao consumidor, a possibilidade de emitir novamente o boleto bancário referente à sua compra, evitando assim que perdas de boleto transformem-se em perdas de vendas para o Cliente. O link de re-emissão deve repetir o processo de chamada do site do HSBC, com nova data de vencimento, se necessário, de forma a possibilitar o pagamento em qualquer agência de qualquer banco. 10. LOGO DO HSBC Eventualmente é possível utilizar o logo do HSBC para indicar a opção de forma de pagamento com boleto. Caso o Cliente deseje utilizá-lo, deve entrar em contato com o gerente para que esse o oriente. 11. TESTES Antes de colocar a opção de pagamento por boleto bancário em seu site, o Cliente deverá aguardar a sinalização de seu gerente para iniciar os testes de conexão, para que haja a devida homologação técnica. Este procedimento é indispensável para se garantir a qualidade da conexão e da geração do boleto. Recomendamos ao cliente que se certifique de que o Check list de integração (Anexo I) foi verificado. PUBLIC - 8
12. ANEXO I - Check List de Integração 1 A conexão deve obrigatoriamente ser SSL (Porta 443) Os nomes de parâmetros, principalmente o ServletState e o código do cedente, devem respeitar a nomenclatura definida no documento de integração, inclusive 2 maiúsculas e minúsculas. O ServletState deve ser passado juntamente do endereço (URL), e os demais na linha do POST. Quando o HSBC recebe a solicitação HTTP Post, valida se o IP de origem da conexão é o IP que está cadastrado no sistema, ou seja, o IP do servidor Web do cliente. Não funciona se for feito um redirect ou qualquer outro tipo de chamada que parta 3 diretamente do browser do cliente para o nosso sistema. (Referrer, JavaScript, etc.). (Vide as figuras ao final deste documento) Valores de parâmetro na querystring do POST devem estar URLEncoded conforme formato MIME application/x-www-form-urlencoded. Ex: Espaços são convertidos 4 para +, Caracteres especiais são convertidos para %xy, onde xy é o código hexadecimal do caractere, etc. Detalhamento/Exemplo de solução O programa da loja, que roda no servidor (JSP, ASP, CGI) terá que ter lógica semelhante à seguinte: var resultadohsbc = executapostparaurldohsbc(parâmetros,...); printoutputparacliente(resultadohsbc); Neste exemplo, a variável resultadohsbc, após executado o trecho em questão, estaria carregada com a resposta da URL do HSBC. Desta forma, quem faz o POST para o HSBC é o servidor de hospedagem da loja, e não o browser do cliente. O resultado do POST é incluído dinamicamente, pelo sistema da loja, no conteúdo da página para o cliente. Vide figuras abaixo: PUBLIC - 9
PUBLIC - 10
PUBLIC - 11
13. ANEXO II - Exemplo de desenvolvimento ASP <%@language=vbscript%> <html> <head> <title>gera_boleto</title> <style> body { margin: 20px; font: 11px sans-serif; color: #000; th { font: bold 11px sans-serif; color: #000; padding: 4px 10px; border-bottom: 1px solid #9E9E9E; td { font: 11px sans-serif; color: #000; text-align: right; padding: 4px 10px; border-bottom: 1px solid #9E9E9E; hr { border: 10px 0 20px 0; color: #9E9E9E; background-color: #9E9E9E; height: 1px; width: 100%; #erro { font: bold 16px sans-serif; color: #F00.tit { font: bold 16px sans-serif; color: #000; </style> </head> <body> <% Server.ScriptTimeout = 300 '####################################################### '### CONEXÃO MSXML2 PARA BUSCAR DADOS '####################################################### set xmlhttp = CreateObject("MSXML2.ServerXMLHTTP") on error resume next '####################################################### '### CONEXÃO PARA PASSAR PARAMETROS E RECEBER O HTML '####################################################### codigocedente = "3752950" datavencimento = "10/02/2008" valordocumento = "0001043.67" numeroparcela = "01" totalparcelas = "02" numerodocumento = "0000000000001" L1 = "Senhor(a) Caixa, favor seguir as instruções abaixo:" L2 = "1. Não receber este documento após a data de seu vencimento" L3 = "2. Valores expressos em Reais" L4 = "3. Não receber por depósito bancário" L5 = "Reader's Digest Brasil" unidadecedente = "NOME FAKE DO BRASIL" nomesacado = "NOME FAKE DA SILVA" cpfcnpjsacado = "12345678901234" enderecosacado = "RUA DO CARMO" numerosacado = "43" complementosacado = "10 ANDAR" cepsacado = "22.222-222" bairrosacado = "CENTRO" cidadesacado = "RIO DE JANEIRO" estadosacado = "RJ" url = "https://wwws5.hsbc.com.br/ofb-bol-cnr/servlets/geraboleto?servletstate=10" xmlhttp.open "POST", url, false xmlhttp.setrequestheader "Content-Type", "application/x-www-form-urlencoded" xmlhttp.send "codigocedente=" & codigocedente& "&datavencimento=" & datavencimento & "&valordocumento=" & valordocumento & "&numeroparcela=" & numeroparcela& "&totalparcelas=" & totalparcelas & "&numerodocumento=" & numerodocumento & "&L1=" & L1 & "&L2=" & L2 & "&L3=" & L3 & "&L4=" & L4 & "&L5=" & L5 & "&unidadecedente=" & unidadecedente & "&nomesacado=" & nomesacado & "&cpfcnpjsacado=" & cpfcnpjsacado & "&enderecosacado=" & enderecosacado & "&numerosacado=" & numerosacado & "&complementosacado=" & complementosacado & "&cepsacado=" & cepsacado & "&bairrosacado=" & bairrosacado & "&cidadesacado=" & cidadesacado & "&estadosacado=" & estadosacado //boleto = xmlhttp.responsetext //Response.Write "retorno: " & boleto Response.ContentType = "application/pdf" //Para abrir o arquivo no navegador, definir a propriedade abaixo como "inline" //Para forçar o download do arquivo, definir a propriedade abaixo como "attachment" //Para definir o nome do arquivo, definir a propriedade filename abaixo com o nome desejado, // no caso está definido como BoletoHSBC.pdf mas pode ser qualquer nome de arquivo que melhor // atenda à necessidade do cliente //Para não definir nome do arquivo, apenas deixar em branco ou apagar a propriedade filename abaixo Response.AppendHeader("content-disposition", "inline;filename=boletohsbc.pdf "); Response.BinaryWrite xmlhttp.responsebody PUBLIC - 12
set xmlhttp = nothing %> </body> </html> Observação: O exemplo acima se destina ao entendimento da solução a ser desenvolvida, e não à utilização exatamente como está. PUBLIC - 13
14. ANEXO III - Exemplo de desenvolvimento PHP <?php $sock = fsockopen("ssl://wwws5.hsbc.com.br", 443, $errno, $errstr, 30); if(!$sock) die ("$errstr ($errno)\n"); $data = "ServletState=10&codigoCedente=3709590 &datavencimento=30/08/2007&valordocumento=1.00&numeroparcela=1&totalparcelas=1&numerodocumento=0000000000159&l1=inst rução1&l2=instrução 2&L3=Instrução 3&L4=Instrução 4&L5=Instrução5&unidadeCedente=01&nomeSacado=Alexandre&cpfCnpjSacado=01848547927&enderecoSacado=Rua Cel. de tal, 397 - Apto.2&numeroSacado=&complementoSacado=&cepSacado=04.676-010&bairroSacado=Belenzinho&cidadeSacado=São Paulo&estadoSacado=SP"; $d1 = explode('&', $data); $data = ""; for($i=0;$i<sizeof($d1);$i++) { list($field, $value) = explode('=', $d1[$i]); $data.= $field. "=". urlencode($value). "&"; fputs($sock, "POST /OFB-BOL-CNR/servlets/GeraBoleto HTTPS/1.0\r\n"); fputs($sock, "Host: wwws5.hsbc.com.br\r\n"); fputs($sock, "Content-type: application/x-www-form-urlencoded\r\n"); fputs($sock, "Content-length: ". strlen($data). "\r\n"); fputs($sock, "Accept: */*\r\n"); fputs($sock, "\r\n"); fputs($sock, "$data\r\n"); fputs($sock, "\r\n"); $headers = ""; while ($str = trim(fgets($sock, 4096))) { $headers.= "$str\n"; $body = ""; while (!feof($sock)) { $body.= fgets($sock, 4096); fclose($sock); /** * Cabeçalho de resposta * */ //print "<!--\n". $headers. "\n-->\n\n"; /** * Corpo do documento retornado * */ print $body;?> Observação: O exemplo acima se destina ao entendimento da solução a ser desenvolvida, e não à utilização exatamente como está. PUBLIC - 14
15. ANEXO IV - Exemplo de desenvolvimento JSP <%@ page language="java" contenttype="text/html; charset=iso-8859-1" pageencoding="iso-8859-1"%> <%@page import="java.net.url" %> <%@page import="java.net.urlencoder" %> <%@page import="java.net.urlconnection" %> <%@page import="java.io.outputstreamwriter" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/tr/html4/loose.dtd"> <%@page import="java.io.datainputstream"%> <html> <head> <title>jsp Form Demo</title> <style type="text/css"> label{ margin-right:20px; input{ margin-top:5px; </style> </head> <body> <b>página Encontrada!</b> <% System.out.println("Preparando chamada..."); String val = request.getparameter("issubmitted"); int issubmitted = 0; if (val!= null) { System.out.println("Preparando dados..."); issubmitted = Integer.parseInt(val); if (issubmitted == 1) { String codigocedente = "3752950"; String datavencimento = "10/02/2008"; String valordocumento = "0001043.67"; String numeroparcela = "01"; String totalparcelas = "02"; String numerodocumento = "0000000000001"; String L1 = "Senhor(a) Caixa, favor seguir as instruções abaixo:"; String L2 = "1. Não receber este documento após a data de seu vencimento"; String L3 = "2. Valores expressos em Reais"; String L4 = "3. Não receber por depósito bancário"; String L5 = "Reader's Digest Brasil"; String unidadecedente = "NOME FAKE DO BRASIL"; String nomesacado = "NOME FAKE DA SILVA"; String cpfcnpjsacado = "12345678901234"; String enderecosacado = "RUA DO CARMO"; String numerosacado = "43"; String complementosacado = "10 ANDAR"; String cepsacado = "22.222-222"; String bairrosacado = "CENTRO"; String cidadesacado = "RIO DE JANEIRO"; String estadosacado = "RJ"; 8"); 8"); String data = URLEncoder.encode("codigoCedente", "UTF-8") + "=" + URLEncoder.encode(codigoCedente, "UTF-8"); data += "&" + URLEncoder.encode("dataVencimento", "UTF-8") + "=" + URLEncoder.encode(dataVencimento, "UTF-8"); data += "&" + URLEncoder.encode("valorDocumento", "UTF-8") + "=" + URLEncoder.encode(valorDocumento, "UTF-8"); data += "&" + URLEncoder.encode("numeroParcela", "UTF-8") + "=" + URLEncoder.encode(numeroParcela, "UTF-8"); data += "&" + URLEncoder.encode("totalParcelas", "UTF-8") + "=" + URLEncoder.encode(totalParcelas, "UTF-8"); data += "&" + URLEncoder.encode("numeroDocumento", "UTF-8") + "=" + URLEncoder.encode(numeroDocumento, "UTF- data += "&" + URLEncoder.encode("L1", "UTF-8") + "=" + URLEncoder.encode(L1, "UTF-8"); data += "&" + URLEncoder.encode("L2", "UTF-8") + "=" + URLEncoder.encode(L2, "UTF-8"); data += "&" + URLEncoder.encode("L3", "UTF-8") + "=" + URLEncoder.encode(L3, "UTF-8"); data += "&" + URLEncoder.encode("L4", "UTF-8") + "=" + URLEncoder.encode(L4, "UTF-8"); data += "&" + URLEncoder.encode("L5", "UTF-8") + "=" + URLEncoder.encode(L5, "UTF-8"); data += "&" + URLEncoder.encode("unidadeCedente", "UTF-8") + "=" + URLEncoder.encode(unidadeCedente, "UTF-8"); data += "&" + URLEncoder.encode("numeroDocumento", "UTF-8") + "=" + URLEncoder.encode(numeroDocumento, "UTF- data += "&" + URLEncoder.encode("nomeSacado", "UTF-8") + "=" + URLEncoder.encode(nomeSacado, "UTF-8"); data += "&" + URLEncoder.encode("cpfCnpjSacado", "UTF-8") + "=" + URLEncoder.encode(cpfCnpjSacado, "UTF-8"); data += "&" + URLEncoder.encode("enderecoSacado", "UTF-8") + "=" + URLEncoder.encode(enderecoSacado, "UTF-8"); PUBLIC - 15
data += "&" + URLEncoder.encode("numeroSacado", "UTF-8") + "=" + URLEncoder.encode(numeroSacado, "UTF-8"); "UTF-8"); data += "&" + URLEncoder.encode("complementoSacado", "UTF-8") + "=" + URLEncoder.encode(complementoSacado, data += "&" + URLEncoder.encode("cepSacado", "UTF-8") + "=" + URLEncoder.encode(cepSacado, "UTF-8"); data += "&" + URLEncoder.encode("bairroSacado", "UTF-8") + "=" + URLEncoder.encode(bairroSacado, "UTF-8"); data += "&" + URLEncoder.encode("cidadeSacado", "UTF-8") + "=" + URLEncoder.encode(cidadeSacado, "UTF-8"); data += "&" + URLEncoder.encode("estadoSacado", "UTF-8") + "=" + URLEncoder.encode(estadoSacado, "UTF-8"); // Enviado Dados para a emissão do boleto System.out.println("Montando URL de conexão..."); URL url = new URL("https://wwws5.hsbc.com.br/OFB-BOL-CNR/servlets/GeraBoleto?ServletState=10"); // Montando a conexão com o Servidor URLConnection conn = url.openconnection(); conn.setdoinput(true); conn.setdooutput(true); conn.setrequestproperty("content-type", "application/x-www-form-urlencoded"); OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream()); DataInputStream input; System.out.println("Enviando dados..."); wr.write(data); wr.flush(); // Get response data. System.out.println("Retorno da chamada..."); input = new DataInputStream (conn.getinputstream ()); BufferedOutputStream bufferedoutputstream = new BufferedOutputStream(response.getOutputStream()); int bytesread = 0; byte[] buffer = new byte[1024]; response.setcontentlength(connection.getcontentlength()); response.setcontenttype("application/pdf"); //Para abrir o arquivo no navegador, definir a propriedade abaixo como "inline" //Para forçar o download do arquivo, definir a propriedade abaixo como "attachment" //Para definir o nome do arquivo, definir a propriedade filename abaixo com o nome desejado, // no caso está definido como BoletoHSBC.pdf mas pode ser qualquer nome de arquivo que melhor // atenda à necessidade do cliente //Para não definir nome do arquivo, apenas deixar em branco ou apagar a propriedade filename abaixo response.setheader("content-disposition", "inline; filename=boletohsbc.pdf"); response.setheader("cache-control", "cache, must-revalidate"); response.setheader("pragma", "public"); while ((bytesread = bufferedinputstream.read(buffer))!= -1) { bufferedoutputstream.write(buffer, 0, bytesread); bufferedoutputstream.flush(); input.close (); %> </body> </html> Observação: O exemplo acima se destina ao entendimento da solução a ser desenvolvida, e não à utilização exatamente como está. PUBLIC - 16
16. ANEXO V - Exemplo de desenvolvimento ASP.NET/C# using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace TesteWeb { public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { protected void Button1_Click(object sender, EventArgs e) { if (txtteste.text!= "") { string url = "https://wwws5.hsbc.com.br/ofb-bol-cnr/servlets/geraboleto?servletstate=10"; chamaurl(url); private void chamaurl(string url) { String codigocedente = "3752950"; String datavencimento = "10/02/2008"; String valordocumento = "0001043.67"; String numeroparcela = "01"; String totalparcelas = "02"; String numerodocumento = "0000000000001"; String L1 = "Senhor(a) Caixa, favor seguir as instruções abaixo:"; String L2 = "1. Não receber este documento após a data de seu vencimento"; String L3 = "2. Valores expressos em Reais"; String L4 = "3. Não receber por depósito bancário"; String L5 = "Reader's Digest Brasil"; String unidadecedente = "NOME FAKE DO BRASIL"; String nomesacado = "NOME FAKE DA SILVA"; String cpfcnpjsacado = "12345678901234"; String enderecosacado = "RUA DO CARMO"; String numerosacado = "43"; String complementosacado = "10 ANDAR"; String cepsacado = "22.222-222"; String bairrosacado = "CENTRO"; String cidadesacado = "RIO DE JANEIRO"; String estadosacado = "RJ"; String data = "codigocedente" + "=" + codigocedente ; data += "&" + "datavencimento" + "=" + datavencimento; data += "&" + "valordocumento" + "=" + valordocumento; data += "&" + "numeroparcela" + "=" + numeroparcela; data += "&" + "totalparcelas" + "=" + totalparcelas; data += "&" + "numerodocumento" + "=" + numerodocumento; data += "&" + "L1" + "=" + L1; data += "&" + "L2" + "=" + L2; data += "&" + "L3" + "=" + L3; data += "&" + "L4" + "=" + L4; data += "&" + "L5" + "=" + L5; data += "&" + "unidadecedente" + "=" + unidadecedente; data += "&" + "numerodocumento" + "=" + numerodocumento; data += "&" + "nomesacado" + "=" + nomesacado; data += "&" + "cpfcnpjsacado" + "=" + cpfcnpjsacado; data += "&" + "enderecosacado" + "=" + enderecosacado; data += "&" + "numerosacado" + "=" + numerosacado; PUBLIC - 17
data += "&" + "complementosacado" + "=" + complementosacado; data += "&" + "cepsacado" + "=" + cepsacado; data += "&" + "bairrosacado" + "=" + bairrosacado; data += "&" + "cidadesacado" + "=" + cidadesacado; data += "&" + "estadosacado" + "=" + estadosacado; Encoding encoding = Encoding.ASCII; byte[] dados = encoding.getbytes(data); // Prepara chamada HttpWebRequest orequest = (HttpWebRequest)WebRequest.Create(url); orequest.method = "POST"; orequest.contenttype = "application/x-www-form-urlencoded"; orequest.contentlength = dados.length; Stream oreqstream = orequest.getrequeststream(); //Envia os dados oreqstream.write(dados, 0, dados.length); oreqstream.close(); //Recupera resposta HttpWebResponse oresponse = (HttpWebResponse)oRequest.GetResponse(); Stream orespstream = oresponse.getresponsestream(); int buffer = 1024; byte[] databuffer = new byte[buffer]; int count = 0; MemoryStream ms = new MemoryStream(); while ((count = orespstream.read(databuffer, 0, buffer)) > 0) { ms.write(databuffer, 0, count); orespstream.close(); Response.AddHeader("Content-Type", "application/pdf"); //Para abrir o arquivo no navegador, definir a propriedade abaixo como "inline" //Para forçar o download do arquivo, definir a propriedade abaixo como "attachment" //Para definir o nome do arquivo, definir a propriedade filename abaixo com o nome desejado, // no caso está definido como BoletoHSBC.pdf mas pode ser qualquer nome de arquivo que melhor // atenda à necessidade do cliente //Para não definir nome do arquivo, apenas deixar em branco ou apagar a propriedade filename abaixo Response.AddHeader("Content-Disposition", "inline; filename=boletohsbc.pdf;"); Response.AddHeader("Content-Length", ms.length.tostring()); Response.BinaryWrite(ms.ToArray()); Response.Flush(); Response.End(); Observação: O exemplo acima se destina ao entendimento da solução a ser desenvolvida, e não à utilização exatamente como está. PUBLIC - 18