Agora fala uma coisa que o kra de cima não deve saber....
melhor nao ter comentado que dar essa incrível ajuda.
Estou procurando o codigo scopus em php.
Se não vou ter que ler o asp e faze-lo em php, mas certamente encontro na internet.
Encontrei...
Fonte:
http://forum.imaster...hp/t223658.htmlSegue abaixo o conteudo..
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:
QUOTE
<script language="Javascript">
function criaBoleto() {
url="
http://mupteste.comercioeletronico.com.br/sepsBoletoRet/xxxx/prepara_pagto.asp?Merchantid=xxxx&orderid=zzzzz<?=$id?>&";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:
QUOTE
<!--
'-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#
' 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 getBoleto
if (($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 = "7B94A66D138FFD2AEBFBE3D8E0BDBD02700A5B793F017B0C8B40252C3680F9CD05C7EEB1A39
5C84916425DC318F7F07518D416194FB077AA47A8DBD2B35B2E4C376A23385FDD9B0AA3E7D0712B3
73B9EFD11028ADFC763B7EAD4A3E70FC8BE4A3CF4DA804E692A6173F4B81F568D7A9A38F66310614
9A34409B3C48147FBAA12";
$BradescoAssinaturaBoleto = "233542AD8CA027BA56B63C2E5A530029F68AACD5E152234BFA1446836220CAA53BD3EA92B29
6CA94A313E4E438AD64C1E4CF2CBAD6C67DAA00DE7AC2C907A99979A5AB53BFEF1FD6DD3D3A24B27
8536929F7F747907F7F922C6C0F3553F8C6E29D68E1F6E0CA2566C46C63A2DD65AFF7DF4802FBF48
11CA58619B33989B8DDF8";
// $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:
QUOTE
<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 boleto
include '../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 variaveis
que 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:
QUOTE
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
QUOTE
<?
$boleto_id=$_GET['id']; // recupera o numero do pedido que vem pelo http
$url="
http://mupteste.come...rderid=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";