diff --git a/README.md b/README.md index 52f536b..3a124c8 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 @@ -98,29 +110,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; } ``` 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() {