Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Bom to postando aqui porque vi que outros usuários penaram com isso então vou relatar como foi resolvido depois de inumeros telefonemas para locaweb e para o bradesco:
A locaweb disponibiliza um kit de pagamento fácil do bradesco que pode ser aplicado porém algumas alterações devem ser consideradas:
1) acessando o painel do lojista no scopus. Para boleto não adianta setar o campo URL de confirmação porque ele somente é utilizado no retorno das outras formas de pagamento menos para boletos, portanto o usuario tem que tratar do direcionamento correto para o boleto.
Informe corretamente os campos URL de notificação e URL de falha copiando e colando os dados diretamente do pdf que está disponivel no painel da scopus.
Feito isso as chamadas:
1) em js quando o usuario clicar em imprimir o boleto:
<script language="Javascript">function criaBoleto() { url="http://mupteste.comercioeletronico.com.br/sepsBoletoRet/xxxx/prepara_pagto.asp?Merchantid=xxxx&orderid=zzzzz&"; winBol=window.open(url,'vpos','toolbar=no,menubar=no,resizable=yes,status=no,scrollbars=yes,top=0, left=0, width=700,height=485');winBol.focus();} </script>Onde xxxxx é o código da loja para testes fornecidos pela scopus. Quando for homologada, a scopus enviará outro email informando o codigo final da loja para esse acesso.zzzzzz é o seu numero de pedido e não pode haver repetições.
Essa chamada eu coloquei na pagina final do processo ou seja, mostra a compra com sucesso e um link para o usuario clicar e abrir o boleto.
O processo é o seguinte: O scopus recebe a requisição acima, em faz um get no site buscando a URL informada como URL de notificação para boleto bancário. Eu usei um arquivo chamado dadosBradesco.php.
Esse arquivo é responsável em montar os dados para o post. Na primeira vez o arquivo recebe o transId como 'getBoleto', portanto entra no if para a preparação dos dados.
O script deve ler a base de dados, a tabela carrinho e montar a primeira parte dos dados. Após o <BEGIN_ORDER_DESCRIPTION> até o <END_ORDER_DESCRIPTION> não poderá conter quebras de linhas nem espaços.
O bradesco confronta o valor dos itens mais o valor do frete com o campo <VALORDOCUMENTOFORMATADO> e caso haja qualquer divergência, o boleto não é gerado e retorna um erro que poderá ser consultado no próprio painel da scopus.
abaixo meu script dadosBradesco.php comentado:
<!--'-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#' Kit de Integração Pagamento Fácil Bradesco' Versão: 2.0' Arquivo: dadosCompraBradesco.php' Função: Arquivo de comunicação com o Bradesco para transação'-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#--><?// esses parametros são passados pelo servidor da Scopus$tipo_tran = $transId; // a variavel transId é retornada logo apos a chamada feito pelo javascript conforme mostra acima.$codigo_pedido = $numOrder; // o numero do pedido que foi passado pelo javascript retorna nessa variavel//$codigo_pedido=1566;//$tipo_tran="putAuthBoleto";// Aqui monta a mensagem com os dados da compra que serão repassados para o MUP// Preste muita atenção na formatação dos dados : Após o <BEGIN_ORDER_DESCRIPTION> Não poderá// conter quebra de linha ou espaços, o mesmo devendo acontecer com o <END_ORDER_DESCRIPTION>, que // não poderá ser precedido de quebra de linha nem espaços. include '../global.php'; // definições para acesso a base de dados// eu uso a extensão mysqli, portanto caso use o acesso convencional, deve criar a conexão e seleção da base de dados antes, pois eu faço isso ja no global.php e deixo a var $conn pronta para qualquer uso.$query=$conn->query("update pedidos set formaPgto='BOLETO' where pedido_id=$codigo_pedido") or die("Erro 21");$query=$conn->query("select * from pedidos where pedido_id=$codigo_pedido") or die("Erro 23");$rsPedido=$query->fetch_assoc();$BradescoDiasdeVencimento = 3; // total dias após a emissão para o vencimento// veja que esse if trata 3 formas de pagamento, no caso aqui o retorno é o getBoletoif (($tipo_tran == "getOrder") || ($tipo_tran == "getBoleto") || ($tipo_tran == "getTransfer")) { // Le informacoes dos pedidos (Esses dados deverão ser resgatados de sua base de dados) $quantidade = ""; // nao usado aqui $preco_unitario = ""; // nao usado aqui $nome_produto = ""; // nao usado aqui // dados da base de dados tabela pedidos $subTotal = $rsPedido['subTotal']; $valortotal = $rsPedido['totalGeral']; // como a loja oferece um desconto no pagamento por boleto, eu tive que aplicar esse fator ao frete // esse fator vem do global.php que é de 4% mas o proprietario pode alterar a vontade pois está numa tabela do mysql $taxa_envio = $rsPedido['taxaEnvio'] * (100-$fatorDesconto)/100; $sacado = $rsPedido['nome']; $cgccpf = $rsPedido['cpf']; $complemento = $rsPedido['compl']; $rua = $rsPedido['ender']; $cidade = $rsPedido['cidade']; $estado = $rsPedido['uf']; $cep = substr($rsPedido['cep'], 0, 5) . substr($rsPedido['cep'], -3); // o cep não pode conter pontos ou traços $BradescoShopFacil = "0"; // se o lojista fizer parte do shopping bradesco deve setar pra 1 senão fica em 0 $BradescoRazaoSocial = "razao social da loja"; // razao social da loja $BradescoAgencia = "001"; // para embiente de testes deve fica em 001 $BradescoCodigoCedente = "1234567"; // para embiente de testes deve fica em 1234567 // as assinaturas devem ser copiadas do pdf e não podem ter qualquer alteração. $BradescoAssinaturaTransfer = "7B94A66D138FFD2AEBFBE3D8E0BDBD02700A5B793F017B0C8B40252C3680F9CD05C7EEB1A395C84916425DC318F7F07518D416194FB077AA47A8DBD2B35B2E4C376A23385FDD9B0AA3E7D0712B373B9EFD11028ADFC763B7EAD4A3E70FC8BE4A3CF4DA804E692A6173F4B81F568D7A9A38F663106149A34409B3C48147FBAA12"; $BradescoAssinaturaBoleto = "233542AD8CA027BA56B63C2E5A530029F68AACD5E152234BFA1446836220CAA53BD3EA92B296CA94A313E4E438AD64C1E4CF2CBAD6C67DAA00DE7AC2C907A99979A5AB53BFEF1FD6DD3D3A24B278536929F7F747907F7F922C6C0F3553F8C6E29D68E1F6E0CA2566C46C63A2DD65AFF7DF4802FBF4811CA58619B33989B8DDF8";// $BradescoDiasdeVencimento = 3; // já informado acima $boleto_emitido = 0; // aqui inicia o processo da montagem dos dados sei la parece XML $Resposta = "<BEGIN_ORDER_DESCRIPTION><orderid>=(" . $codigo_pedido . ")"; $query=$conn->query("select * from carrinho where pedido_id=$codigo_pedido"); while ($carrinho=$query->fetch_assoc()) {// a quantidade não pode ter virgulas $quantidade = str_replace(",", ".", $carrinho['quantidade']); $preco_unitario = $carrinho['preco']; $preco_unitario=$preco_unitario * (100-$fatorDesconto)/100; // aqui aplico o mesmo desconto item a item e a seguir é retirado espaços, pontos e virgulas do valor unitário $preco_unitario = str_replace(",", ".", $preco_unitario); $total_aux = $quantidade * $preco_unitario; $total_aux = str_replace("," , "", number_format($total_aux, 2, ",", ".")); $total_aux = str_replace("." , "", $total_aux); $descricao = str_replace(")", "", $carrinho['modelo']); $descricao = str_replace("(", "", $descricao);// os dados são colocados entre parenteses portanto nenhum dado deve conter parenteses dentro da string $Resposta .= chr(13) . chr(10) . "<descritivo>=(" . $descricao . ")" . chr(13) . chr(10); $Resposta .= "<quantidade>=(" . $quantidade . ")" . chr(13) . chr(10) ; $Resposta .= "<unidade>=(un)" . chr(13) . chr(10); $Resposta .= "<valor>=(" . $total_aux . ")"; } // do while $taxa_envio = str_replace(",", ".", $taxa_envio); $total = str_replace(",", "", number_format($taxa_envio, 2, ",", ".")); $total = str_replace(".", "", $total); if ($taxa_envio <> "0"){ $Resposta .= chr(13) . chr(10) . "<adicional>=(Taxa de envio)" . chr(13) . chr(10); $Resposta .= "<valorAdicional>=(" . $total . ")"; } $Resposta .= "<END_ORDER_DESCRIPTION>" . chr(13) . chr(10); echo $Resposta; //****** transferencia entre contas// neste caso não estou usando pois é so o boleto que interessa. if ($tipo_tran == "getTransfer"){ $Resposta = ""; $Resposta .= chr(13) . chr(10); $Resposta .= "<BEGIN_TRANSFER_DESCRIPTION><NUMEROAGENCIA>=(" . $BradescoAgencia . ")" . chr(13) . chr(10); $Resposta .= "<NUMEROCONTA>=(" . $BradescoCodigoCedente . ")" . chr(13) . chr(10); $Resposta .= "<ASSINATURA>=(" . $BradescoAssinaturaTransfer . ")<END_TRANSFER_DESCRIPTION>" . chr(13) . chr(10); echo $Resposta; }// veja que no bloco acima é colocado um Enter (13) e (10) para cada item //****** geracao do boleto// entra aqui para gerar o form do boleto if ($tipo_tran == "getBoleto"){ $Resposta = ""; for ($i = 0; $i <= strlen($cgccpf); $i++) { if (is_numeric(substr($cgccpf, $i, 1))){ $cpfCorrigido .= substr($cgccpf, $i, 1); } } $hoje = date("d/m/Y"); $total='R$ ' . number_format($valortotal, 2,',', '.'); $total = str_replace(" ", "", $total); $vencimento = "86400" * $BradescoDiasdeVencimento + mktime(0,0,0,date('m'),date('d'),date('Y')); $vencimento = date ("d/m/Y", $vencimento); if ($boleto_emitido == "0" || $boleto_emitido == "") { $Resposta .= chr(13) . chr(10); $Resposta .= "<BEGIN_BOLETO_DESCRIPTION><CEDENTE>=(" . $BradescoRazaoSocial . ")" . chr(13) . chr(10); $Resposta .= "<BANCO>=(237)" . chr(13) . chr(10); $Resposta .= "<NUMEROAGENCIA>=(" . $BradescoAgencia . ")" . chr(13) . chr(10); $Resposta .= "<NUMEROCONTA>=(" . $BradescoCodigoCedente . ")" . chr(13) . chr(10); $Resposta .= "<ASSINATURA>=(" . $BradescoAssinaturaBoleto . ")" . chr(13) . chr(10); $Resposta .= "<DATAEMISSAO>=(" . $hoje . ")" . chr(13) . chr(10); $Resposta .= "<DATAPROCESSAMENTO>=(" . $hoje . ")" . chr(13) . chr(10); $Resposta .= "<DATAVENCIMENTO>=(" . $vencimento . ")" . chr(13) . chr(10); $sacado = str_replace(")", "", $sacado); $sacado = str_replace("(", "", $sacado); $Resposta .= "<NOMESACADO>=(" . $sacado . ")" . chr(13) . chr(10); $rua = str_replace(")", "", $rua); $rua = str_replace("(", "", $rua); $complemento = str_replace($complemento,")",""); $complemento = str_replace($complemento,"(",""); $Resposta .= "<ENDERECOSACADO>=(" . $rua . ", " . $complemento . ")" . chr(13) . chr(10); $cidade = str_replace(")", "", $cidade); $cidade = str_replace("(", "", $cidade); $Resposta .= "<CIDADESACADO>=(" . $cidade . ")" . chr(13) . chr(10); $Resposta .= "<UFSACADO>=(" . $estado . ")" . chr(13) . chr(10); $Resposta .= "<CEPSACADO>=(" . $cep . ")" . chr(13) . chr(10); $Resposta .= "<CPFSACADO>=(" . $cpfCorrigido . ")" . chr(13) . chr(10); $Resposta .= "<NUMEROPEDIDO>=(" . $codigo_pedido . ")" . chr(13) . chr(10); $Resposta .= "<VALORDOCUMENTOFORMATADO>=(" . $total . ")" . chr(13) . chr(10); $Resposta .= "<SHOPPINGID>=(0)<END_BOLETO_DESCRIPTION>" . chr(13) . chr(10); } elseif ($boleto_emitido == "1") { $Resposta .= chr(13) . chr(10); $Resposta .= "<BEGIN_BOLETO_DESCRIPTION><CEDENTE>=(" . $BradescoRazaoSocial . ")" . chr(13) . chr(10); $Resposta .= "<BANCO>=(237)" . chr(13) . chr(10); $Resposta .= "<NUMEROAGENCIA>=(" . $BradescoAgencia . ")" . chr(13) . chr(10); $Resposta .= "<NUMEROCONTA>=(" . $BradescoCodigoCedente . ")" . chr(13) . chr(10); $Resposta .= "<ASSINATURA>=(" . $BradescoAssinaturaBoleto . ")" . chr(13) . chr(10); $Resposta .= "<DATAEMISSAO>=(" . $hoje . ")" . chr(13) . chr(10); $Resposta .= "<DATAPROCESSAMENTO>=(" . $hoje . ")" . chr(13) . chr(10); $Resposta .= "<DATAVENCIMENTO>=(" . $vencimento . ")" . chr(13) . chr(10); $sacado = str_replace(")", "", $sacado); $sacado = str_replace("(", "", $sacado); $Resposta .= "<NOMESACADO>=(" . $sacado . ")" . chr(13) . chr(10); $rua = str_replace(")", "", $rua); $rua = str_replace("(", "", $rua); $complemento = str_replace(")", "", $complemento); $complemento = str_replace("(", "", $complemento); $Resposta .= "<ENDERECOSACADO>=(" . $rua . ", " . $complemento . ")" . chr(13) . chr(10); $cidade = str_replace(")", "", $cidade); $cidade = str_replace("(", "", $cidade); $Resposta .= "<CIDADESACADO>=(" . $cidade . ")" . chr(13) . chr(10); $Resposta .= "<UFSACADO>=(" . $estado . ")" . chr(13) . chr(10); $Resposta .= "<CEPSACADO>=(" . $cep . ")" . chr(13) . chr(10); $Resposta .= "<CPFSACADO>=(" . $cpfbom . ")" . chr(13) . chr(10); $Resposta .= "<NUMEROPEDIDO>=(" . $codigo_pedido . ")" . chr(13) . chr(10); $Resposta .= "<VALORDOCUMENTOFORMATADO>=(" . $total . ")" . chr(13) . chr(10); $Resposta .= "<SHOPPINGID>=(0)<END_BOLETO_DESCRIPTION>" . chr(13) . chr(10); }// veja que no bloco acima é colocado um Enter (13) e (10) para cada item echo $Resposta; // envia os dados para o bradesco. } else { echo "<ERRO>"; }} elseif ($tipo_tran == "putAuthBoleto") { // no segundo acesso, ou seja após o ultimo echo $resposta, é acionado novamente esse arquivo agora com o transId=putAuthBoleto// aqui você pode atualizar a sua base de dados informado que o boleto foi gerado corretamente.// o <PUT_AUTH_OK> no final confirma ao bradesco a compra e portanto ele considera o boleto como válido. $dataVcto = "86400" * $BradescoDiasdeVencimento + mktime(0,0,0,date('m'),date('d'),date('Y')); $dataVcto = date ("Y-m-d", $dataVcto); $sql="update pedidos set formaPgto='BOLETO', boleto=boleto+1, dataVcto='$dataVcto' where pedido_id=$codigo_pedido"; $conn->query($sql); ?> <PUT_AUTH_OK><?} else {?> <ERRO><?// não sei o porque talvez ele mostre os valores de retorno de erros, porém no meu caso não mostrou nada.foreach ($HTTP_POST_VARS AS $k => $v) { echo "$k=$v&"; }}?>Como a geração do boleto pode falhar por alguma razão, o bradesco chama o script informado na URL falha que deve tratar do retorno e informar ao usuario oferecendo inclusive a possibilidade de retornar ao carrinho e trocar a forma de pagamento.
abaixo o script falhaBradesco.php que é informado no painel da scopus:
<link href="css/style.css" type="text/css" rel="stylesheet"><body onload="resizeTo(400,277)"><?ao carregar pagina ela se ajusta por tava no tamanho para o boletoinclude '../global.php';/* **************************************************************** Erro no processamento da transacao **************/$msgErr="Erro na transação de pagamento<br>junto ao Bradesco do pedido {$_SESSION['pedido_id']}!";$ErrorDesc=urldecode($ErrorDesc);/* **************************************************************** Erro no processamento da transacao *************o bradesco retorna pelo GET o numOrder que é o numero do pedido além de outras variaveisque não fizeram parte do processo. As variaveis são as mencionadas no config do scopus. */ $msgErr="Erro na transação de pagamento<br>junto ao Bradesco do pedido {$numOrder}!"; $ErrorDesc=urldecode($ErrorDesc); session_start(); // iniciar sessions $_SESSION['pedido_id']=$numOrder; // recupera o pedido na session// monta a mensagem para o usuario. echo" <div id=titulo style='background:#8693BC'> Compra não autorizada!</div><br> <div align=center> <table border=0 style='margin-top:0px; border:2px dashed #9e3d00' cellspacing=8 cellpadding=8 bgcolor=#9e3d00> <tr> <td align=center><b style='color:#fff'>{$msgErr}</font></b></td></tr> <tr bgcolor=#ffffff> <td align=center height=30 style='padding:10px'> Código de Retorno:<b>{$cod}<br>{$ErrorDesc}</b><br> Retorne ao Meu Carrinho e selecione outra opção de pagamento.</td> <tr bgcolor=#ffffff> <td align=center style='padding:10px'> <a href='java script:retorna()'><b class=link><u>clique aqui</u></b></a> para selecionar outra forma de pagamento.</td></tr> </table> </div>"; //echo "pedido_id={$_SESSION['pedido_id']}";// monta o link para voltar ao carrinho na pagina principal.// $urlLoja é configurado no global.php?><script> function retorna() { self.close(); opener.location.href="<?=$urlLoja?>/index.php?todo=car"; }</script>Bom é isso aqui ta funcionando beleza.Agora como o link do deve ir junto ao email de confirmação do usuario, ele pode não imprimir o boleto na hora da compra, no script que monta o email:
if ($formaPgto=='BOLETO') {$ePedido .="<a href=\"$urlLoja/boleto.php?id={$_SESSION['pedido_id']}\"><font color=#003399><b>Clique Aqui</b></font></a> para imprimir o boleto bancário<br>que poderá ser pago em qualquer banco ou pela internet usando o código de barras!<br><br>";}A var $ePedido é utilizada para montar o html do email. Note que ela chama no site o script boleto.php passando o numero de pedido como parametro.
script: boleto.php
<? $boleto_id=$_GET['id']; // recupera o numero do pedido que vem pelo http$url="[http://mupteste.comercioeletronico.com.br/sepsBoletoRet/xxxx/prepara_pagto.asp?Merchantid=xxxx&orderid=zzzzz&";](http://mupteste.comercioeletronico.com.br/sepsBoletoRet/xxxx/prepara_pagto.asp?Merchantid=xxxx&orderid=zzzzz&) // url a ser passada para o MUP do bradesco// onde xxxx é codigo de teste para a loja, fornecido pela scopus e zzzzz é o numero de pedido.include 'index.php'; // inclui a pagina principal da loja (home)// no final da pagina o javascript já abre a tela do boleto e chama o MUP para geração do mesmo.// o Bradesco nao faz questão de reimpressão dos boletos o detalhe é que ele grava todos os dados na primeira chamada e portanto caso seja a segunda chamada o unico campo que poderá ser diferente é o de vencimento, os demais devem ser iguais ao da primeira postagem.?><script language="Javascript"> winBol=window.open('<?=$url?>','vpos','toolbar=no,menubar=no,resizable=yes,status=no,scrollbars=yes,top=0, left=0, width=700,height=485'); winBol.focus();</script>UFA:É isso aí, espero que ajude alguem.
Nota: Eu também tenho boleto do bradesco funcionando porém o cliente fez convenio então eu preciso usar o sistema do bradesco para a geração, e além do mais, a loja tambem fará convenio para financiamento e ai o módulo já está todo pronto.
Obs.: O script dados Bradesco.php eu peguei da locaweb e fiz somente as mudanças necessárias para que o mesmo funcionasse.
Veja que o mesmo poderá ser melhorado, retirando as concatenações que a meu ver so confundem.
Por exemplo:
Linha original: $Resposta .= "<BANCO>=(237)" . chr(13) . chr(10);
poderiamos criar no inicio uma variavel $lf=chr(13) . chr(10);
e fazer: $Resposta .= "<BANCO>=(237)$lf";Carregando comentários...