Erro ao criar pedido: ValidationException sem nenhuma mensagem informando o problema
victor-carv opened this issue · 5 comments
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?
@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
https://github.com/moip/moip-sdk-php#tratamento-de-exce%C3%A7%C3%B5es
Veja que bizarro o que resolveram fazer com a ValidationException
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;
...
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.
@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.