iugu / iugu-net

Iugu for C#
16 stars 20 forks source link

Opção de envio de Token na Api de cobrança (Lib divergente da documentação) #55

Closed Thiago4breu closed 7 years ago

Thiago4breu commented 7 years ago

De acordo com a análise da API atual (https://iugu.com/referencias/api) há algumas divergências que impedem o novo modelo indicado para uso.

A equipe de suporte do iugu me recomendou integração utilizado do iugu.js para registrar o meio de pagamento e depois vincular o cliente ao Token de pagamento apenas e não mais utilizar o atributo Data para envio dos dados de pagamento, pois este está obsoleto.

O problema é que o request para registrar o meio de pagamento não possui o campo Token e por isto não consigo vincular o cliente com a forma de pagamento gerada pelo iugu.js.

*Obs: não analisei a API toda, este foi o ponto que identifiquei de problema no arquivo de Request de um meio de pagamento (https://github.com/iugu/iugu-net/blob/vnext/iugu.net/Request/PaymentTokenRequestMessage.cs)

Issue criada conforme solicitação da equipe de suporte.

rscouto commented 7 years ago

@Thiago4breu ,

Você não está confundindo? Não conheço o IUGU.js, mas a api que permite um envio de token no corpo da request é a de Charge (ChargeRequestMessage).

Veja se não é dessa request que você está falando: POST https://api.iugu.com/v1/charge

Thiago4breu commented 7 years ago

Rodrigo, creio que os assuntos são distintos. Neste caso, não é uma cobrança direta, é uma Assinatura utilizando o Subscription. No caso do Charge API funcionaría com o IUGU.js porque possui o campo TOKEN para envio.

Sobre o IUGU.js (https://iugu.com/referencias/iugu-js) é um modelo (não sei se novo deles) onde o formulário com dados do cartão é enviado diretamente e retornado um TOKEN, não sendo necessário a utilização do método de criação do TOKEN (https://iugu.com/referencias/api#criar-um-token)

Lembrando que neste caso, como é uma assinatura que estou gerando, estou seguindo o passo-a-passo conforme documento ilustrativo (https://d21fvzaqybvyws.cloudfront.net/9CA0F40E971643D1B7C8DE46BBC18396/images/207/207/5745f26d5b2450d08645d0ddab6915e0690c8437f5427.jpg) e utilizando o método de assinaturas (https://iugu.com/referencias/api#criar-uma-assinatura este que não recebe o token, nem dados do cartão, apenas o cliente e utiliza a forma de pagamento prioritário).

Espero ter ajudado, grande abs.

rscouto commented 7 years ago

Fala @Thiago4breu,

Então eu acho que não entendi...rsrs. Lendo a documentação da API de assinatutas ela não aceita nenhum token. Na de token de pagamento tbm não.

Onde precisa ter o dado do Token que não tem? Em que API? Pelo que estou entendendo isso não está documentado ainda.

Thiago4breu commented 7 years ago

Então Rodrigo, é um pouco confusa mesmo a API neste sentido. Tanto que solicitei auxilio do suporte para compreender este modelo de assinaturas. Resumindo, o Fluxo neste caso seria +/- este (para cartão de crédito):

Front-End 1 - Gerar o TOKEN de pagamento (formulário HTML com IUGU.js que retorna o TOKEN)

Back-End 1 - Envia o TOKEN via post 2 - Cadastra o cliente no IUGU (API: https://iugu.com/referencias/api#criar-um-cliente) 3 - Cadastro o Meio de Pagamento usando o Token (API: https://iugu.com/referencias/api#criar-uma-forma-de-pagamento) 4 - Cria a assinatura para o Cliente (API: https://iugu.com/referencias/api#criar-uma-assinatura)

São 3 operações separadas que criam a assinatura para o cliente utilizando o meio de pagamento preferencial dele, um pouco diferente da ChargeAPI é verdade.

Abs

alepaez commented 7 years ago

Boa tarde pessoal.

O que o @Thiago4breu está querendo dizer é que falta o parâmetro token aqui https://github.com/iugu/iugu-net/blob/vnext/iugu.net/Entity/PaymentMethodModel.cs

Assim, em vez de mandar o parâmetro data com os dados do cartão, ele pode mandar o token que vem do iugu.js.

Abraços

Thiago4breu commented 7 years ago

@alepaez não é bem exatamente colocar este parâmetro token apenas. Deve haver uma lógica no processo segundo a documentação e algo que constatei na prática utilizando uma API REST.

Para o caso de enviar o TOKEN deve-se remover o campo ITEM_TYPE e o campo DATA do request, ou será disparado erro, pois este é obrigatório quando o campo DATA é enviado.

E pelos testes que executei, esta lógica no JSON de request deve ser seguida senão a API retorna erro.

Portanto, se utilizar token (formato novo): { "description":"Teste Criado API", "token":"0f8fad5b-d9cb-469f-a165-70867728950e" }

Se enviar os dados do Cartão (formato antigo que será descontinuado segundo a API): { "description":"Teste Criado API", "item_type":"credit_card", "data" : { "number" : "4111111111111111", "verification_value" : "123", "first_name": "teste", "last_name": "usuario", "month" : "02", "year" : "2020" } }

Abs

rscouto commented 7 years ago

@Thiago4breu

Eu estou muito pegado essa semana por isso ainda não fiz essa alteração no client pra atender esse novo modelo, não é dificil fazer só estou sem tempo infelizmente só poderei fazer semana que vem. Se vc quiser submeter a PR eu olho e aceito rápido, ai é so rodar o deploy do novo nuget e pronto.

Se você puder esperar esses dias, semana que vem posso fazer. Se arrumar algum tempo antes eu faço.

Mas relembro que PRs são bem vindas. 😄

Um abraço @rscouto

rscouto commented 7 years ago

@Thiago4breu , Essa era uma implementação antiga já existia o método no client pra isso, porem ele sempre enviava os 2 o token e os dados do cartão, dando o erro que vc mesmo citou. Corrigi isso, melhorei a documentação do método. Infelizmente não pude mudar a assinatura horrivel dele. Fica pra v2.0 já que não posso quebrar as assinaturas nesse momento.

// https://iugu.com/referencias/api#criar-uma-forma-de-pagamento
using (var apiClient = new PaymentMethod("id_do_cliente"))
{
    // sorry pela assinatura horrorosa :(
    var paymentmMethod = await apiClient.CreateAsync("my credit data", null, null, "my token")
                                        .ConfigureAwait(false);
};

Disponivel na versão: 1.8.10 do client nuget 1.8.10

alepaez commented 7 years ago

@rscouto

Valeu Rodrigo! Ficou ótimo!

Abraços

Thiago4breu commented 7 years ago

@rscouto Beleza Rodrigo, na verdade eu também estou bem complicado acabei fazendo este método nativo com httpclient para resolver meu problema aqui.

Mas ja vou ajustar meu código para utilizar a Lib.

Grande Abs

rscouto commented 7 years ago

Fala @Thiago4breu,

Por acaso chegou a testar e tal? Posso fechar a issue?