gerencianet / gn-api-sdk-php

SDK em PHP integrada às APIs da Gerencianet preparada para emissão de cobranças Pix com QR Code e Pix Copia e Cola, split/divisão de Pix, boletos, carnês, cartão de crédito, assinatura, link de pagamento, marketplance, iniciação de pagamento Pix via Open Finance, pagamento de boletos, dentre outras funcionalidades.
https://dev.gerencianet.com.br/docs/instalacao-sdk-php
MIT License
86 stars 45 forks source link

Problema ao criar cobrança imediata #37

Closed capedra closed 3 years ago

capedra commented 3 years ago

Venho obtendo o seguinte erro ao criar uma cobrança imediata usando o PHP8+Codeigniter4. Pela ordem, estou criando a chave Pix, o WebHook da chave e quando eu crio a cobrança, recebo essa mensagem de que a chave não pertence à Gerencianet. Porém, quando eu consulto a chave criada, ela se encontra lá.

{
    "title": "GuzzleHttp\\Exception\\ClientException",
    "type": "GuzzleHttp\\Exception\\ClientException",
    "code": 400,
    "message": "Client error: `POST https://api-pix.gerencianet.com.br/v2/cob` resulted in a `400 Bad Request` response:\n{\"nome\":\"chave_invalida\",\"mensagem\":\"A chave informada não faz referência à conta Gerencianet autenticada\"}\n",
    "file": "/var/www/xyz.com/public_html/vendor/guzzlehttp/guzzle/src/Exception/RequestException.php",
    "line": 113,
    "trace": [
        {
            "file": "/var/www/xyz.com/public_html/vendor/guzzlehttp/guzzle/src/Middleware.php",
            "line": 69,
            "function": "create",
            "class": "GuzzleHttp\\Exception\\RequestException",
            "type": "::"
        },
        {
            "file": "/var/www/xyz.com/public_html/vendor/guzzlehttp/promises/src/Promise.php",
            "line": 204,
            "function": "GuzzleHttp\\{closure}",
            "class": "GuzzleHttp\\Middleware",
            "type": "::"
        },
        {
            "file": "/var/www/xyz.com/public_html/vendor/guzzlehttp/promises/src/Promise.php",
            "line": 153,
            "function": "callHandler",
            "class": "GuzzleHttp\\Promise\\Promise",
            "type": "::"
        },
        {
            "file": "/var/www/xyz.com/public_html/vendor/guzzlehttp/promises/src/TaskQueue.php",
            "line": 48,
            "function": "GuzzleHttp\\Promise\\{closure}",
            "class": "GuzzleHttp\\Promise\\Promise",
            "type": "::"
        },
        {
            "file": "/var/www/xyz.com/public_html/vendor/guzzlehttp/promises/src/Promise.php",
            "line": 248,
            "function": "run",
            "class": "GuzzleHttp\\Promise\\TaskQueue",
            "type": "->"
        },
        {
            "file": "/var/www/xyz.com/public_html/vendor/guzzlehttp/promises/src/Promise.php",
            "line": 224,
            "function": "invokeWaitFn",
            "class": "GuzzleHttp\\Promise\\Promise",
            "type": "->"
        },
        {
            "file": "/var/www/xyz.com/public_html/vendor/guzzlehttp/promises/src/Promise.php",
            "line": 269,
            "function": "waitIfPending",
            "class": "GuzzleHttp\\Promise\\Promise",
            "type": "->"
        },
        {
            "file": "/var/www/xyz.com/public_html/vendor/guzzlehttp/promises/src/Promise.php",
            "line": 226,
            "function": "invokeWaitList",
            "class": "GuzzleHttp\\Promise\\Promise",
            "type": "->"
        },
        {
            "file": "/var/www/xyz.com/public_html/vendor/guzzlehttp/promises/src/Promise.php",
            "line": 62,
            "function": "waitIfPending",
            "class": "GuzzleHttp\\Promise\\Promise",
            "type": "->"
        },
        {
            "file": "/var/www/xyz.com/public_html/vendor/guzzlehttp/guzzle/src/Client.php",
            "line": 187,
            "function": "wait",
            "class": "GuzzleHttp\\Promise\\Promise",
            "type": "->"
        },
        {
            "file": "/var/www/xyz.com/public_html/app/Controllers/QR.php",
            "line": 349,
            "function": "request",
            "class": "GuzzleHttp\\Client",
            "type": "->"
        },
        {
            "file": "/var/www/xyz.com/public_html/system/CodeIgniter.php",
            "line": 877,
            "function": "index",
            "class": "App\\Controllers\\QR",
            "type": "->"
        },
        {
            "file": "/var/www/xyz.com/public_html/system/CodeIgniter.php",
            "line": 416,
            "function": "runController",
            "class": "CodeIgniter\\CodeIgniter",
            "type": "->"
        },
        {
            "file": "/var/www/xyz.com/public_html/system/CodeIgniter.php",
            "line": 324,
            "function": "handleRequest",
            "class": "CodeIgniter\\CodeIgniter",
            "type": "->"
        },
        {
            "file": "/var/www/xyz.com/public_html/public/index.php",
            "line": 37,
            "function": "run",
            "class": "CodeIgniter\\CodeIgniter",
            "type": "->"
        }
    ]
}

Se isso não for um bug então não sei o que é, pois esse problema ocorre de forma intermitente.

Grato, Caio.

capedra commented 3 years ago

Acrescentando um delay ou sleep de 1 segundo entre a criação da chave e a criação do webhook parece resolver o problema.

guilhermecotaGn commented 3 years ago

Olá, @capedra. Tudo bem contigo?

Entendi. No caso, a falha apresentada "A chave informada não faz referência à conta Gerencianet autenticada" somente pode ser devido a alguma chave inválida ou que não está registrada na Gerencianet.

Gostaria de saber. A cada cobrança que está criando você gera uma nova chave Pix? Pois isto não é necessário. Você pode criar uma única chave Pix, e utilizá-la em todas as cobranças. Esta chave Pix também pode ser registrada através do aplicativo da Gerencianet, sendo um CPF/CNPJ, e-mail, número de celular ou aleatória. O que deve ser único por cobrança é o txid (identificador da cobrança).

Outro detalhe é sobre o registro do webhook. Você precisará realizar o registro uma única vez para a chave Pix que utilizar.

Caso ainda tenha dificuldades, sugiro acessar nosso servidor do Discord. Você pode me procurar lá, que ficará mais fácil de me passar os detalhes de sua implementação, que então lhe auxilio nesta demanda.