pagarme / pagarme-core-api-php

Other
0 stars 2 forks source link

API Criar Token Cartão #29

Open alexandre-da-costa opened 2 years ago

alexandre-da-costa commented 2 years ago

Hoje gastei várias horas até perceber que a API de criar token de cartão não funciona corretamente, ou então a documentação está errada.

Na referência da versão 5, https://docs.pagar.me/reference#criar-token-cartão-1, mostra-se a possibilidade de inserir dados do endereço de cobrança junto dentro do objeto card.

Porém, ao criar um cartão com o token gerado, o billing address não é criado. O cartão fica sem a informação. Isso causa erro na hora de gerar os pedidos, o, já famoso em outras issues, "validation_error | billing | "value" is required", que não ajuda em muita coisa.

Fui perceber ao começar a ver o que estava sendo gravado no cliente via dash. Lá, notei que não estava gravando o billing address. Usando o mesmo objeto card que usava para gerar o token, fiz a criação do card diretamente para o usuário, via API Criar Cartão. Aí sim, gravou o billing address.

Queria aproveitar a vantagem de não ter que fazer um monte de tratamento para inserir o billing address, mas não é possível.

Favor ajustar a função ou documentação, para não ficar perdendo tempo do pessoal...

brunostc commented 2 years ago

Também estou com o mesmo problema, preciso criar o token para realizar os pedidos e com o token de cartão simplesmente não consigo criar pedidos, dessa maneira a API é completamente inútil para mim.

Será que poderiam ajustar isso? É muito chato isso, é maior rolo pra conseguir contratar o serviço e fechar o contrato com vocês e aí quando fecha vocês simplesmente não fornecem uma API que funcione corretamente.

Frustrante.

alexandre-da-costa commented 2 years ago

Também estou com o mesmo problema, preciso criar o token para realizar os pedidos e com o token de cartão simplesmente não consigo criar pedidos, dessa maneira a API é completamente inútil para mim.

Será que poderiam ajustar isso? É muito chato isso, é maior rolo pra conseguir contratar o serviço e fechar o contrato com vocês e aí quando fecha vocês simplesmente não fornecem uma API que funcione corretamente.

Frustrante.

Pois é. Nem o suporte via e-mail deles ajuda. Levam uma semana para responder, e, quando respondem, não falam nada que ajuda ou mandam links da documentação online... Só não revi trocar de serviço pois PagSeguro é pior, MercadoPago não tem sistema bom de recorrência, etc...

Mas, lendo o código, eu consegui usar sem maiores problemas a este pacote. Só tive que enviar o billing address via backend.

Qual o problema que você está tendo? Posso tentar ajudar.

brunostc commented 2 years ago

Eu estou fazendo uma aplicação onde tem pagamento por cartão de crédito através do app mobile, portanto preciso enviar os dados do cartao para o endpoint de tokenização de cartão da pagarme (através do cliente) para trabalhar com esse token no backend (criar o pedido). Mas quando crio o pedido me retorna esse erro de billing address, já tentei pré cadastrar o billing address e entao enviar só o billing_address_id, mas também não deu certo, já tentei enviar o billing address no objeto de pedido e também nao deu certo. Poderia me dizer como você fez pra conseguir utilizar o token de cartao em alguma cobrança/pedido?

alexandre-da-costa commented 2 years ago

Bom dia, claro.

No front, você faz um request direto para a API da Pagar.me para gerar o token, segue o body que usei para testes no Postman:

{
    "type": "card",
    "card": {
        "number": "4000000000000010",
        "holder_name": "Tony Sr Stark",
        "holder_document": "93095135270",
        "exp_month": 4,
        "exp_year": 2029,
        "cvv": "123",
        "brand": "VISA",
        "options": {
            "verify_card": true
        }
    }
}

Aí você manda para o seu backend o token, parcelas, etc e o billing address. Primeiro, cria o objeto de pagamento com cartão, que tem que informar parcelas e etc...

$cardPayment= new CreateCreditCardPaymentRequest();
$cardPayment->installments = $details['installments'];
$cardPayment->capture = true;
$cardPayment->statementDescriptor = config('app.name');

Dentro do atributo card dele, você cria um objeto cartão, e nesse objeto vc informa o token e o billing address Eu quis deixar o billing address bem completo, nos padrões que vi na doc... é meio redundante, mas deve haver motivos.

$cardPayment->card = new CreateCardRequest();
$cardPayment->card->token = $details['token'];
$cardPayment->card->billingAddress = new CreateAddressRequest();
$cardPayment->card->billingAddress->line1 =
    $details['billing_address']['number'] . ', ' .
    $details['billing_address']['street'] . ', ' .
    $details['billing_address']['district'];
$cardPayment->card->billingAddress->line2 = $details['billing_address']['complement'];
$cardPayment->card->billingAddress->street = $details['billing_address']['street'];
$cardPayment->card->billingAddress->number = $details['billing_address']['number'];
$cardPayment->card->billingAddress->complement = $details['billing_address']['complement'];
$cardPayment->card->billingAddress->neighborhood = $details['billing_address']['district'];
$cardPayment->card->billingAddress->zipCode = $details['billing_address']['cep'];
$cardPayment->card->billingAddress->city = $details['billing_address']['city'];
$cardPayment->card->billingAddress->state = $details['billing_address']['state'];
$cardPayment->card->billingAddress->country = $details['billing_address']['country'];

Aí você usa ele dentro do atributo payments do pedido

$order->payments = [new \PagarmeCoreApiLib\Models\CreatePaymentRequest()];
$order->payments[0]->creditCard = $cardPayment;
$order->payments[0]->paymentMethod = "credit_card";

E daí só enviar o pedido...

Abraços

brunostc commented 2 years ago

Obrigado pela respota rapida, ajudou muito.

Uma ultima duvida, o pacote pagarme-core-api-php é diferente do pacote pagarme-php?

Porque estou utilizando o pagarme-php (composer require pagarme/pagarme-php) e não consigo importar as classes que você colocou no seu exemplo.

alexandre-da-costa commented 2 years ago

Opa,

sim o pagarme-php é das versões velhas...

A versão nova da API usa este aqui.

composer require pagarme/pagarmecoreapi

tira o antigo do teu composer.json e bota o novo.

brunostc commented 2 years ago

Obrigado pela ajuda, Alexandre.

Um abraço.

crossworth commented 2 years ago

@alexandre-da-costa quando tu diz: "No front, você faz um request direto para a API da Pagar.me para gerar o token" isso seria para criar o card hash, o mesmo que o tokenizecard js deveria fazer (mas hoje está quebrado com problemas de CORS), correto?

Se sim, poderia me informar a URL que você utiliza para criar esse card hash e se preciso enviar a Chave pública?

@brunostc Sobre alterar a biblioteca, tu vai ter que provavelmente verificar se sua conta tem suporte para API nova (talvez tenha que solicitar) e também talvez tenha que verificar se as taxas são iguais... pelo menos é isso que a gente teve que fazer para poder sair da versão antigo para a nova.

alexandre-da-costa commented 2 years ago

@alexandre-da-costa quando tu diz: "No front, você faz um request direto para a API da Pagar.me para gerar o token" isso seria para criar o card hash, o mesmo que o tokenizecard js deveria fazer (mas hoje está quebrado com problemas de CORS), correto?

Se sim, poderia me informar a URL que você utiliza para criar esse card hash e se preciso enviar a Chave pública?

Eu faço um POST no endpoint que tem na documentação. Não vi necessidade de usar o script para isso. Tem que enviar a chave pública como parâmetro: https://api.pagar.me/core/v5/tokens?appId=pk_test_xxxxxxxxxxxxx