SOLUÇÃO DE POSSÍVEIS ERROS | SEMANA 6 - CONSUMO DE API's TERCEIRAS

Problema 1 | Erro no require() com node-fetch - Aula 6

node-fetch da v3 é um módulo somente do ESM
ou seja , você não pode importá-lo com arquivos require() .

Solução 1

Use a v2 que permanece compatível com CommonJS.

npm install node-fetch@2
Atenção ! Essa versão ( ^2 ) ainda não é nativa do Node.js e alguns métodos não funcionam nele como o response.json() exemplificado na documentação(node-fetch - npm)
Então se for usar a versão 2 faça o código como o professor faz.

Solução 2

Caso queira acompanhar a versão atual onde o fetch() é nativo do Node.js basta importar o fetch usando o código abaixo:

const fetch = (...args) => import('node-fetch').then(({default: fetch}) => fetch(...args))

Dai sim dá pra acompanhar pela Documentação(node-fetch - npm) e/ou pelo código do professor.

Problema 2 | API não retorna o Capture - status 400 Bad Request - Aula 7

Na aula 6 o professor passa uma Requisição como esta que de fato funciona:

{  
  "MerchantOrderId":"2014111701",
  "Customer":{  
     "Name":"Comprador crédito completo"
     },
  "Payment":{  
    "Type":"CreditCard",
    "Amount":15700,
    "Installments":1,
    "SoftDescriptor":"123456789ABCD",
    "CreditCard":{  
        "CardNumber":"1234123412341231",
        "Holder":"Teste Holder",
        "ExpirationDate":"12/2030",
        "SecurityCode":"123",
        "Brand":"Visa",
        "CardOnFile":{
           "Usage": "Used",
           "Reason":"Unscheduled"
        }
    },
    "IsCryptoCurrencyNegotiation": true
  }
}

Mas a Requição da documentação atualizada é esta:

Role até o final do código para entender

{  
   "MerchantOrderId":"2014111701",
   "Customer":{  
      "Name":"Comprador crédito completo",
      "Email":"compradorteste@teste.com",
      "Birthdate":"1991-01-02",
      "Address":{  
         "Street":"Rua Teste",
         "Number":"123",
         "Complement":"AP 123",
         "ZipCode":"12345987",
         "City":"Rio de Janeiro",
         "State":"RJ",
         "Country":"BRA"
      },
        "DeliveryAddress": {
            "Street": "Rua Teste",
            "Number": "123",
            "Complement": "AP 123",
            "ZipCode": "12345987",
            "City": "Rio de Janeiro",
            "State": "RJ",
            "Country": "BRA"
        },
        "Billing": {
            "Street": "Rua Neturno",
            "Number": "12345",
            "Complement": "Sala 123",
            "Neighborhood": "Centro",
            "City": "Rio de Janeiro",
            "State": "RJ",
            "Country": "BR",
            "ZipCode": "20080123"
  },
   },
   "Payment":{  
     "Currency":"BRL",
     "Country":"BRA",
     "ServiceTaxAmount":0,
     "Installments":1,
     "Interest":"ByMerchant",
     "Capture": true,
     "Authenticate":"false",
     "Payment.Recurrent":"false",
     "SoftDescriptor":"123456789ABCD",
     "CreditCard":{  
         "CardNumber":"1234123412341231",
         "Holder":"Teste Holder",
         "ExpirationDate":"12/2030",
         "SecurityCode":"123",
         "SaveCard":"false",
         "Brand":"Visa",
         "CardOnFile":{
            "Usage": "Used",
            "Reason":"Unscheduled"
         }
     },
     "IsCryptoCurrencyNegotiation": true,
     "Type":"CreditCard",
     "Amount":15700,
     "AirlineData":{
         "TicketNumber":"AR988983"
     }
   }
} 

Capture dentro de Payment{…} tem valor true e deve ser mudado pra false

Com o valor true a API entende que o Capture da operação já foi feita e por isso retorna um status 400 de bad request.

Ai fica a seu critério usar o Request do professor ou da Documentação atualizada
Basta fazer "Capture" : false ou simplemente apagar o atributo pois API já dá
false como valor default.

Problema 3 | Erro de Sintaxe no Json e cURL

ATENÇÃO ao copiar o código da documentação da Cielo.
O código cURL ta Diferente do JSON. O JSON que funciona ! :slight_smile:

Quem quiser agregar por gentileza fiquem à vontade.

28 Likes

No Problema 1 | Erro no require() com node-fetch - Aula 6: você pode resolve-lo somente importando o node-fetch como
const fetch = (...args) => import('node-fetch').then(({default: fetch}) => fetch(...args))
Sem precisar baixar a versão anterior, se quiser…

8 Likes

Vou usar sua solução como base de outro problema no post blz ?! rsrsr

3 Likes

Me salvou bonito, estava com problema na parte da captura. Estava faltando trocar o valor do Capture para false como você falou.

2 Likes

Caramba, salvou, já vou ficar atento a essa questão porque estou começando agora essa playlist. Valeu colega! :love_you_gesture: :+1:

3 Likes

Obrigada. Estava com problema na parte de integração. Agora foi.

2 Likes

Giovanna, no momento da atribuição a fetch esses argumentos ficam assim mesmo nesta linha? podemos mesmo escrever exatamente como está na linha - (…args)?

Isso, exatamente assim : )

1 Like

Fica a vontade!

Oi gente. Na aula 6 por volta dos 25min quando clico em Send no Postman eu recebo o seguinte erro:

Alguém consegue me ajudar? Meu código onde aparece cielo.compra pelo que verifiquei tá igual o do professor (arquivo compras.js):

Ok, vou testar. Obrigada!

É como se o método compra não foi feito no arquivo cielo.js. Mostra o código do arquivo cielo.js.

Se estiver no github manda o link

1 Like
const fetch = (...args) => import('node-fetch').then(({default: fetch}) => fetch(...args));

class Cielo {
  async compra(params) {

    const response = await fetch('https://apisandbox.cieloecommerce.cielo.com.br/1/sales/', {
      method: 'post',
      body: JSON.stringify(params),
      headers: {
        'Content-Type': 'application/json',
        'MerchantId': '1c4207a0-a55a-4e49-b3fc-500e05664068',
        'MerchantKey': 'RVVAGCJDPATMRFAKUHMVZHPILAMIGTASLEOUYWAR',
      }
    });
    const data = await response.json();

    console.log(data);
  }
}

module.exports = Cielo;
1 Like

Tá faltando o static antes do nome async. Faz o teste e ver se dá certo

1 Like

Deu certo hahah Eu não sabia que tinha que ser static async, achei que tinha que substituir. Gente essa parte de back-end tá muito difícil pra mim. Obrigada pela ajuda @Davidson.Xavier

1 Like

Essa parte de backend é meio chato mesmo. Estamos tudo no mesmo barco kkkkk

1 Like

Oi galera. Na aula 7 quando eu faço o teste da rota de compra / captura está me retornando com o status 402 e não o 200, alguém pode me ajudar onde está o erro?

vou mandar a rota como está:

e a propriedade da classe:

no postman me retorna assim:

Obrigada, ajudou muito!

Deyvison na sua requisição o tipo de captura está como string “false” tire as aspas, deixe só false

1 Like

Tem uma mensagem acusando ‘Card Expired’, mas a data de expiração está para 2030.

eu mudei o capture para true e false sem aspas mas continua caindo no 402