From d6a691e361320866e6522a6143c5140adc8401f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Batista=20Neto?= Date: Thu, 15 Sep 2022 11:41:50 -0300 Subject: [PATCH 1/4] Atualiza projeto, adiciona 3DS 2 com MPI Rede e Cliente e adiciona teste com exemplo de uso. --- eRede/eRede/Device.cs | 12 ++++ .../Service/AbstractTransactionService.cs | 1 + eRede/eRede/ThreeDSecure.cs | 20 +++++- eRede/eRede/eRede.cs | 2 +- eRede/eRedeTests/eRedeTest.cs | 71 +++++++++++++++++-- 5 files changed, 99 insertions(+), 7 deletions(-) create mode 100644 eRede/eRede/Device.cs diff --git a/eRede/eRede/Device.cs b/eRede/eRede/Device.cs new file mode 100644 index 0000000..b6151b8 --- /dev/null +++ b/eRede/eRede/Device.cs @@ -0,0 +1,12 @@ +namespace eRede; + +public class Device +{ + public int ColorDepth { get; set; } + public string DeviceType3ds { get; set; } + public bool JavaEnabled { get; set; } + public string Language { get; set; } = "BR"; + public int ScreenHeight { get; set; } + public int ScreenWidth { get; set; } + public int TimeZoneOffset { get; set; } = 3; +} \ No newline at end of file diff --git a/eRede/eRede/Service/AbstractTransactionService.cs b/eRede/eRede/Service/AbstractTransactionService.cs index c3d4534..adce106 100644 --- a/eRede/eRede/Service/AbstractTransactionService.cs +++ b/eRede/eRede/Service/AbstractTransactionService.cs @@ -46,6 +46,7 @@ protected TransactionResponse SendRequest(RestRequest request) var response = client.Execute(request); if (response is null) throw new NullReferenceException("Response is null"); + if (response.Content is null) throw new NullReferenceException("Response content is null"); var status = (int)response.StatusCode; diff --git a/eRede/eRede/ThreeDSecure.cs b/eRede/eRede/ThreeDSecure.cs index 93e0d64..adf1d66 100644 --- a/eRede/eRede/ThreeDSecure.cs +++ b/eRede/eRede/ThreeDSecure.cs @@ -2,14 +2,32 @@ namespace eRede; public class ThreeDSecure { + public const string MpiRede = "MPI Rede"; + public const string MpiCliente = "MPI Cliente"; + public const string ContinueOnFailure = "continue"; public const string DeclineOnFailure = "decline"; + public ThreeDSecure() + { + Embedded = true; + } + + public ThreeDSecure(string mpi) + { + Embedded = mpi == MpiRede; + } + public string Cavv { get; set; } public string Eci { get; set; } public bool Embedded { get; set; } - public string OnFailure { get; set; } + public string OnFailure { get; set; } = DeclineOnFailure; public string Url { get; set; } public string UserAgent { get; set; } public string Xid { get; set; } + public Device Device { get; set; } + public string ReturnCode { get; set; } + public string ReturnMessage { get; set; } + public string ThreeDIndicator { get; set; } + public string DirectoryServerTransactionId { get; set; } } \ No newline at end of file diff --git a/eRede/eRede/eRede.cs b/eRede/eRede/eRede.cs index 2accf50..571c292 100644 --- a/eRede/eRede/eRede.cs +++ b/eRede/eRede/eRede.cs @@ -5,7 +5,7 @@ namespace eRede; public class eRede { - public const string Version = "1.0.0"; + public const string Version = "2.0.0"; public const string UserAgent = "eRede/" + Version + "(SDK; C#)"; private readonly Store _store; diff --git a/eRede/eRedeTests/eRedeTest.cs b/eRede/eRedeTests/eRedeTest.cs index 28dde1b..c2fef35 100644 --- a/eRede/eRedeTests/eRedeTest.cs +++ b/eRede/eRedeTests/eRedeTest.cs @@ -1,21 +1,21 @@ using System; +using System.Collections.Generic; using eRede; using eRede.Service.Error; using NUnit.Framework; using Environment = eRede.Environment; -using Transaction = eRede.Transaction; namespace eRedeTests; public class eRedeTest { + private string? _cardCvv; + private string? _cardHolder; + private string? _cardNumber; private string? _ec; - private string? _token; private Environment? _environment; private DateTime _expiration; - private string? _cardNumber; - private string? _cardHolder; - private string? _cardCvv; + private string? _token; [SetUp] public void Setup() @@ -33,6 +33,67 @@ public void Setup() _cardHolder = "Fulano de tal"; } + [Test] + public void Test3DS2() + { + var store = new Store("", "", _environment); + var transaction = new Transaction + { + Amount = 20, + Reference = "pedido" + new Random().Next(200, 10000), + ThreeDSecure = new ThreeDSecure + { + Embedded = true, + UserAgent = + "Mozilla/5.0 (iPad; U; CPU OS 3_2_1 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Mobile/7B405", + OnFailure = ThreeDSecure.ContinueOnFailure, + Device = new Device + { + ColorDepth = 1, + DeviceType3ds = "BROWSER", + JavaEnabled = false, + Language = "BR", + ScreenHeight = 1080, + ScreenWidth = 1920, + TimeZoneOffset = 3 + } + }, + Urls = new List + { + new() + { + Kind = Url.ThreeDSecureSuccess, url = "https://scommerce.userede.com.br/LojaTeste/Venda/sucesso" + }, + new() + { + Kind = Url.ThreeDSecureFailure, url = "https://scommerce.userede.com.br/LojaTeste/Venda/opz" + } + } + }.CreditCard( + _cardNumber, + _cardCvv, + _expiration.Month.ToString(), + _expiration.Year.ToString(), + _cardHolder + ); + + var response = new eRede.eRede(store).Create(transaction); + + switch (response.ReturnCode) + { + case "201": + Console.WriteLine("A autenticação não é necessária"); + break; + case "220": + Console.WriteLine($"URL de redirecionamento enviada: {response.ThreeDSecure.Url}"); + break; + default: + Console.WriteLine( + $"Foi retornado o código {response.ReturnCode} com a seguinte mensagem: '{response.ReturnMessage}"); + break; + } + } + [Test] public void TestEcTokenAreRequired() { From 23abb72045ea9cd85854bf544b875601e41b76c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Batista=20Neto?= Date: Tue, 8 Nov 2022 10:30:34 -0300 Subject: [PATCH 2/4] Adiciona exemplo do 3DS2 --- README.md | 55 ++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 44 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 52f536b..db847e6 100644 --- a/README.md +++ b/README.md @@ -98,29 +98,62 @@ mais através [da documentação](https://www.userede.com.br/desenvolvedores/pt/ var store = new Store(pv, token, environment); var transaction = new Transaction { - amount = 20, - reference = "pedido" + new Random().Next(200, 10000) -}.DebitCard( - "2223000148400010", - "123", + Amount = 20, + Reference = "pedido" + new Random().Next(200, 10000), + ThreeDSecure = new ThreeDSecure + { + Embedded = true, + UserAgent = + "Mozilla/5.0 (iPad; U; CPU OS 3_2_1 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Mobile/7B405", + OnFailure = ThreeDSecure.ContinueOnFailure, + Device = new Device + { + ColorDepth = 1, + DeviceType3ds = "BROWSER", + JavaEnabled = false, + ScreenHeight = 1080, + ScreenWidth = 1920, + TimeZoneOffset = 3 + } + }, + Urls = new List + { + new() + { + Kind = Url.ThreeDSecureSuccess, url = "https://scommerce.userede.com.br/LojaTeste/Venda/sucesso" + }, + new() + { + Kind = Url.ThreeDSecureFailure, url = "https://scommerce.userede.com.br/LojaTeste/Venda/opz" + } + } +}.CreditCard( + "5448280000000007", + "235", "12", "2020", "Fulano de tal" ); -transaction.AddUrl("http://example.org/success", Url.THREE_D_SECURE_SUCCESS); -transaction.AddUrl("http://example.org/failure", Url.THREE_D_SECURE_FAILURE); - -var response = new eRede.eRede(store).create(transaction); +var response = new eRede.eRede(store).Create(transaction); ``` Assim que a transação for criada, o cliente precisará ir até a página do banco para autenticar. O código de status `220` indica que o cliente precisará ser redirecionado: ```csharp -if (response.returnCode == "220") +switch (response.ReturnCode) { - Console.Write(response.threeDSecure.url); + case "201": + Console.WriteLine("A autenticação não é necessária"); + break; + case "220": + Console.WriteLine($"URL de redirecionamento enviada: {response.ThreeDSecure.Url}"); + break; + default: + Console.WriteLine( + $"Foi retornado o código {response.ReturnCode} com a seguinte mensagem: '{response.ReturnMessage}"); + break; } ``` From 70cde2b8e70589e286678d4a726d2f7c8792b58a Mon Sep 17 00:00:00 2001 From: RedeEc <40892728+RedeEc@users.noreply.github.com> Date: Thu, 8 Dec 2022 15:36:47 -0300 Subject: [PATCH 3/4] =?UTF-8?q?Descri=C3=A7=C3=A3o=20das=20funcionalidades?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/README.md b/README.md index db847e6..f404fea 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,18 @@ SDK de integração eRede +# Funcionalidades +Este SDK possui as seguintes funcionalidades: + +*Autorização +* Captura +* Consultas +* Cancelamento +* 3DS2 +* Zero dollar +* iata +* MCC dinâmico + # Utilizando ## Autorizando uma transação From 11ded48ce23595dd1f79b4cf5469d8dae38ea074 Mon Sep 17 00:00:00 2001 From: RedeEc <40892728+RedeEc@users.noreply.github.com> Date: Thu, 8 Dec 2022 15:37:26 -0300 Subject: [PATCH 4/4] =?UTF-8?q?Descri=C3=A7=C3=A3o=20das=20funcionalidades?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f404fea..3a124c8 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ SDK de integração eRede # Funcionalidades Este SDK possui as seguintes funcionalidades: -*Autorização +* Autorização * Captura * Consultas * Cancelamento