O jeito mais simples e råpido de integrar o Wirecard a sua aplicação .NET e feito com base nas APIs REST do Wirecard.
- ImplementaçÔes .NET com suporte
- Aviso Importante
- Instalação
- Autenticando e configurando o ambiente (E-Commerce)
- Autenticando e configurando o ambiente (Marketplace)
- AssĂncrona x SĂncrona
- Conta ClĂĄssica
- Conta Transparente
- Clientes
- Pedidos
- Pagamentos
- Multipedidos
- Multipagamentos
- NotificaçÔes
- Contas BancĂĄrias
- Saldo Wirecard
- Lançamentos
- TransferĂȘncias
- Reembolsos
- Conciliação
- Convertendo objeto para json
- Tabela - Filtros de busca
- Exceção
- Licença
Essa biblioteca foi feito em .NET Standard 1.2 e tem suporte das seguintes implementaçÔes do .NET:
- .NET Core 1.0
- .NET Framework 4.5.1
- Mono 4.6
- Xamarin.iOS 10.0
- Xamarin.Android 7.0
- Universal Windows Platform 10
- Windows 8.1
- Windows Phone 8.1
Para mais informaçÔes: .NET Standard.
Pensando em melhorar ainda mais a sua segurança e para atender a padrĂ”es internacionais do nosso selo PCI Compliance, o Wirecard desativarĂĄ protocolos de segurança TLS (Transport Layer Security) inferiores a 1.2 Ă partir do dia 30/06/2018. Verifique se o seu projeto jĂĄ possui TLS na versĂŁo 1.2, caso nĂŁo, vocĂȘ receberĂĄ uma exceção:
- InnerException = {"A solicitação foi anulada: NĂŁo foi possĂvel criar um canal seguro para SSL/TLS."}
Para isso, adicione o seguinte cĂłdigo no seu projeto:
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
Para mais informaçÔes : TLS1.2.
Execute o comando para instalar via NuGet:
PM> Install-Package WirecardCSharp
đ„ Obs: Trocamos a biblioteca MoipCSharp por WirecardCSharp.
Escolha o "ambiente" vocĂȘ quer executar suas açÔes e informe seu (token, chave):
using WirecardCSharp;
using WirecardCSharp.Models;
private const string token = "xxxxxxxxxxxxxxxxxxx";
private const string key = "xxxxxxxxxxxxxxxxxxxxxxxxxx";
private WirecardClient WirecardClient = new WirecardClient(Environments.SANDBOX, token, key);
Para obter um token e a chave, primeiro faça o login aqui.
VocĂȘ pode acessĂĄ-las em Minha conta > ConfiguraçÔes > Chaves de Acesso.
Escolha o "ambiente" vocĂȘ quer executar suas açÔes e informe seu accesstoken:
using WirecardCSharp;
using WirecardCSharp.Models;
private const string accessToken = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx_v2";
private WirecardClient WirecardClient = new WirecardClient(Environments.SANDBOX, accessToken);
Para obter o accesstoken, vocĂȘ precisa criar um App.
Todos os mĂ©todos sĂŁo assĂncronos, caso vocĂȘ queira executar de forma sĂncrona, veja o exemplo:
var result = Task.Run(() => WirecardClient.Customer.List()).Result;
đ© Essa função funciona somente na conta clĂĄssica.
var result = await WirecardClient.ClassicAccount.AccountExist("[email protected]");
if (result == HttpStatusCode.OK)
{
// jĂĄ existe
//HttpStatusCode.OK == 200 (jĂĄ existe)
//HttpStatusCode.BadRequest == 400 (CPF invĂĄlido)
//HttpStatusCode.NotFound == 404 (Para CPF vĂĄlido, mas nĂŁo possui Conta Wirecard)
}
đ© Essa função funciona somente na conta clĂĄssica.
var result = await WirecardClient.ClassicAccount.AccountExist("123.456.789-01");
if (result == HttpStatusCode.OK)
{
// jĂĄ existe
//HttpStatusCode.OK == 200 (jĂĄ existe)
//HttpStatusCode.BadRequest == 400 (CPF invĂĄlido)
//HttpStatusCode.NotFound == 404 (Para CPF vĂĄlido, mas nĂŁo possui Conta Wirecard)
}
var body = new ClassicAccountRequest
{
//informe os campos aqui
};
var result = await WirecardClient.ClassicAccount.Create(body);
var result = await WirecardClient.ClassicAccount.Consult("MPA-XXXXXXXXXXXX");
đ© O cĂłdigo a seguir nĂŁo consome API, apenas monta o URL. Mais informaçÔes clica aqui.
string response_type = "code";
string client_id = "APP-FFFGVQMOK123";
string redirect_uri = "https://example.com/abc?DEF=ăăă\x20ăă";
string scope = "RECEIVE_FUNDS,MANAGE_ACCOUNT_INFO,DEFINE_PREFERENCES";
var url = Utilities.RequestUserAccessPermissions(response_type, client_id, redirect_uri, scope);
//https://connect-sandbox.moip.com.br/oauth/authorize?response_type=code&client_id=APP-
//FFFGVQMOK123&redirect_uri=https://example.com/abc?DEF=%E3%81%82%E3%81%84%E3%81%86%20%
//E3%81%88%E3%81%8A&scope=RECEIVE_FUNDS,MANAGE_ACCOUNT_INFO,DEFINE_PREFERENCES
Veja aqui como funciona a permissĂŁo.
var result = await WirecardClient.ClassicAccount.GenerateAccessToken(/*informe o valor de cada parĂąmetro*/);
var result = await WirecardClient.ClassicAccount.UpdateAccessToken(/*informe o valor de cada parĂąmetro*/);
var result = await WirecardClient.ClassicAccount.GetPublickey();
var body = new TransparentAccountRequest
{
TransparentAccount = true,
Type = "MERCHANT",
Email = new Email
{
Address = "[email protected]"
},
Person = new Person
{
Name = "PrimeiroNome",
LastName = "SegundoNome",
TaxDocument = new Taxdocument
{
Type = "CPF",
Number = "123.456.798-91"
},
BirthDate = "2011-01-01",
Phone = new Phone
{
CountryCode = "55",
AreaCode = "11",
Number = "965213244"
},
Address = new Address
{
Street = "Av. Brigadeiro Faria Lima",
StreetNumber = "2927",
District = "Itaim",
ZipCode = "01234000",
City = "Osasco",
State = "SP",
Country = "BRA"
}
}
};
var result = await WirecardClient.TransparentAccount.Create(body);
var body = new CustomerRequest
{
//informe os campos aqui
};
var result = await WirecardClient.Customer.Create(body);
var body = new CustomerRequest
{
Method = "CREDIT_CARD",
CreditCard = new Creditcard
{
ExpirationMonth = "06",
ExpirationYear = "2022",
Number = "4012001037141112",
Cvc = "123",
Holder = new Holder
{
FullName = "JoĂŁo da Silva",
BirthDate = "1961-03-01",
TaxDocument = new Taxdocument
{
Type = "CPF",
Number = "11111111111"
},
Phone = new Phone
{
CountryCode = "55",
AreaCode = "11",
Number = "111111111"
}
}
}
};
var result = await WirecardClient.Customer.AddCreditCard(body, "CUS-XXXXXXXXXXXX");
var result = await WirecardClient.Customer.DeleteCreditCard("CRC-XXXXXXXXXXXX");
var result = await WirecardClient.Customer.Consult("CUS-XXXXXXXXXXXX");
var result = await WirecardClient.Customer.List();
var body = new OrderRequest
{
//informe os campos aqui
};
var result = await WirecardClient.Order.Create(body);
var result = await WirecardClient.Order.Consult("ORD-XXXXXXXXXXXX");
var result = await WirecardClient.Order.List();
string filtros = "q=josesilva&filters=status::in(PAID,WAITING)|paymentMethod::in(CREDIT_CARD,BOLETO)|value::bt(5000,10000)&limit=3&offset=0";
var result = await WirecardClient.Order.ListFilter(filtros);
Veja a tabela filtros de busca aqui.
var body = new PaymentRequest
{
//informe os campos aqui
InstallmentCount = 1,
FundingInstrument = new Fundinginstrument
{
Method = "CREDIT_CARD",
CreditCard = new Creditcard
{
Id = "CRC-XXXXXXXXXXXX",
Cvc = "123",
Holder = new Holder
{
FullName = "Jose Portador da Silva",
BirthDate = "1988-12-30",
TaxDocument = new Taxdocument
{
Type = "CPF",
Number = "33333333333"
}
}
}
}
};
var result = await WirecardClient.Payment.Create(body, "ORD-XXXXXXXXXXXX");
var body = new PaymentRequest
{
//informe os campos aqui
StatementDescriptor = "Minha Loja",
FundingInstrument = new Fundinginstrument
{
Method = "BOLETO",
Boleto = new Boleto
{
ExpirationDate = "2020-06-20", //yyyy-MM-dd
InstructionLines = new Instructionlines
{
First = "Atenção",
Second = "fique atento Ă data de vencimento do boleto.",
Third = "Pague em qualquer casa lotérica."
}
}
}
};
var result = await WirecardClient.Payment.Create(body, "ORD-XXXXXXXXXXXX");
var result = await WirecardClient.Payment.ReleaseCustody("ECW-XXXXXXXXXXXX");
var result = await WirecardClient.Payment.CaptureAuthorized("PAY-XXXXXXXXXXXX");
var result = await WirecardClient.Payment.CancelAuthorized("PAY-XXXXXXXXXXXX");
var result = await WirecardClient.Payment.Consult("PAY-XXXXXXXXXXXX");
var result = await WirecardClient.Payment.Simulate("PAY-XXXXXXXXXXXX", 26500);
var body = new MultiOrderRequest
{
//informe os campos aqui
};
var result = await WirecardClient.MultiOrder.Create(body);
var result = await WirecardClient.MultiOrder.Consult("MOR-XXXXXXXXXXXX");
var body = new MultiPaymentRequest
{
//informe os campos aqui
};
var result = await WirecardClient.MultiPayment.Create(body, "MOR-XXXXXXXXXXXX");
var result = await WirecardClient.MultiPayment.Consult("MPY-XXXXXXXXXXXX");
var result = await WirecardClient.MultiPayment.CaptureAuthorized("MPY-XXXXXXXXXXXX");
var result = await WirecardClient.MultiPayment.CancelAuthorized("MPY-XXXXXXXXXXXX");
var result = await WirecardClient.MultiPayment.ReleaseCustody("ECW-XXXXXXXXXXXX");
var body = new NotificationRequest
{
//informe os campos aqui
};
var result = await WirecardClient.Notification.CreatAccountWirecard(body);
Caso nĂŁo tenha uma URL disponĂvel, vocĂȘ pode usar o Webhook Tester para fazer seus testes e receber os webhooks.
Para isso basta acessar o site e gera uma URL automaticamente.
var body = new NotificationRequest
{
Events = new List<string> { "ORDER.*" },
Target = "https://webhook.site/a54daf-da54-8d5a-8d5d1-kfa4gahf42",
Media = "WEBHOOK"
};
var result = await WirecardClient.Notification.CreateApp(body, "APP-XXXXXXXXXXXX");
var result = await WirecardClient.Notification.Consult("NPR-XXXXXXXXXXXX");
var result = await WirecardClient.Notification.List();
var result = await WirecardClient.Notification.Remove("NPR-XXXXXXXXXXXX");
if (result == HttpStatusCode.NoContent)
{
// Caso a PreferĂȘncia de Notificação tenha sido deletada, vocĂȘ deve receber uma response vazia (NoContent)
}
var result = await WirecardClient.Notification.ConsultWebhook("PAY-XXXXXXXXXXXX");
var result = await WirecardClient.Notification.ListWebhooks();
Ao configurar suas PreferĂȘncias de Notificação vocĂȘ deve receber os webhooks em formato JSON e vocĂȘ pode desserializar.
var json = "{ \"date\": \"\", \"env\": \"\", ... }";
var result = Utilities.DeserializeWebHook(json);
Veja um exemplo do webhook aqui.
var body = new BankAccountRequest
{
bankNumber = "237",
agencyNumber = "12345",
agencyCheckNumber = "0",
accountNumber = "12345678",
accountCheckNumber = "7",
type = "CHECKING",
holder = new Holder
{
taxDocument = new Taxdocument
{
type = "CPF",
number = "622.134.533-22"
},
fullname = "Demo Wirecard"
}
};
string accesstoken = "XXXXXXXXXXXXXXXXXXXXXXXXXXX_v2"; // accesstoken do recebedor
var result = await WirecardClient.BankAccount.Create(body, accesstoken, "MPA-XXXXXXXXXXXX");
string accesstoken = "XXXXXXXXXXXXXXXXXXXXXXXXXXX_v2"; // accesstoken do recebedor
var result = await WirecardClient.BankAccount.Consult(accesstoken, "BKA-XXXXXXXXXXXX");
string accesstoken = "XXXXXXXXXXXXXXXXXXXXXXXXXXX_v2"; // accesstoken do recebedor
var result = await WirecardClient.BankAccount.List(accesstoken, "MPA-XXXXXXXXXXXX");
string accesstoken = "XXXXXXXXXXXXXXXXXXXXXXXXXXX_v2"; // accesstoken do recebedor
var result = await WirecardClient.BankAccount.Delete(accesstoken, "BKA-XXXXXXXXXXXX");
var body = new BankAccountRequest
{
//informe os campos aqui
};
string accesstoken = "XXXXXXXXXXXXXXXXXXXXXXXXXXX_v2"; // accesstoken do recebedor
var result = await WirecardClient.BankAccount.Update(body, accesstoken, "BKA-XXXXXXXXXXXX");
var result = await WirecardClient.Balance.Consult();
var result = await WirecardClient.Launch.Consult("ENT-XXXXXXXXXXXX");
var result = await WirecardClient.Launch.List();
string filtros = "filters=status::in(SETTLED)";
var result = await WirecardClient.Launch.ListFilter(filtros);
var body = new TransferRequest
{
//informe os campos aqui
};
string accessToken = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx_v2";
var result = await WirecardClient.Transfer.Create(body, accessToken);
string accessToken = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx_v2";
var result = await WirecardClient.Transfer.Revert("TRA-XXXXXXXXXXXX", accessToken);
string accessToken = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx_v2";
var result = await WirecardClient.Transfer.Consult("TRA-XXXXXXXXXXXX", accessToken);
var result = await WirecardClient.Transfer.List();
string filtros = "filters=transferInstrument.method::in(MOIP_ACCOUNT)&limit=3&offset=0";
var result = await WirecardClient.Transfer.List();
var body = new RefundRequest
{
//informe os campos aqui
};
var result = await WirecardClient.Refund.RefundPayment(body, "PAY-XXXXXXXXXXXX");
var body = new RefundRequest
{
//informe os campos aqui
};
var result = await WirecardClient.Refund.RefundRequestCreditCard(body, "ORD-XXXXXXXXXXXX");
var result = await WirecardClient.Refund.Consult("REF-XXXXXXXXXXXX");
var result = await WirecardClient.Refund.ListPayments("PAY-XXXXXXXXXXXX");
var result = await WirecardClient.Refund.ListOrders("ORD-XXXXXXXXXXXX");
var result = await WirecardClient.Conciliation.GetSalesFile("20180829"); // Data no formato YYYYMMDD
var result = await WirecardClient.Conciliation.GetFinancialFile("2018-08-29"); // Data no formato YYYY-MM-DD
As vezes vocĂȘ enfrenta um problema e o suporte Wirecard pede o cĂłdigo json para verificar se realmente estĂĄ no json:
using Newtonsoft.Json;
var body = new PaymentRequest
{
//informe os campos aqui
DelayCapture = true,
InstallmentCount = 1,
FundingInstrument = new Fundinginstrument
{
Method = "CREDIT_CARD",
CreditCard = new Creditcard
{
Id = "CRC-XXXXXXXXXXXX",
Cvc = "123",
Holder = new Holder
{
FullName = "Jose Portador da Silva",
BirthDate = "1988-12-30",
TaxDocument = new Taxdocument
{
Type = "CPF",
Number = "33333333333"
}
}
}
}
};
//Aqui vocĂȘ pode obter json e compratilhar para suporte Wirecard
string json = JsonConvert.SerializeObject(body, Formatting.Indented);
Veja como ficou na variĂĄvel json:
{
"installmentCount": 1,
"delayCapture": true,
"fundingInstrument": {
"method": "CREDIT_CARD",
"creditCard": {
"id": "CRC-XXXXXXXXXXXX",
"cvc": "123",
"holder": {
"fullname": "Jose Portador da Silva",
"birthdate": "1988-12-30",
"taxDocument": {
"type": "CPF",
"number": "33333333333"
}
}
}
}
}
Nome | Tipo | Descrição |
---|---|---|
limit | int | Quantidade de registros por busca (pĂĄgina). O valor default Ă© 20 |
offset | int | Registro a partir do qual a busca vai retornar. O valor default Ă© 0 |
gt(x) | number or date | Maior que - âGreater Thanâ |
ge(x) | number or date | Maior ou igual - âGreater than or Equalâ |
lt(x) | number or date | Menor que - âLess Thanâ |
le(x) | number or date | Menor ou igual - âLess than or Equalâ |
bt(x,y) | string | Entre - âBetweenâ |
in(x,yâŠz) | string | Em - âINâ |
q | Consulta um valor em especĂfico |
â Fazendo uma busca com os seguintes requisitos:
+ TransaçÔes de valores entre 5000 e 10000 (em centavos);
+ Formas de pagamento: Cartão de Crédito e Boleto;
+ Cliente com o nome jose silva;
+ Retornando 3 resultados.
GET https: //sandbox.moip.com.br/v2/orders?q=jose silva &filters=status::in(PAID,WAITING)|paymentMethod::in(CREDIT_CARD,BOLETO) |value::bt(5000,10000)&limit=3&offset=0
VocĂȘ pode tambĂ©m fazer uma busca por pedidos dentro de um intervalo de tempo:
GET https: //sandbox.moip.com.br/v2/orders?filters=createdAt::bt(2017-10-10T13:07:00Z,2017-10-25T13:08:00Z)
VocĂȘ pode recuperar os atributos code
, path
, description
, message
e error
, veja no exemplo abaixo:
using WirecardCSharp.Exception;
try
{
var result = await WC.Customer.Create(new CustomerRequest());
}
catch (WirecardException ex)
{
var t = ex.wirecardError;
var t_text = ex.GetExceptionText();
}
Nome | Descrição | Detalhe |
---|---|---|
code | CĂłdigo identificador do erro | string |
path | ParĂąmetro relacionado ao erro | string |
description | Descrição do erro | string |
message | Mensagem do retorno Wirecard | string |
Tem dĂșvidas? Fale com a gente no Slack! Algum problema ? Abre issues!