API-3.0-PHP
API-3.0-PHP copied to clipboard
Como autenticar o Débito
Usei o mesmo exemplo de débito, mas o retorno que tenho é:
returnCode -> "014" returnMessage -> "Autorização Direta é permitida apenas para crédito"
Liguei no suporte, me falaram que tem que autenticar. Na 1.5 eu tinha como marcar a requisição pra autenticação, ou pra aprovar se ja tiver autenticado etc. Essa 3.0 PHP é bem zoadinha, como autentica um débito ?
Como se trata de débito, é o cliente quem precisa autenticar. A URL de autenticação é retornada na criação do pagamento; redirecione o cliente para a URL de autenticação que o restante do fluxo acontece dentro da página do banco emissor do cartão.
Então João mas eu não tenho a url de autenticação, hora que tento fazer a requisição me da este erro que reportei acima, e o getAuthenticationUrl() vem null.
@brunogonncalves, como está seu código de criação da transação de débito?
Exatamente igual no exemplo:
```
// Crie uma instância de Sale informando o ID do pagamento
$sale = new Sale('ID');
// Crie uma instância de Customer informando o nome do cliente
$customer = $sale->customer($clientName);
// Crie uma instância de Payment informando o valor do pagamento
$payment = $sale->payment($value);
// Crie uma instância de Credit Card utilizando os dados de teste
// esses dados estão disponíveis no manual de integração
$payment->setReturnUrl('Minha url');
$payment
->debitCard($cvv, $brand)
->setExpirationDate($expirationDate)
->setCardNumber($cardNumber)
->setHolder($clientName);
// Crie o pagamento na Cielo
try {
// Configure o SDK com seu merchant e o ambiente apropriado para criar a venda
$sale = (new CieloEcommerce($this->_merchant, $this->_environment))->createSale($sale);
// Com a venda criada na Cielo, já temos o ID do pagamento, TID e demais
// dados retornados pela Cielo
$payment = $sale->getPayment();
$data = [
'success' => true,
'payment' => $payment,
'id' => $this->_id
];
$data['returnUrl'] = $payment->getAuthenticationUrl();
return $data;
} catch (CieloRequestException $e) {
// Em caso de erros de integração, podemos tratar o erro aqui.
// os códigos de erro estão todos disponíveis no manual de integração.
$cieloError = $e->getCieloError();
return [
'success' => false,
'message' => $cieloError ? $cieloError->getMessage() : $e->getMessage(),
'code' => $cieloError ? $cieloError->getCode() : $e->getCode()
];
}
```
E esta requisição aí me da o erro que informei acima: returnCode -> "014" returnMessage -> "Autorização Direta é permitida apenas para crédito" Outro detalhe, é q em ambiente SANDBOX, eu consigo a url de autenticação normal, me leva pra página de autenticação posso colocar se quero ou não autenticar fica tudo certinho.
Ué, estranho, @brunogonncalves; executei o código aqui e o retorno foi exatamente o esperado:
<?php
// ...
// Crie uma instância de Sale informando o ID do pagamento
$sale = new Sale('123');
// Crie uma instância de Customer informando o nome do cliente,
// documento e seu endereço
$customer = $sale->customer('Fulano de Tal');
// Crie uma instância de Payment informando o valor do pagamento
$payment = $sale->payment(15700);
// Defina a URL de retorno para que o cliente possa voltar para a loja
// após a autenticação do cartão
$payment->setReturnUrl('https://localhost/test');
// Crie uma instância de Debit Card utilizando os dados de teste
// esses dados estão disponíveis no manual de integração
$payment->debitCard("123", "Visa")
->setExpirationDate("12/2018")
->setCardNumber("0000000000000001")
->setHolder("Fulano de Tal");
// Crie o pagamento na Cielo
try {
// Configure o SDK com seu merchant e o ambiente apropriado para criar a venda
$sale = (new CieloEcommerce($merchant, $environment))->createSale($sale);
$payment = $sale->getPayment();
// Com a venda criada na Cielo, já temos o ID do pagamento, TID e demais
// dados retornados pela Cielo
$paymentId = $payment->getPaymentId();
$authenticationUrl = $payment->getAuthenticationUrl();
printf("URL de autenticação: %s\n", $authenticationUrl);
} catch (CieloRequestException $e) {
// Em caso de erros de integração, podemos tratar o erro aqui.
// os códigos de erro estão todos disponíveis no manual de integração.
$error = $e->getCieloError();
}
Poderia ser algum alguma trava na minha Chave ? A cielo tem que liberar alguma coisa pra mim ? É realmente muito estranho isso estar acontecendo pq não faz sentido algum.
@brunogonncalves, no sandbox, você usa as credenciais de testes e a Cielo não precisa liberar nada; só no ambiente de produção que você precisa da liberação.
Verifique se não está utilizando credenciais de produção no sandbox; pode ser isso.
Eu acessei o fonte que faz a requisição e mandei printar os dados do curl, olha que estranho a chave debitCard está enviando os dados do cartão, mas como tipo CreditCard, e mais pra baixo tem a chave type que está corretamente preenchida com "DebitCard". Seria um problema no sdk ? Estou usando exatamente o exemplo man.
Sale {
-merchantOrderId: 55
-customer: Customer {
-name: "SATIRA MARINILZA F ALMEIDA"
-email: null
-birthDate: null
-identity: null
-identityType: null
-address: null
-deliveryAddress: null
}
-payment: Payment {
-serviceTaxAmount: null
-installments: 1
-interest: null
-capture: false
-authenticate: false
-recurrent: null
-recurrentPayment: null
-creditCard: null
-debitCard: CreditCard {
-cardNumber: "----"
-holder: "SATIRA MARINILZA F ALMEIDA"
-expirationDate: "08/2023"
-securityCode: "---"
-saveCard: false
-brand: "Master"
-cardToken: null
}
-authenticationUrl: null
-tid: null
-proofOfSale: null
-authorizationCode: null
-softDescriptor: ""
-returnUrl: "http://teste.sortesim.com.br/retorno-cielo/55"
-provider: null
-paymentId: null
-type: "DebitCard"
-amount: "500"
-receivedDate: null
-capturedAmount: null
-capturedDate: null
-currency: null
-country: null
-returnCode: null
-returnMessage: null
-status: null
-links: null
-extraDataCollection: null
-expirationDate: null
-url: null
-number: null
-barCodeNumber: null
-digitableLine: null
-address: null
}
}
debitCard está enviando os dados do cartão, mas como tipo CreditCard, e mais pra baixo tem a chave type que está corretamente preenchida com "DebitCard". Seria um problema no sdk ?
Não; o tipo é o mesmo, por isso é utilizado uma instância de CreditCard; a diferença é apenas na propriedade, que em vez de definir Payment::$creditCard
, define Payment::$debitCard
, exatamente como está sendo feito.
Não faz sentido algum então me retornar isso: returnCode -> "014" returnMessage -> "Autorização Direta é permitida apenas para crédito."
Estou como no exemplo, poderia retornar qq outro erro, mas realmente faz parecer que está tentando efetuar uma transação com cartão de crédito, o que não é o caso os dados da requisição estão aí em cima.
Cara é alguma falha muito estranha e no SDK, eu desisti de pelejar com o problema e fiz diretamente um curl caso a transação seja um débito, tive a resposta esperada, a url de autenticação tudo certo.
estou com o mesmo problema : ["authenticationUrl":"Cielo\API30\Ecommerce\Payment":private]=> NULL ["authenticate":"Cielo\API30\Ecommerce\Payment":private]=> bool(true) ["type":"Cielo\API30\Ecommerce\Payment":private]=> string(9) "DebitCard", eu não tenho muita experiencia com isso poderia me mostrar como você fez pra receber essa authenticationUrl ?
edit1 : Consegui a url de autenticação, só coloquei o tipo:debitcard, e o outro erro era porque eu estava usando um cartão de débito da elo
edit2: tive que adicionar isso ao exemplo: $payment->setAuthenticate(TRUE) ->setType(Payment::PAYMENTTYPE_DEBITCARD)
Fiz como o @GabrielGCardoso indicou e funcionou corretamente. Obrigado.
Neste caso, precisei fazer apenas isso:
$payment->setAuthenticate(TRUE) ->setType(Payment::PAYMENTTYPE_DEBITCARD)
Olá pessoal, o problema é exatamente o que o @brunoroeder disse.
No exemplo do README consta o seguinte exemplo:
$payment->debitCard("123", CreditCard::VISA)->setExpirationDate("12/2018")->setCardNumber("0000000000000001")->setHolder("Fulano de Tal");
Mas falta informar que deve ser uma solicitação autenticada. Basta acrescentar o método setAuthenticate
passando true
. Portanto deve ficar assim:
$payment->debitCard("123", CreditCard::VISA)->setExpirationDate("12/2018")->setCardNumber("0000000000000001")->setHolder("Fulano de Tal")->setAuthenticate(TRUE);
Código acima não funcionou para me, mas eu consegui de uma forma parecida. Depois de dias debugando --'
$payment->setCapture(1);
$payment->setAuthenticate(1);
$payment->debitCard("123", CreditCard::VISA)->setExpirationDate("12/2018")->setCardNumber("0000000000000001")->setHolder("Fulano de Tal");