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
- Faça uma chamada à API com um parâmetro inválido (ex: mpi com valor não aceito)
- 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
}
- 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.
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
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
}
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.