crafters / cielo

Gem para integração com os WebServices da Cielo
www.crafters.com.br
MIT License
85 stars 52 forks source link

Erro estranho em transação com token #28

Closed Sanmoo closed 8 years ago

Sanmoo commented 9 years ago

Prezados, nos últimos dias enfrentamos alguns problemas durante a fase de homologação com a cielo devido ao que se mostrou ser um problema de encoding da requisição. O cenário usado pela cielo para a homologação era um de criação de token seguido de uma transação em modo recorrente utilizando esse token. Verificamos que para vários cartões ocorria um erro entre a primeira e segunda etapas desse processo. Os servidores da cielo respondiam com um erro de 'Token desconhecido', mas nós enviávamos o token que havia sido recém-criado.

O pessoal do suporte pediu que enviássemos toda a troca de mensagens entre nosso servidor e o da cielo, para que eles pudessem ajudar na identificação do problema. Nós enviamos, e a resposta deles foi a seguinte:

O token esta sendo enviado sem a conversão de URL-encoding, assim os caracteres + esta sendo interpretado como espaços pela plataforma. Isto ocorre porque a plataforma recebe o xml em um parâmetro da requisição http, utilizando o content-type application/x-www-form-urlencoded. Tecnologias como Java (Apache HttpComponent/HttpClient) realizam esta conversão automaticamente, ficando transparente para o desenvolvedor. O estabelecimento deve avaliar e ajustar o enconding (URLEnconde) na sua solução. Outros caracteres especiais irão apresentar o mesmo problema.

Consegui reproduzir o problema usando testes automatizados e o servidor de testes da cielo. Os testes que tínhamos até então não acusaram o problema aparentemente por simples coincidência. Incrementei os testes com mais números de cartões, em particular os que estão na documentação da cielo, e o problema ficou evidente.

Seguindo essa dica fizemos a seguinte alteração no código de criação dos parâmetros da transação:

Mudamos disso:

  transaction_parameters = {
    numero: ...,
    valor: ...,
    moeda: ...,
    bandeira: ...,
    parcelas: ...,
    token: "XXX",
    autorizar: ...,
    :"url-retorno" => ...
  }

Para isso

  transaction_parameters = {
    numero: ...,
    valor: ...,
    moeda: ...,
    bandeira: ...,
    parcelas: ...,
    token: CGI.escape("XXX"),
    autorizar: ...,
    :"url-retorno" => ...
  }

Escapamos explicitamente o parâmetro 'token' porque apesar de o alerta ser desferido contra toda a request, obviamente a porção problemática dizia respeito ao token. Pois bem, após essa mudança nossos testes passaram e os da cielo também, de forma que pudemos concluir a homologação.

Isso é um bug?

felipero commented 8 years ago

Pode acontecer. Não sei o quanto o escape vai alterar o valor do token e se isso terá algum significado com a cielo. Você conseguiu resolver o seu problema @Sanmoo