Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

ximnes

Dúvida integração Carrinho de Compras e Checkout Cielo

Recommended Posts

Boa madrugada a todos.
Como postei a pouco tempo, estou desenvolvendo o site do meu selo fonográfico com o framework CodeIgniter.
E nele eu venderei cds físicos e digitais com a classe Cart.
Me inscrevi na cielo essa semana e estou lendo assiduamente o Manual do Desenvolvedor.
Nele não contém algumas dúvidas que não consegui solução.
A parte do carrinho já está funcionando OK, e as informações que vão para Cielo que não sei, pois o formulário que estou enviando não vai para página da cielo.
Eu uso uma função e nela contém o CURL todo.
Segue o código:
	function enviar_requisicao($order){

					
					$curl = curl_init();
					
					curl_setopt($curl, CURLOPT_URL, 'https://cieloecommerce.cielo.com.br/api/public/v1/orders');
					curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
					curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
					curl_setopt($curl, CURLOPT_POST, true);
					curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($order));
					curl_setopt($curl, CURLOPT_HTTPHEADER, array(
						'MerchantId: (substitui para não deixar a mostra)',
						'Content-Type: application/json'
					));
					
					$response = curl_exec($curl);
					
					if($response)
					{
						return $response;
					} else {
						return curl_error($curl);
					}
					curl_close($curl);
					
					$json = json_decode($response);
					
	}
}

Eu tenho duas questões que ficaria agradecido se alguém pudesse me dar uma luz.
Eu ví que no manual, o formulário Post é tratado como Cart_1_opção.
Pensei logo em fazer um Array e adicionar vários inputs com as informações de cada um dos produtos, porém quando fiz isso, não recebi o email de erros, que se recebe sempre que uma solicitação no site da cielo fracassa, por falta de informações no formulário entre outros.
O problema é que tem campos específicos para cada produto, o digital se trata como cart_1_type onde 1 é produto físico, 2 é produto digital, e 3 é serviços.
E é aí que começa os problemas.
Se uma pessoa adiciona um album digital, ou faixa do album digital no carrinho e decide também comprar um outro album físico, como eu teria que mandar essas informações para a Cielo, sendo que o primeiro produto(digital) não teria que calcular o frete nem nada, e no segundo produto(físico) teria que calcular o frete e etc.
Segue o controller que faz o Checkout e não retorna nemhuma ação, apenas a página em branco do meu site:
(Esse é API REST, não sei direito como proceder a esse método e gostaria que alguém pudesse me dar uma luz, se estou fazendo certo ou errado, se a lógica é errada e por ai vai)
				public function checkout(){
			$transaction_id = md5(date("Y-m-d").date("H:i:s"));

			$valor_total = $this->cart->total(); 


					$order = new stdClass();
					$order->OrderNumber = $transaction_id;
					$order->SoftDescriptor = '----';
					$order->Cart = new stdClass();
					$order->Cart->Discount = new stdClass();
					$order->Cart->Discount->Type = 'Percent';
					$order->Cart->Discount->Value = 10;
					$order->Cart->Items = array();
					foreach($this->cart->contents() as $items){
					$order->Cart->Items[0] = new stdClass();
					$order->Cart->Items[0]->Name = $items['name'];
					$order->Cart->Items[0]->Description = 'aaaa';
					$order->Cart->Items[0]->UnitPrice = $items['price'];
					$order->Cart->Items[0]->Quantity = $items['qty'];
					$order->Cart->Items[0]->Type = $items['type'];
					$order->Cart->Items[0]->Sku = $items['rowid'];
					$order->Cart->Items[0]->Weight = $items['weight'];
						if($items['type'] == 1){
					$order->Shipping = new stdClass();
					$order->Shipping->Type = 'Correios';
					$order->Shipping->SourceZipCode = '--------';
					$order->Shipping->TargetZipCode = $this->session->userdata('user_cep');
					$order->Shipping->Address = new stdClass();
					$order->Shipping->Address->Street = $this->session->userdata('user_adress');
					$order->Shipping->Address->Number = $this->session->userdata('user_adress_number');
					$order->Shipping->Address->Complement = $this->session->userdata('user_adress_comp');
					$order->Shipping->Address->District = $this->session->userdata('user_adress_district');
					$order->Shipping->Address->City = $this->session->userdata('user_city');
					$order->Shipping->Address->State = $this->session->userdata('user_State');
						}
						if($items['type'] == 2){
					$order->Shipping = new stdClass();
					$order->Shipping->Type = 'WithoutShipping';
						}
					}
					$order->Payment = new stdClass();
					$order->Payment->BoletoDiscount = 0;
					$order->Payment->DebitDiscount = 10;
					$order->Customer = new stdClass();
					$order->Customer->Identity = $this->session->userdata('user_cpf');
					$order->Customer->FullName = $this->session->userdata('user_name');
					$order->Customer->Email = $this->session->userdata('user_email');
					$order->Options = new stdClass();
					$order->Options->AntifraudEnabled = false;

			
			$response = enviar_requisicao($order);

Eu preciso informar cada item, ou é necessário ser um "pacote" tipo o que era na Buy Page Cielo?

Pois na Buy Page se fosse mais de um produto, o valor teria que ser o valor total e não valor unitário de produtos.

 

No manual do desenvolvedor eles dão exemplo de um formulário que vou postar a seguir, porém parece que é somente para um produto.
Exemplo de consumo via Post
Segue abaixo um exemplo de consumo via post, e como a tela se apresentaria para este caso.
<form action="https://cieloecommerce.cielo.com.br/Transactional/Order/Index" method="post">
<input type="hidden" name="merchant_id" value="C89FDFBB-DBE2-4E77-806A-6D75CD397DAC" />
<input type="hidden" name="order_number" value="0000000001" />
<input type="hidden" name="shipping_type" value="2" />
<input type="hidden" name="Shipping_Zipcode" value="01452002" />
<input type="hidden" name="cart_1_name" value="Camiseta Branca" />
<input type="hidden" name="cart_1_unitprice" value="10000" />
<input type="hidden" name="cart_1_quantity" value="1" />
<input type="hidden" name="cart_1_weight" value="100" />
<input type="hidden" name="cart_1_zipcode" value="20020080" />
<input type="hidden" name="cart_1_type" value="1" />
<input type="hidden" name="shipping_1_name" value="Servico da Loja" />
<input type="hidden" name="shipping_1_price" value="500" />
<input type="hidden" name="shipping_2_name" value="Motoboy" />
<input type="hidden" name="shipping_2_price" value="800" />
<input type="hidden" name="Shipping_Address_Name" value="Av. Brigadeiro Faria Lima" />
<input type="hidden" name="Shipping_Address_Number" value="1461" />
<input type="hidden" name="Shipping_Address_Complement" value="" />
<input type="hidden" name="Shipping_Address_District" value="Jd. Paulista" />
<input type="hidden" name="Shipping_Address_City" value="Sao Paulo" />
<input type="hidden" name="Shipping_Address_State" value="SP" />
<input type="hidden" name="Customer_Name" value="João da Silva" />
<input type="hidden" name="Customer_Email" value="jsilva@braspag.com.br" />
<input type="hidden" name="Customer_Identity" value="26636640650" />
<input type="hidden" name="Customer_Phone" value="1122223333" />
<input type="submit" value="Comprar" /> 
</form>

Nesse método consegui "conexão" com a Cielo, porém meu perfil ainda não estava ativo e recebi um email, com tudo certo e etc.

Porém não consegui mandar mais que um produto no carrinho e ficou tipo a solução Buy Page Cielo.

 

Desde já agradeço e peço desculpas por qualquer equivoco.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Outro modo que testei porém não obtive resultado, nem e-mail da Cielo sobre erros foi o seguinte:

            <form method='post' action='https://cieloecommerce.cielo.com.br/Transactional/Order/Index' target='_blank'>
				<input type='hidden' name='product_description' value='<?php echo $descricao_produto ?>' />
                <br>
                <h3>Deseja finalizar a compra?</h3>
                <p>Voce sera redirecionado para a pagina da Cielo para escolher a forma de pagamento, e finalizar a compra.<br>
                Se o produto for fisico voce tambem calculara o frete junto com a Cielo, escolhendo o metodo de entrega, PAC, Sedex e etc.</p><br>
                <input hidden type="checkbox" name="order_confirm" value="1" checked>
                Valor total R$ <?php echo formata_preco($this->cart->total()); ?><br>

                <?php $i = 1; ?>			
                <?php foreach ($this->cart->contents() as $items): ?>
                <input type="hidden" name="merchant_id" value="d03c99f4-e278-461c-a24e-6b2e5169841a" />
                <input type="hidden" name="order_number"value="<?php echo md5(date("Y-m-d").date("H:i:s")); ?>">
                <input type="hidden" name="cart_<?php echo $i ?>_name" value="<?php echo $items['name'] ?>" />
                <input type="hidden" name="cart_<?php echo $i ?>_unitprice" value="<?php echo $items['price'] ?>" />
                <input type="hidden" name="cart_<?php echo $i ?>_type" value="2" />
                <input type="hidden" name="cart_<?php echo $i ?>_quantity" value="<?php echo $items['qty'] ?>" />
                <input type="hidden" name="shipping_type" value="5" />
                <input type="hidden" name="cart_<?php echo $i ?>_quantity" value="1" />
                <?php if($product_type == 1){ // se for produto físico
?>
                <input type="hidden" name="cart_<?php echo $i ?>_weight" value="<?php echo $product_weight ?>" />
                <input type="hidden" name="shipping_zipcode" value="<?php echo $this->session->userdata('user_cep') ?>" />
                <input type="hidden" name="shipping_adress_name" value="<?php echo $this->session->userdata('user_adress') ?>" />
                <input type="hidden" name="shipping_adress_number" value="<?php echo $this->session->userdata('user_adress_number') ?>" />
                <input type="hidden" name="shipping_adress_comp" value="<?php echo $this->session->userdata('user_adress_comp') ?>" />
                <input type="hidden" name="shipping_adress_district" value="<?php echo $this->session->userdata('user_adress_district') ?>" />
                <input type="hidden" name="shipping_adress_city" value="<?php echo $this->session->userdata('user_city') ?>" />
                <input type="hidden" name="shipping_adress_state" value="<?php echo $this->session->userdata('user_state') ?>" />
                <input type="hidden" name="shipping_type" value="1" />
                <?php } ?>
                <?php if($product_type == 2){ // se for produto digital
?>
                <input type="hidden" name="shipping_type" value="5" />
<?php } ?>
                <input type="hidden" name="customer_name" value="<?php echo $this->session->userdata('user_name'); ?>" />
                <input type="hidden" name="customer_email" value="<?php echo $this->session->userdata('user_email'); ?>" />

				<?php
				
				//$i++; // somar para fazer o cart ser um array para enviar a cielo.
				endforeach; ?>
					<button type='submit'>Finalizar Compra</button>
			</form>	

O problema de fazer sem listar todos os dados do carrinho, é saber quais tipos de produtos (físicos ou digitais), e assim o product_type ficaria vazio.

Estou no dilema de poder vender só o conteudo digital ou físico.

 

Li alguns artigos sobre API Restful, porém queria saber se pra integrar via API na cielo, meu site precisaria ser uma API Restful também.

 

Desde já agradeço

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estou tendo progresso na integração, graças!

Porém agora a página da cielo não está abrindo.

Eu dei um echo no retorno da função enviar_requisicao e a mesma aparece o pedido, ao meu ver tudo OK.

{"orderNumber":"-------","softDescriptor":"-----","cart":{"discount":{"type":"Percent","value":10,"isRequired":false},"items":[{"name":"Album - Faixa: Intro","description":"aaaa","unitPrice":1000,"quantity":1,"type":"Digital","sku":"c4ca4238a0b923820dcc509a6f75849b","weight":0}]},"shipping":{"type":"WithoutShipping"},"payment":{"boletoDiscount":0,"debitDiscount":10},"customer":{"identity":"14587524710","fullName":"Cliente","email":"cliente@email.com"},"options":{"antifraudEnabled":false},"settings":{"checkoutUrl":"https://cieloecommerce.cielo.com.br/TransactionalVNext/Checkout/Index/-----","profile":"CheckoutCielo","version":"2"}}

Solicitei a King Host ainda pouco para adicionarem o Certificado EV para mim, e liberarem o Mod Security específico para o Checkout Cielo.

Porém a página não é redirecionada para a CheckoutUL.

Será por falta desses componentes? Ou é algum erro meu?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Consegui resolver rapaziada.

Eu precisava redirecionar, não é automático.

Pra quem precisar:

$json = json_decode($response);
$checkoutUrl = $json->settings->checkoutUrl;
redirect($checkoutUrl); // redirect do codeigniter

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.