wirecardBrasil / moip-sdk-php

Cliente em PHP para integração server-side com APIs Moip v2
MIT License
124 stars 90 forks source link

Erro ao criar pedido: ValidationException sem nenhuma mensagem informando o problema #263

Closed victor-carv closed 5 years ago

victor-carv commented 6 years ago

Olá, de uns dias pra cá um site em que fiz a integração com o moip parou de funcionar. Nele estou utilizando a versao: "moip/moip-sdk-php": "^2.2"

Tanto em produção quanto em ambiente sandbox, estou recebendo uma response vazia ao tentar criar o objeto Order. Segue meu código:

    $order = $moip->orders()->setOwnId(uniqid());

    foreach ($pedido->pedidoProdutos as $produto) {
        $order = $order->addItem($produto->nome,
            $produto->quantidade,
            $produto->descricao,
            (int)$produto->valor);
    }

    $order = $order
        ->setShippingAmount($pedido->frete)
        ->setCustomer($customer)
        ->create();

O erro que estou recebendo é justamente na chamada do create(), que dispara um \Moip\Exceptions\ValidationException que foi disparado pelo seguinte código da classe Moip\Resource\MoipResource:

     ...
     } elseif ($code >= 400 && $code <= 499) {
        $errors = Exceptions\Error::parseErrors($response_body);

        throw new Exceptions\ValidationException($code, $errors);
    }

O erro vem vazio, sem nenhum item no $errors e nada no $message. O valor do $code é 400.

Estava funcionando a pouco tempo, não houve nenhuma atualização no meu código. Teve alguma mudança na API? vi que agora tem a versão 3, preciso atualizar pra ela?

victorhramos commented 6 years ago

@victor0402 eu tenho o mesmo problema, não sei porque ignoram os padrões de Exception... Não vem nada com getCode, getMessage, getNada. Resolveram apenas printar erro com .__toString() Tratar exceptions com essa SDK é algo dificílimo

victorhramos commented 6 years ago

https://github.com/moip/moip-sdk-php#tratamento-de-exce%C3%A7%C3%B5es

Veja que bizarro o que resolveram fazer com a ValidationException

victor-carv commented 6 years ago

Depois de muitos testes no escuro, descobri que o problema era algum valor que era passado no:

->setShippingAmount($pedido->frete)
//ou
->setDiscount($pedido->desconto)

Quando passava um valor como por exemplo 16.9, um float, a API do moip me retornava erro 400, sem nenhuma informação. Fazendo o parse para int, transformando em 1690, assim como eu faço para os valores de produtos, nas chamadas ao addItem, passou a funcionar. O que não entendi é que essas funções fazem um parse para float, e o input 16.9 é válido:

public function setDiscount($value)
    {
        $this->data->amount->subtotals->discount = (float) $value;
...
Pedr0Rocha commented 6 years ago

Se você tentar um

try {
    $order = $order
        ->setShippingAmount($pedido->frete)
        ->setCustomer($customer)
        ->create();
} catch (\Exception $e) {
    print_r($e->getErrors());
}

ele não devolve os erros de validação corretamente?

Estranho o erro do float mesmo, o único lugar que validam se int no Order é em preço e quantidade de item (https://github.com/moip/moip-sdk-php/blob/master/src/Resource/Orders.php#L59) que eu tenha visto.

victor-carv commented 6 years ago

@Pedr0Rocha ao executar o create() o moip executa a requisição e cai nesse catch: https://github.com/moip/moip-sdk-php/blob/master/src/Resource/MoipResource.php#L257

O problema é que o $response_body vem vazio, dessa forma não tem como saber o que causou o erro.