Como integrar o CodeIgniter com a Cielo

Olá.

Hoje vamos aprender a como integrar o CodeIgniter com o portal de pagamentos Cielo.

Você vai aprender a criar uma integração no seu site ou loja virtual, onde será possível aceitar pagamentos via Cartão de Crédito.

Apesar desta aplicação ser criada dentro do Codeigniter, utilizando suas funções, grande parte do que vai ser mostrado aqui pode ser facilmente adaptado a um código sem o framework, pois não serão utilizadas tantas funções assim do CodeIgniter.

Antes de começarmos a falar da programação do sistema, é importante entendermos vários conceitos de funcionamento da Cielo e de como que uma compra via cartão de crédito é processada.

Há algum tempo a Cielo fornecia integração somente via Windows, sendo que era necessário ter um servidor que rodasse Windows somente para processar os pagamentos.

Se você tivesse uma hospedagem linux e quisesse implementar pagamento via cartão de crédito, teria que contratar uma hospedagem com windows somente para colocar lá dentro os arquivos que a Cielo exigia.

Felizmente isso não existe mais há alguns anos, e hoje toda a comunicação com a Cielo é feita através de XML pelo seu webservice.

Isso permite que você integre qualquer tipo de sistema independente de sistema operacional e linguagem de programação, pois isso é transparente para a Cielo.

Com tanto que você envie somente XMLs para a Cielo, então está valendo. 🙂

A Cielo também possui uma sandbox muito eficiente que raramente está fora do ar. Na verdade, nunca tive problemas com isto desde que comecei a trabalhar com a Cielo.

Certo, agora que você já sabe que toda a comunicação será feita através de webservices e XML, vamos entender como que funciona o processo de pagamento.

As informações que vou colocar aqui estão bem resumidas mas mostram a essência de como tudo deve funcionar.

Ao fazer um contrato com a Cielo, você recebe um manual técnico onde tudo é explicado bem detalhadamente.

Eu estou me baseando neste manual.

A Cielo fornece duas modalidades de integração do seu site ao webservice dela.

  1. Buy Page Cielo
    O pagamento é feito em ambiente Cielo, ou seja, quando o usuário clica no botão Pagar, ele é redirecionado para o site da Cielo onde digitará os dados do seu cartão de crédito.
    As vantagens são: não precisa comprar certificado SSL (https); integração mais simples e rápida; usuário pode ficar mais confiante para digitar os dados do cartão de crédito, já que está dentro do ambiente da cielo.
     – Desvantagem: não é possível fazer cobrança recorrente, ou seja, não é possível a cobrança automática todo mês, que é ideal em casos de venda de serviços de assinatura.
  2. Buy Page Loja
    O pagamento é feito no próprio site. Esta modalidade é mais custosa, pois você terá que contratar 2 serviços além da sua hospedagem: Certificado SSL, que é pago anualmente e IP Fixo, que é pago mensalmente ao seu provedor, pois para a instalação de um certificado SSL, é necessário IP fixo. Requer também um tempo relativamente maior para implementação, pois todas as páginas relacionadas ao pagamento via Cartão de Crédito deverão ser criadas pelo desenvolvedor. A principal vantagem ao meu ver é que você pode fazer cobrança recorrente, ou seja, uma vez que o usuário tenha feito alguma compra no seu site, você poderá cobrá-lo automaticamente todos os meses, sem que ele precise digitar novamente os dados do cartão de crédito. Isto não significa que você ficará com os dados do cartão armazenados no seu site, já que isso não é recomendável, mas ao fazer uma primeira compra, você recebe um TOKEN da Cielo, e através deste TOKEN que você faz as cobranças futuras.

Neste post eu vou tratar da modalidade Buy Page Cielo, porém, os conceitos de comunicação com a Cielo permanecem os mesmos.

Entendida esta parte de modalidades, vamos agora entender como que é o fluxo de pagamento.

Para todo pedido de compra, a meta é efetivá-la em uma venda. E numa venda com cartão, isso pode ser traduzido em uma transação autorizada e capturada.

De acordo com a frase acima, nosso objetivo é autorizar uma transação e em seguida capturá-la.

Uma transação autorizada somente gera crédito para o lojista se ela for capturada, ou confirmada.

Ao criar uma transação, você pode configurar para que ela seja capturada automaticamente após ser autorizada, ou então, pode fazer a captura manualmente em uma área administrativa dentro do site da Cielo.

No exemplo deste post, as transações estão configuradas para serem capturadas automaticamente logo após terem sido autorizadas.

Em toda comunicação com o webservice da Cielo, é preciso enviar junto no XML o número de credenciamento da Loja, e a Chave de Acesso da Loja.

Para testes na sandbox da Cielo, é utilizado um número padrão de loja e uma chave pré-definida. Ambos são fornecidos pela Cielo no manual técnico. No final deste post você terá acesso a estas informações.

Após a homologação, a Cielo devolve uma chave gerada exclusivamente para a sua loja, e é esta a chave que deverá ser usada em ambiente de produção, para que suas vendas sejam realmente registradas.

Transação

O objetivo de toda a comunicação é a criação da Transação, este é o elemento Central do Cielo E-commerce. A transação é criada a partir de uma requisição HTTP enviada ao Webservice da Cielo, através de XML.

Quando uma transação é criada com sucesso, a Cielo retorna o TID – Transaction ID.

A identificação única de uma transação na Cielo é feita através do campo TID,  que está presente no retorno das mensagens de autorização.

Esse campo é essencial para realizar consultas, capturas e cancelamentos. Guarde esse campo no bolso, porque daqui a pouco vamos utilizá-lo.

A partir da criação de uma transação, ela pode assumir os seguintes status:

status_cielo

No nosso exemplo, o objetivo é criar uma autorização que retorne o status 6, que indica uma transação capturada, pois se o status retornar código 6, já indica que ela foi autorizada, por isso não precisamos analisar os status anteriores. Salvo nos casos que você deseje mostrar ao usuário qual o status atual da transação.

O fluxo que vamos utilizar no sistema deste post é:

  • Criação da Transação junto à Cielo -> Envio de um XML do tipo requisição-transação
    • Retorno do TID pelo Webservice da Cielo – XML retornado do tipo: transacao, onde haverá um nó no XML chamado TID, que é o que nos interessa.
      • Consulta o Status da Transação junto à Cielo, fazendo uma nova Consulta, agora passando o TID como parâmetro. Envio de um XML do tipo requisicao-consulta
        • Retorno do Status da Transação pelo Webservice da Cielo. Se for igual a 6, então, indica transação autorizada e capturada.

Status igual a 6, indica pagamento efetuado e você pode enviar o produto ao seu cliente, ou então, liberar o download de algum produto digital, por exemplo.

É muito importante você dizer ao usuário o que irá aparecer na fatura do Cartão de Crédito, pois caso apareça algum texto que o usuário não reconheça, ele poderá entrar em contato com a Cielo e informar que não reconhece a compra.

Isto vai abrir um processo interno dentro da Cielo que irá analisar se o pedido é procedente. Caso seja, então o valor é estornado ao usuário.

Isto chama-se chargeback e pode levar uma empresa à falência, caso trabalhe com produtos físicos, pois o cliente, compra, o produto é enviado, e depois diz que não reconhece a compra, porém, não devolve o produto.

No caso de prestação de serviço on-line, como assinaturas, basta cancelar a assinatura temporariamente até a Cielo confirmar o pagamento.

Claro que também existem fraudes aqui, mas sempre seja o mais transparente possível ao seu cliente, mencionando inclusive, garantias de troca e devolução.

Bom, acredito que até este ponto você já tenha entendido o básico sobre o que deve ser feito em um sistema para que seja possível o pagamento via cartão de crédito.

Vamos passar agora para a parte prática.

Para facilitar nossa vida, eu vou utilizar um outro post que fiz aqui no site, onde eu ensino a fazer um Carrinho de Compras, utilizando a biblioteca Cart do CodeIgniter.

O que eu vou fazer agora, é aproveitar o sistema do Carrinho de Compras e acrescentar um botão Fechar Pedido, que quando clicado, irá chamar uma tela para o usuário escolher a bandeira do cartão de crédito, e ao clicar em Pagar, será redirecionado par ao site da Cielo, onde irá digitar os dados do cartão de crédito.

Para testes, iremos utilizar números de cartão de crédito fictícios fornecidos pela própria Cielo, e que funcionam somente neste ambiente de testes.

Não adianta querer comprar alguma coisa com estes cartões porque não vai dar certo. 🙂

Se você não viu o post sobre a implementação do Carrinho de Compras com a biblioteca Cart do CodeIgniter, sugiro vê-lo antes de continuar este post. Clique aqui para acessar o post.

Criando a transação junto à Cielo

O fluxo dentro do nosso sistema é assim:

Quando o usuário estiver no carrinho de compras e clicar no link Fechar Compra, será dado um post para a função pre_checkout() dentro do controller carrinho.php.

Esta função recebe apenas a descrição do produto em seguida chama a view v_forma_pagamento que é a página que será mostrada ao usuário pedindo para ele escolher a bandeira do cartão de crédito.

A descrição do produto é também passada para esta view e recuperada dentro do formulário através de um campo hidden, que será postado para a função checkout().

Após o usuário escolher a bandeira, ele clicará no botão Pagar Agora e um post será enviado para a função checkout() dentro do controller carrinho.

Esta função recebe via post a descrição do produto e a bandeira escolhida dentro do Select.

A função checkout() é que faz todo o serviço pesado. Ela que recebe os dados para montar o XML que será enviado à Cielo.

O XML será enviado à Cielo utilizando a funçao CURL do PHP.

Então, para facilitar nossa vida, eu criei uma função chamada enviar_requisicao() dentro do helper funcoes_helper.php, que já existia no projeto anterior.

Esta função recebe o XML como parâmetro e envia para o webservice da Cielo.

Dentro desta função também estão configurados os endereços do webservice, que neste caso é o endereço de desenvolvimento, ou seja, da sandbox.

O XML deve ser enviado via CURL através de uma variável chamada mensagem que acredito ser a variável que recebe as informações dentro do webservice.

Por isso que ao chamar a função enviar_requisicao() você deverá escrever assim:

enviar_requisicao("mensagem=".$xml);

Se a requisição retornar sucesso, então nós utilizamos a função do PHP simplexml_load_string que prepara o XML recebido em um formato parecido com Array.

Mas para que possamos acessar os nós, devemos fazer um typecast para array, escrevendo assim:

$retorno = (array)simplexml_load_string(enviar_requisicao("mensagem=".$xml));

Fazendo isso, teremos na variável $retorno todos os nós que desejarmos.

Explicada esta função, vamos entender agora como que geramos o XML que será enviado à Cielo.

O código que foi acrescentado não é muito grande. O que precisamos fazer na verdade, é simplesmente preparar um XML no formato que a Cielo exige, e enviar par ao seu webservice.

Lembre-se que qualquer erro no XML, a Cielo vai reclamar e não vai criar o TID. O valor incorreto em um nó, por exemplo, já é suficiente para causar o erro.

Se você seguir o que digo neste post, acredito que não terá problemas.

O primeiro XML que devemos enviar, que é enviado quando o usuário clica no botão Pagar após escolher a bandeira do cartão de crédito, é um XML do tipo requisicao-transacao.

Abaixo veja os como é este XML:

<?xml version='1.0' encoding='ISO-8859-1'?>
			<requisicao-transacao id='10dc4f6fa0922ecab77f0245b985600b' versao='1.2.1'  xmlns='http://ecommerce.cbmp.com.br'>
				<dados-ec>
					<numero>1001734898</numero>
					<chave>e84827130b9837473681c2787007da5914d6359947015a5cdb2b8843db0fa832</chave>
				</dados-ec>
				<dados-pedido>
					<numero>73</numero>
					<valor>6900</valor>
					<moeda>986</moeda>
					<data-hora>2014-11-22T00:11:14</data-hora>
					<descricao>Vários produtos comprados na loja-virtual</descricao>
					<idioma>PT</idioma>
				</dados-pedido>
				<forma-pagamento>
					<bandeira>visa</bandeira>
					<produto>1</produto>
					<parcelas>1</parcelas>
				</forma-pagamento>
				<url-retorno>http://localhost/cielo/index.php/carrinho/status/73</url-retorno>
				<autorizar>3</autorizar>
				<capturar>1</capturar>
			</requisicao-transacao>

Explicando alguns campos.

Entre os nós <dados-ec> e </dados-ec> que são o número de credenciamento da sua loja junto à Cielo e a chave de autorização.

Como falei anteriormente, aqui estamos usando as duas informações que a própria Cielo fornece para a modalidade Buy Page Cielo.

Dentro do nó <dados-pedido> são colocadas as informações sobre o que está sendo comprado.

Você deve colocar o número do seu pedido. Este número deve ser único e posteriormente será utilizado para identificar a compra feito pelo cliente.

Dentro deste nós também existe o valor do pedido, que deve ser enviado sem pontos ou vírgulas. Se o produto custa 100,00 reais, então deve ser enviado será 10000.

A moeda é um campo que pode ser deixado no valor 968, que indica o Real.

A data hora deve seguir o formato ANO-MES-DIATHORA-MINUTO-SEGUNDO, como é mostrado.

Descrição é onde você descreve o produto. Porém aqui vale uma ressalva. Se o usuário está comprando apenas um produto, você pode colocar o nome deste produto aqui, porém, se no carrinho de compras houver vários produtos, você não vai poder informar todos, então, você terá que ser criativo para informar algo ali que indique uma compra no seu site.

O campo idioma também recebe por padrão o valor PT.

No nó <forma-pagamento> você informa os dados de pagamento.

O nó bandeira recebe a bandeira do cartão de crédito escolhida, que neste caso pode ser: visa, mastercard, diners, discover, elo, amex, jcb e aura.

No nó <produto> você indica que tipo de produto você contratou com a Cielo, ou seja, é o que consta no seu contrato com a Cielo. Os códigos possíveis são: 1 – Crédito à Vista, 2 – Parcelado loja, 3 – Parcelado administradora,  A – Débito.

O nó <parcelas> é referente ao número de parcelas que o comprador deseja pagar sua compras. Para compras à vista o valor padrão é 1.

<url-retorno>

Este é um nó muito importante. Aqui você deve informar qual a URL que a Cielo irá chamar APÓS o usuário digitar os dados do cartão de crédito.

Geralmente é uma página onde é mostrado ao usuário o status da transação, para ele saber se a compra foi feita com sucesso ou se houve algum erro.

Note que para que nós saibamos o status de uma transação, devemos fazer uma nova consulta à Cielo passando o TID da transação.

Porém, este TID só é gerado quando o primeiro XML é enviado, então, não tem como nós criarmos uma url-retorno deste jeito por exmeplo: http://www.sualoja.com.br/retorno/numero_do_tid, por que nós ainda não temos este TID.

O TID só é gerado pela Cielo quando o XML de requisicao-transacao é enviado é devolvido pela Cielo.

Então devemos pensar em uma maneira de recuperar o TID da transação para que possamos consultar seus status logo após a Cielo chamar a URL de retorno.

Para resolver este problema eu fiz assim.

Criei uma tabela chamada transacoes, e nesta tabela eu vinculo o ID da minha transação, que é interno, ao TID gerado.

E eu gravo estas informações na tabela imediatamente após eu enviar o XML de requisicao-transacao e receber o retorno da Cielo.

Abaixo veja o código SQL da tabela:

CREATE TABLE IF NOT EXISTS `transacoes` (
  `id` tinyint(4) NOT NULL AUTO_INCREMENT,
  `id_transacao` tinyint(4) NOT NULL,
  `tid` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `bandeira` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
  `data_hora` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=9 ;

Como devemos informar a url-retorno no XML requisicao-transacao, então neste campo eu informo o endereço da minha página de status, passando junto o ID da minha transação. Ficando assim:

<url-retorno>base_url(“index.php/carrinho/status/$id_transacao”)</url-retorno>

Então, repare que quando a Cielo chamar esta URL, ela irá passar junto o ID da minha transação, e como eu já gravei na tabela transacoes o ID da transação vinculado ao TID, basta que nesta página de consulta status eu faça uma consulta na tabela transacoes passando o ID da transação como parâmetro, para ter o TID em mãos.

Tendo o TID da transação, agora basta eu fazer uma nova consulta à Cielo, mas passando o TID como parâmetro, para sabermos o status da transação.

O nó <autorizar> pode ter os valores:

  • 0 – Não autorizar (somente autenticar).
  • 1 – Autorizar somente se autenticada.
  • 2 – Autorizar autenticada e não autenticada.
  • 3 – Autorizar sem passar por autenticação (somente para crédito) – também conhecida como “Autorização Direta”. Obs.: Para Diners, Discover, Elo, Amex, Aura e JCB o valor será sempre “3”, pois estas bandeiras não possuem programa de autenticação.
  • 4 – Transação Recorrente.

Se você desejar dar mais segurança às transações, utilize a opção 1.

Neste modo, quando o usuário digitar os dados do cartão de crédito, a Cielo irá redirecioná-lo para o site do banco emissor do cartão, para que mais dados sejam confirmados, garantindo assim que o portador do cartão é realmente que está digitando no site.

Porém, esta funcionalidade só existe para as bandeiras Visa e Mastercard, e também dependem do banco emissor ter configurado esta autenticação na hora da compra.

Caso o banco não tenha configurado, a Cielo simplesmente recebe do banco uma confirmação de autenticidade, mas sem realmente haver a autenticação.

Em um site onde eu implementei pagamento via cartão de crédito, eu tive que colocar um código PHP que verificava qual bandeira o usuário estava escolhendo, para então mudar este valor dinamicamente no XML.

Era algo como: se o cartão for igual a visa ou mastecard, então o código é 1, caso contrário, o código é 3.

Porém, caso o usuário pague com cartões que não sejam Visa ou Mastercard, você deverá mudar isso para a opção 3 antes de enviar o pedido à Cielo.

Particularmente eu não veja muita utilidade nisso. A menos que você exija que o seu usuário pague somente com Visa ou Mastercard, não adianta habilitar a opção de número 3.

A opção 4, transação recorrente é aquela onde você cobra o usuário automaticamente todo mês, sem que ele precise digitar novamente os dados do cartão de crédito.

É muito usado para serviços de assinatura mensal. Porém, isso só funciona na modalidade Buy Page Loja, que não é a que estamos usando neste exemplo.

O último nó <capturar> indica se a transação será capturada assim que for autorizada. Eu acredito que este campo sempre deva ficar com o código 1, caso contrário, você deverá fazer a captura manualmente dentro do site da Cielo.

E se você não fizer a captura, indica que uma compra não foi feita, e você não receberá o dinheiro 30 dias depois.

Veja abaixo o código da função checkout() dentro do controller carrinho.php:

/**
		 * Função que é chamada quando o usuário escolhe a bandeira do cartão de crédito para pagamento.
		 */
		public function checkout(){
		
			$this->load->helper("funcoes");
			
			$id_transacao = rand(1,100);//Aqui apenas é criando um número randomico entre 1 e 100 para gerar o ID para fins didáticos.
			$valor_total = $this->cart->total(); 
			$dataHora = date("Y-m-d").'T'.date("H:i:s");
			$bandeira_cartao = $this->input->post("bandeira");
			$descricao_produto = $this->input->post("descricao_produto");
			$url_retorno = base_url("index.php/carrinho/status/$id_transacao");
			
			$captura_automatica = 1; //1 = Sim, 0 = Nâo.
			$metodo_autorizacao = 3;//Dúvidas, veja abaixo:
			/**
			 * 0 - Não autorizar (somente autenticar),
			 * 1 - Autorizar somente se autenticada,
			 * 2 - Autorizar autenticada e não autenticada,
			 * 3 - Autorizar sem passar por autenticação (mais utilizada)"
			 */
				
			
			$xml = "<?xml version='1.0' encoding='ISO-8859-1'?>
			<requisicao-transacao id='" . md5(date("YmdHisu")) . "' versao='1.2.1'  xmlns='http://ecommerce.cbmp.com.br'>
				<dados-ec>
					<numero>$this->numero_credenciamento</numero>
					<chave>$this->chave</chave>
				</dados-ec>
				<dados-pedido>
					<numero>$id_transacao</numero>
					<valor>$valor_total</valor>
					<moeda>986</moeda>
					<data-hora>$dataHora</data-hora>
					<descricao>$descricao_produto</descricao>
					<idioma>PT</idioma>
				</dados-pedido>
				<forma-pagamento>
					<bandeira>$bandeira_cartao</bandeira>
					<produto>1</produto>
					<parcelas>1</parcelas>
				</forma-pagamento>
				<url-retorno>$url_retorno</url-retorno>
				<autorizar>$metodo_autorizacao</autorizar>
				<capturar>$captura_automatica</capturar>
			</requisicao-transacao>";
			
			$retorno = (array)simplexml_load_string(enviar_requisicao("mensagem=".$xml));
			
			//Se existir o índice tid na array, então recupero-o, caso contrário, não o trago.
			//Se não existir o tid, provavelmente houve um erro, então, trato o erro no ELSE.
			$tid = isset($retorno['tid']) ? $retorno['tid'] : null ;
			
			if ($tid) {
				/**
				 * Se um TID for retornado, então indica que a CIELO aceitou a criação de uma transação.
				 * Então, eu gravo em uma tabela local o ID da minha transação e o TID, para que os dois números sejam vinculados.
				 * Isto serve para que quando a CIELO chamar a URL de retorno que eu passo dentro do XML junto com o ID da transação,
				 * eu possa descobrir qual TID vinculado ao id da transação.
				 * Mas esta consulta será feita na função sucesso() 
				 * Se o tid foi gerado com sucesso, então, redireciono o usuário para o url-retorno que é devolvido pela cielo.
				 */
				$this->load->model("m_transacoes");
				$dados = array(
				
					"id_transacao" => $id_transacao,
					"tid" => $tid,
					"bandeira" => $bandeira_cartao
					
				);
				$this->m_transacoes->grava_transacao($dados);
				
				redirect($retorno['url-autenticacao']);			
			} else {
			echo "Erro.<br />Código: " . $retorno['codigo'] . '<br />Mensagem: ' . $retorno['mensagem'];			
				
			}
		}

Este código é bem fácil de entender. No começo dele eu configuro as variáveis que vão preencher o XML.

Em seguida, eu envio este XML para a Cielo, através da função enviar_requisicao() que está dentro do helper funcoes e este retorno eu atribuo à variável $retorno.

Então, eu verifico se existe o nó TID dentro da variável e caso exista, eu então gravo o ID da transação e o TID dentro da tabela transações, para posterior recuperação.

Aqui também tem uma etapa importantíssima.

Quando o TID é criado com sucesso dentro do XML de retorno da Cielo, ela retorna o nó <url-autenticacao>, que é para onde você deve redirecionar o usuário, pois é esta URL que chama a página da Cielo onde o usuário irá digitar os dados do cartão de crédito.

Note que eu faço isso logo após salvar os dados na tabela transações, através do comando redirect() do CodeIgniter.

Caso não exista o nó TID no retorno do XML, então indica que houve algum erro. Então, eu mostro esse erro ao usuário.

Eu mostro duas informações de erro ao usuário: o código e a mensagem.

Consultando o Status

Após tudo isso ter sido feito e o usuário digitado os dados do cartão de crédito e clicado no botão Confirmar compra dentro do site da Cielo, ela irá chamar a nossa url-retorno que foi passada no XML anterior.

Esta url será algo parecido com isso: http://www.site.com.br/status/20, onde 20 é o ID da transação.

Então, dentro do controller existe a função status() onde o código segue abaixo:

public function status($id_transacao){
				
		$this->load->helper("funcoes");
		$this->load->model("m_transacoes");
		
		$tid = $this->m_transacoes->recupera_tid($id_transacao);
		
		if (!$tid) {
			die("Erro: transação não encontrada. $id_transacao");
		}
		
		/**
		 * Tendo o TID em mãos, devo fazer uma nova consulta à cielo para saber o status da transação.
		 */
		
		$xml_consulta = "<?xml version='1.0' encoding='ISO-8859-1'?>
		<requisicao-consulta id='" . md5(date("YmdHisu")) . "' versao='1.2.0'  xmlns='http://ecommerce.cbmp.com.br'>
			<tid>$tid</tid>
			<dados-ec>
				<numero>$this->numero_credenciamento</numero>
				<chave>$this->chave</chave>
			</dados-ec>		
		</requisicao-consulta>";
		
		$retorno = (array)simplexml_load_string(enviar_requisicao("mensagem=".$xml_consulta));
		
		/**
		 * Se quiser ver o XML completo de retorno, basta descomentar as linhas abaixo.
		 */
		 // echo "<pre>";
		 // print_r($retorno);
		
		$dados['retorno_cielo'] = $retorno;
		$this->load->view("v_status", $dados);
		
		/**
		 * Seguindo o fluxo de compra, onde o objetivo é CAPTURAR uma transação, então, basta analisar o conteúdo do índice STATUS
		 * que a CIELO retorna. Se este status retornar 6, então, indica transação capturada, que é o nosso objetivo.
		 * A partir de agora, você pode criar um código onde você confirma o pagamento na sua loja virtual por exemplo.
		 *  */
		 //Exemplo
		 
		 if ($retorno['status'] == 6) {
		 	//Pagamento concluído. Coloque aqui os códigos que devem ser executados quanto o pagamento for concluído.
		 }
		 
	}

Aqui também não tem muito segredo. Veja.

No começo da função eu carrego o helper_funcoes o model m_transacoes.

Repare que eu recebo o ID da transação via parâmetro, e se esta informação não existir, eu paro o fluxo.

Caso o ID exista, então eu faço uma busca na tabela transacoes passando como parâmetro este ID para recuperar o TID vinculado.

Você irá notar que dentro da tabela eu também gravo a bandeira, mas isto serve somente para facilitar a identificação.

Ela não é usada na consulta de status.

Tendo o TID em mãos agora, basta eu fazer uma nova consulta à Cielo, passando o TID como parâmetro.

Veja abaixo como o XML é montado:

$xml_consulta = "<?xml version='1.0' encoding='ISO-8859-1'?>
		<requisicao-consulta id='" . md5(date("YmdHisu")) . "' versao='1.2.0'  xmlns='http://ecommerce.cbmp.com.br'>
			<tid>$tid</tid>
			<dados-ec>
				<numero>$this->numero_credenciamento</numero>
				<chave>$this->chave</chave>
			</dados-ec>		
		</requisicao-consulta>";

Repare que sempre que você for se comunicar com a Cielo, você deve enviar junto no XML o seu número de credenciamento e sua chave.

Esta requisição é bem simples, e ela vai retornar alguns nós e outros não, dependendo do tipo de resultado.

Porém, o nó status sempre virá, e como falei no começo do post, o objetivo é que a captura seja feita, e o status de código igual a 6, indica captura efetuada com sucesso.

Então, se você encontrar o código 6 dentro deste nó, você pode informar ao usuário que o pagamento foi feito com sucesso, e liberar o download do produto, por exemplo.

Caso o status seja igual a 5, então eu verifico também qual a mensagem de erro, e mostro isso ao usuário, porém, este código está dentro da view v_status.php.

Veja abaixo o código completo da View:

<html>
	<head>
		<title>Carrinho de Compras do CodeIgniter - Status do Pagamento</title>
		<style>
			* {
				font-family: Arial;
				font-size: 12px;
			}
			h1 {
				font-size: 30px;
			}
			h2 {
				font-size: 18px;
				background-color: #ddd;
				padding: 5px;
			}
			table {
				border: 1px solid;
				padding: 5px;
			}
			table th {
				background-color: #ddd;
			}
			table td {
				padding: 5px;
				background-color: #fff;
				text-align: center;
			}
			table td input {
				text-align: center;
				padding: 3px;
			}
			.sucesso {
				font-size: 20px;
				text-align: center;
				padding: 5px;
				background-color: green;
				color: #fff;
			}
			.msg_erro {
				font-size: 20px;
				text-align: center;
				padding: 5px;
				background-color: red;
				color: #fff;
			}
		</style>		
	</head>
	<body>
		<div id="container" style="width: 900px; margin: 0 auto;">
		
			<h1>Status do seu pagamento</h1>
			<? if ($retorno_cielo['status'] == 6): ?>
			<? $this->load->helper("funcoes"); ?>
			<? $dados_pedido = (array)$retorno_cielo['dados-pedido']; ?>
			<? $dados_pagamento = (array)$retorno_cielo['forma-pagamento']; ?>
				<p class="sucesso">Parabéns! Sua compra foi concluída com êxito!</p>
				<table style="width: 100%;">
					<tr>
						<td style="text-align: right;">Número do Pedido</td>
						<td style="text-align: left;"><?= $dados_pedido['numero'] ?></td>
					</tr>
					<tr>
						<td style="text-align: right;">Valor</td>
						<td style="text-align: left;">R$ <?= formata_preco($dados_pedido['valor']) ?></td>
					</tr>
					<tr>
						<td style="text-align: right;">Produto(s)</td>
						<td style="text-align: left;"><?= $dados_pedido['descricao'] ?></td>
					</tr>
					<tr>
						<td colspan="2" style="background-color: #eee; font-size: 18px;">Forma de Pagamento</td>
					</tr>
					<tr>
						<td style="text-align: right;">Cartão</td>
						<td style="text-align: left;"><?= strtoupper($dados_pagamento['bandeira']) ?></td>
					</tr>
					<tr>
						<td style="text-align: right;">Parcelas</td>
						<td style="text-align: left;"><?= $dados_pagamento['parcelas'] ?></td>
					</tr>
				</table>
			<? endif; ?>
			<? if ($retorno_cielo['status'] == 5): ?>
				<p class="msg_erro">Não foi possível processar seu pagamento.<br /><? 				
						$autorizacao = (array)$retorno_cielo['autorizacao'];;
						echo $autorizacao['mensagem'];					
				 ?></p>
				
			<? endif; ?>

		</div>
	</body>
</html>

Para saber os status que podem ser retornados pela Cielo, consulte a imagem que está no começo do post, onde eu descrevo os Status da Transação.

Algumas observações importantes.

Para que tudo funcione, todos os preços enviados para a Cielo devem terminar em zero.

Ou seja, se sua compra for de R$ 15,00, então você deve enviar o valor 1500. Se você não fizer isto, a Cielo sempre irá retornar transação Negada quando clicar no botão  Confirmar Compra.

Claro que isto é só para este ambiente de testes. Em produção você poderá enviar qualquer valor, inclusive com centavos.

Abaixo estou postando os números de cartão de crédito que a Cielo fornece para os testes.

cc_testes_cielo

Abaixo também segue os número e a chave que deverão ser usados e ambiente de testes:

códigos_cielo

Bom, com as informações que eu passei aqui, acredito que você tenha condições de fazer um sistema de testes completo e entender como que funciona o pagamento via Cartão de Crédito.

Não acho interessante eu postar aqui as mensagens de erro e outras informações de homologação, pois isto só fará sentido se você já tiver feito um credenciamento junto à Cielo, e se você tem este credenciamento, você tem acesso ao Manual Técnico deles, que foi onde eu me baseei para criar tudo aqui.

Este post teve a intenção de mostrar o básico de como você pode fazer para implementar a Cielo no seu site. Existe muito mais coisas a serem consideradas que estão no Manual Técnico da Cielo.

Porém, tudo se baseia em envio de XML à Cielo, por isso, se você entender como que este sistema que fiz funciona, você poderá utilizar outras funções que a Cielo oferece tranquilamente.

Caso eu tenha esquecido de algo, ou você precise de alguma informação, poste nos comentários abaixo para eu ver se consigo ajudar.

Eu não sei se estou infringindo aqui algum direito autoral da Cielo. Eu acredito que não, pois para a Cielo, quanto mais gente souber implementar seu sistema melhor.

Como sempre, abaixo você pode testar este sistema funcionando e também logo em seguida baixar o projeto completo para testar no seu computador.

Neste post eu não cheguei a colocar todos os códigos, pois como você deve ter notado, ele ficou muito grande. Então, talvez seja necessário você baixar o projeto para seu computador e ir analisando o código enquanto lê o post.

Lembre-se que habilitar o short_open_tags do PHP para o sistema funcionar no seu servidor.

Espero que tenha gostado e peço desculpas se o posto ficou muito grande.

Um grande abraço.

Fabio

Atenção! Tive que tirar a opção de testar funcionando porque estava sofrendo muitos ataques estranhos. Talvez o nome CIELO chame a atenção.

– Clique aqui para Testar o projeto funcionando.

Clique aqui para fazer o Download do Projeto Completo.

Fábio S. Reszko

Sou Programador PHP desde 2006 e eu acredito sinceramente que programar usando um Framework PHP é a solução para os problemas de códigos desorganizados, difíceis de entender e de dar manutenção no futuro. Se você também acredita nisto, então fique à vontade em explorar meu blog.