pagarme / pagarme-net

Pagar.me .NET library
MIT License
42 stars 49 forks source link

CardHash.GenerateAsync() falha com System.Net.ProtocolViolationException #88

Open rodrigolira opened 6 years ago

rodrigolira commented 6 years ago

Após baixar o projeto, coloquei no projeto do Playground o seguinte código:

var cardHash = new CardHash();
cardHash.CardCvv = "000";
cardHash.CardExpirationDate = "0000";
cardHash.CardHolderName = "NOME DO TITULAR";
cardHash.CardNumber = "0000000000000000";
await cardHash.GenerateAsync();

Ao chegar na linha GenerateAsync() estoura a exceção indicando que, em uma requisição onde são passadas informações no corpo, deve ser utilizado o verbo POST em vez de GET.

Stack Trace:

   em System.Net.HttpWebRequest.CheckProtocol(Boolean onRequestStream)
   em System.Net.HttpWebRequest.BeginGetRequestStream(AsyncCallback callback, Object state)
   em System.Threading.Tasks.TaskFactory`1.FromAsyncImpl(Func`3 beginMethod, Func`2 endFunction, Action`1 endAction, Object state, TaskCreationOptions creationOptions)
   em PagarMe.PagarMeRequest.<ExecuteAsync>d__25.MoveNext()
--- Fim do rastreamento de pilha do local anterior onde a exceção foi gerada ---
   em System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   em System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   em PagarMe.CardHash.<GenerateAsync>d__21.MoveNext()
--- Fim do rastreamento de pilha do local anterior onde a exceção foi gerada ---
   em System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   em System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   em System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   em Playground.MainClass.<ObterHashDoCartao>d__2.MoveNext() na C:\Users\rodrigo.lira\Downloads\pagarme-net-master\Playground\Program.cs:linha 144
--- Fim do rastreamento de pilha do local anterior onde a exceção foi gerada ---
   em System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   em System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   em System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   em Playground.MainClass.<Teste>d__1.MoveNext() na C:\Users\rodrigo.lira\Downloads\pagarme-net-master\Playground\Program.cs:linha 129
murilohns commented 6 years ago

fala @rodrigolira , você consegue utilizar o método que não é assíncrono?

cardHash.Generate();

Também gostaria de dizer, que à menos que não haja outra forma, o _cardhash deve ser gerado no _frontend, pois o objetivo dele é manter seguro os dados de cartão, evitando que eles trafeguem expostos por sua aplicação.

rodrigolira commented 6 years ago

@murilohns Obrigado pelo retorno. Sim, o método síncrono funciona e é o que estamos utilizando. Achei melhor registrar aqui de qualquer forma.

Com base na sua informação sobre o card_hash fiz um teste e verifiquei que consigo criar um cartão sem passar o hash previamente calculado pela API. No entanto, a documentação da API informa que essa informação é obrigatória para a criação do cartão (ver https://docs.pagar.me/reference#criando-um-cartao). Por esse motivo estávamos calculando o hash no servidor antes de enviar a solicitação de cadastro do cartão.