Skip to content

JsonMapperException engole erros da API silenciosamente — resposta HTTP de erro inacessível #67

@lfgcampos

Description

@lfgcampos

Descrição

Qualquer erro retornado pela API da Pagar.me (4xx) resulta em uma JsonMapperException genérica que não contém a mensagem real do erro. Isso torna o diagnóstico de falhas praticamente
impossível sem instrumentação adicional.

Versão do SDK: 6.8.12 (e anteriores)


Causa raiz

ErrorException estende ApiException, que possui o seguinte construtor:

public function __construct(string $reason, HttpRequest $request, ?HttpResponse $response)

Quando a API retorna um erro (ex: 422), o SDK tenta desserializar o corpo da resposta em um objeto ErrorException via JsonMapper. O JsonMapper não consegue injetar os argumentos
HttpRequest e HttpResponse — que são objetos PHP, não campos JSON — e lança:

JsonMapperException: Could not find required constructor arguments for PagarmeApiSDKLib\Exceptions\ErrorException: request

Essa exceção não possui getPrevious(), então o corpo HTTP original com o erro real da API é completamente perdido.


Como reproduzir

  1. Faça uma chamada à API com um parâmetro inválido (ex: mpi com valor não aceito)
  2. Capture a exceção:

try {
$charges->createCharge($chargeReq);
} catch (\apimatic\jsonmapper\JsonMapperException $e) {
echo $e->getMessage(); // "Could not find required constructor arguments..."
echo $e->getPrevious(); // null — erro real inacessível
}

  1. O erro real da API ("The mpi field is invalid. Possible values are acquirer, third_party, pagarme") nunca aparece.

Impacto

Todo e qualquer erro de API — campo inválido, cartão recusado, parâmetro ausente — produz exatamente a mesma JsonMapperException genérica. Não é possível distinguir os erros nem
exibi-los ao usuário ou logá-los de forma útil.


Workaround

Usar o httpCallback do builder para logar a resposta HTTP bruta antes que o JsonMapper tente desserializá-la:

use Core\Types\Sdk\CoreCallback;

$callback = new CoreCallback(null, function ($context) {
$status = $context->getResponse()->getStatusCode();
if ($status >= 400) {
// logar $context->getResponse()->getRawBody() aqui
}
});

PagarmeApiSDKClientBuilder::init()
->basicAuthCredentials(...)
->httpCallback($callback)
->build();


Comportamento esperado

Erros da API deveriam ser acessíveis via ErrorException (com getMessage(), getErrors(), etc.) ou, no mínimo, a JsonMapperException deveria preservar o corpo da resposta HTTP em
getPrevious().


Observação

O SDK é gerado via APIMATIC — é possível que a correção precise ser feita no template de geração da classe ErrorException, removendo a dependência de objetos PHP do construtor ou
tratando a desserialização de forma diferente.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions