Created
September 23, 2017 01:43
-
-
Save synga/ea085e4f80122448634a66e2f51b7317 to your computer and use it in GitHub Desktop.
PagSeguro
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Collections; | |
using System.Collections.Generic; | |
using System.Data.Entity; | |
using System.Data.Entity.Infrastructure; | |
using System.IO; | |
using System.Linq; | |
using System.Net.Http; | |
using System.Net.Http.Headers; | |
using System.Threading.Tasks; | |
using System.Web.Http; | |
using System.Web.Http.Cors; | |
using System.Web.Http.Description; | |
using System.Xml; | |
using System.Xml.Serialization; | |
using WABiz.Edificare.API.Models; | |
namespace WABiz.Edificare.API.Controllers | |
{ | |
[EnableCors("*", "*", "*")] | |
public class PaymentController : ApiController | |
{ | |
private WABizEdificareAPIContext db = new WABizEdificareAPIContext(); | |
HttpClient client = new HttpClient(); | |
//Ambiente de Produção | |
string clientURI = "https://ws.pagseguro.uol.com.br"; | |
//Criar Sessão de pagamaento | |
[Route("getSession")] | |
public async Task<IHttpActionResult> getSession() | |
{ | |
client.BaseAddress = new Uri(clientURI); | |
client.DefaultRequestHeaders.Accept.Clear(); | |
//Ambiente de Produção | |
HttpResponseMessage response = await client.PostAsXmlAsync("v2/[email protected]&token=token_de_produçao", ""); | |
var xml = response.Content.ReadAsStringAsync().Result; | |
// Return Token | |
return Ok(xml); | |
} | |
//Pagamento | |
[Route("postCheckout")] | |
public async Task<IHttpActionResult> postCheckout(DadosPagamento dadosPagamento) | |
{ | |
client.BaseAddress = new Uri(clientURI); | |
// TUDO QUE PRECISA SER ENVIADO PARA REALIZAR O PAGAMENTO E MAIS UM POUCO | |
var content = new FormUrlEncodedContent(new[] | |
{ | |
new KeyValuePair<string, string>("token", "token_de_produçao"), | |
new KeyValuePair<string, string>("email", "[email protected]"), | |
new KeyValuePair<string, string>("senderEmail", dadosPagamento.senderEmail), | |
new KeyValuePair<string, string>("paymentMode", "default"), | |
new KeyValuePair<string, string>("paymentMethod", "creditCard"), | |
new KeyValuePair<string, string>("currency", "BRL"), | |
new KeyValuePair<string, string>("creditCardToken", dadosPagamento.creditCardToken), | |
new KeyValuePair<string, string>("senderHash", dadosPagamento.senderHash), | |
new KeyValuePair<string, string>("receiverEmail", "[email protected]"), | |
new KeyValuePair<string, string>("itemDescription1", dadosPagamento.itemDescription1), | |
new KeyValuePair<string, string>("itemId1", dadosPagamento.itemId1), | |
new KeyValuePair<string, string>("itemAmount1", dadosPagamento.itemAmount1), | |
new KeyValuePair<string, string>("itemQuantity1", dadosPagamento.itemQuantity1), | |
new KeyValuePair<string, string>("senderName", dadosPagamento.senderName), | |
new KeyValuePair<string, string>("senderCPF", dadosPagamento.senderCPF), | |
new KeyValuePair<string, string>("senderAreaCode", dadosPagamento.senderAreaCode), | |
new KeyValuePair<string, string>("senderPhone", dadosPagamento.senderPhone), | |
new KeyValuePair<string, string>("shippingAddressDistrict", dadosPagamento.shippingAddressDistrict), | |
new KeyValuePair<string, string>("shippingAddressCountry", dadosPagamento.shippingAddressCountry), | |
new KeyValuePair<string, string>("shippingAddressPostalCode", dadosPagamento.shippingAddressPostalCode), | |
new KeyValuePair<string, string>("shippingAddressCity", dadosPagamento.shippingAddressCity), | |
new KeyValuePair<string, string>("shippingAddressState", dadosPagamento.shippingAddressState), | |
new KeyValuePair<string, string>("shippingAddressStreet", dadosPagamento.shippingAddressStreet), | |
new KeyValuePair<string, string>("shippingAddressNumber", dadosPagamento.shippingAddressNumber), | |
new KeyValuePair<string, string>("shippingAddressComplement", dadosPagamento.shippingAddressComplement), | |
new KeyValuePair<string, string>("installmentValue", dadosPagamento.installmentValue), | |
new KeyValuePair<string, string>("installmentQuantity", dadosPagamento.installmentQuantity), | |
new KeyValuePair<string, string>("billingAddressStreet", dadosPagamento.billingAddressStreet), | |
new KeyValuePair<string, string>("billingAddressNumber", dadosPagamento.billingAddressNumber), | |
new KeyValuePair<string, string>("billingAddressComplement", dadosPagamento.billingAddressComplement), | |
new KeyValuePair<string, string>("billingAddressDistrict", dadosPagamento.billingAddressDistrict), | |
new KeyValuePair<string, string>("billingAddressPostalCode", dadosPagamento.billingAddressPostalCode), | |
new KeyValuePair<string, string>("billingAddressCity", dadosPagamento.billingAddressCity), | |
new KeyValuePair<string, string>("billingAddressState", dadosPagamento.billingAddressState), | |
new KeyValuePair<string, string>("billingAddressCountry", dadosPagamento.billingAddressCountry), | |
new KeyValuePair<string, string>("creditCardHolderName", dadosPagamento.creditCardHolderName), | |
new KeyValuePair<string, string>("creditCardHolderBirthDate", dadosPagamento.creditCardHolderBirthDate), | |
new KeyValuePair<string, string>("creditCardHolderCPF", dadosPagamento.creditCardHolderCPF), | |
new KeyValuePair<string, string>("creditCardHolderAreaCode", dadosPagamento.creditCardHolderAreaCode), | |
new KeyValuePair<string, string>("creditCardHolderPhone", dadosPagamento.creditCardHolderPhone), | |
}); | |
var result = client.PostAsync("v2/transactions", content).Result; | |
string resultContent = result.Content.ReadAsStringAsync().Result; | |
return Ok(resultContent); | |
} | |
// VAI SER USADO PARA DEVOLVER TODOS OS DADOS DA COMPRA. | |
[Route("CheckPaymentData/{code}")] | |
public async Task<string> CheckPaymentData(string code) | |
{ | |
db.Configuration.ProxyCreationEnabled = false; | |
client.BaseAddress = new Uri(clientURI); | |
client.DefaultRequestHeaders.Accept.Clear(); | |
//Ambiente de Produção | |
HttpResponseMessage response = await client.GetAsync("v2/transactions/" + code + "[email protected]&token=token_de_producao"); | |
var xml = response.Content.ReadAsStringAsync().Result; | |
return xml; | |
} | |
// PASSA O CODIGO E PAGAMENTO E DEVOLVE SE ESTÁ PAGO OU NÃO. | |
[Route("ValidatePayment/{codePayment}")] | |
public async Task<bool> ValidatePayment(string codePayment) | |
{ | |
db.Configuration.ProxyCreationEnabled = false; | |
client.BaseAddress = new Uri(clientURI); | |
client.DefaultRequestHeaders.Accept.Clear(); | |
//Ambiente de Produção | |
HttpResponseMessage response = await client.GetAsync("v2/transactions/" + codePayment + "[email protected]&token=token_de_producao"); | |
var xml = response.Content.ReadAsStringAsync().Result; | |
XmlDocument doc = new XmlDocument(); | |
doc.LoadXml(xml); | |
var statusXml = doc.DocumentElement.SelectSingleNode("status").InnerText; | |
var responseStatus = ""; | |
var detailStatus = ""; | |
switch (statusXml) | |
{ | |
case "1": | |
responseStatus = "Aguardando pagamento"; | |
detailStatus = "O comprador iniciou a transação, mas até o momento o PagSeguro não recebeu nenhuma informação sobre o pagamento."; | |
break; | |
case "2": | |
responseStatus = "Em análise"; | |
detailStatus = "O comprador optou por pagar com um cartão de crédito e o PagSeguro está analisando o risco da transação."; | |
break; | |
case "3": | |
// Ativa o plano do assinate | |
responseStatus = "Pago"; | |
detailStatus = "A transação foi paga pelo comprador e o PagSeguro já recebeu uma confirmação da instituição financeira responsável pelo processamento."; | |
break; | |
case "4": | |
responseStatus = "Disponível"; | |
detailStatus = "A transação foi paga e chegou ao final de seu prazo de liberação sem ter sido retornada e sem que haja nenhuma disputa aberta."; | |
break; | |
case "5": | |
responseStatus = "Em disputa"; | |
detailStatus = "O comprador, dentro do prazo de liberação da transação, abriu uma disputa."; | |
break; | |
case "6": | |
responseStatus = "Devolvida"; | |
detailStatus = "O valor da transação foi devolvido para o comprador."; | |
break; | |
case "7": | |
responseStatus = "Cancelada"; | |
detailStatus = "A transação foi cancelada sem ter sido finalizada."; | |
break; | |
case "8": | |
responseStatus = "Debitado"; | |
detailStatus = "O valor da transação foi devolvido para o comprador."; | |
break; | |
case "9": | |
responseStatus = "Retenção"; | |
detailStatus = "O comprador contestou o pagamento junto à operadora do cartão de crédito ou abriu uma demanda judicial ou administrativa(Procon)."; | |
break; | |
default: | |
responseStatus = "Ocorreu um erro"; | |
break; | |
} | |
await refreshPlaneSubscriber(codePayment, int.Parse(statusXml)); | |
if (int.Parse(statusXml) < 3) | |
{ | |
return false; | |
} | |
else | |
{ | |
return true; | |
} | |
} | |
[Route("StatuSubscriberPlane/{userId}")] | |
[HttpGet] | |
public async Task<IHttpActionResult> statusSubscriberPlane(int userId) | |
{ | |
SubscriberPlane subscriber = await db.SubscriberPlanes.SqlQuery("SELECT * FROM [dbo].[SubscriberPlanes] WHERE [dbo].[SubscriberPlanes].[userId] = '" + userId + "' AND Activate = 1").FirstOrDefaultAsync(); | |
if (subscriber != null) | |
{ | |
if (subscriber.ExpirationPlane > DateTime.Now) | |
{ | |
// Calculo de Crédito do assinante = valor da Assinatura - ((dias de assinatura - dias restastes) * (valor da assinatura / dias de assinatura)) | |
decimal daysSubscription = (int)(subscriber.ExpirationPlane.Subtract(subscriber.StartPlane).TotalDays); | |
decimal remanaingDays = (int)(subscriber.ExpirationPlane.Subtract(DateTime.Today).TotalDays); | |
decimal valueSubscriber = subscriber.Credit; | |
decimal calcCredit = valueSubscriber - ((daysSubscription - remanaingDays) * (valueSubscriber / daysSubscription)); | |
// Id do plano Ativo | |
return Ok(new { code = 1, status = "Plano Ativo", subscriber, credit = calcCredit }); | |
} | |
else | |
{ | |
//Plano Expirado | |
return Ok(new { code = 3, status = "Plano Expirado", subscriber }); | |
} | |
} | |
else | |
{ | |
SubscriberPlane subscriberPlanes = await db.SubscriberPlanes.SqlQuery("SELECT * FROM [dbo].[SubscriberPlanes] WHERE [dbo].[SubscriberPlanes].[userId] = '" + userId + "' AND StatusPayment < 3").FirstOrDefaultAsync(); | |
if (subscriberPlanes != null) | |
{ | |
//Plano aguardando pagamento | |
return Ok(new { code = 2, status = "Aguardando Pagamento", subscriberPlanes }); | |
} | |
else | |
{ | |
//Sem assinatura | |
return Ok(new { code = 0, status = "Assinatura Free" }); | |
} | |
} | |
} | |
} | |
public class DadosPagamento | |
{ | |
public string creditCardToken { get; set; } | |
public string senderHash { get; set; } | |
public string itemDescription1 { get; set; } | |
public string itemId1 { get; set; } | |
public string itemAmount1 { get; set; } | |
public string itemQuantity1 { get; set; } | |
public string senderName { get; set; } | |
public string senderEmail { get; set; } | |
public string senderCPF { get; set; } | |
public string senderAreaCode { get; set; } | |
public string senderPhone { get; set; } | |
public string shippingAddressDistrict { get; set; } | |
public string shippingAddressCountry { get; set; } | |
public string shippingAddressPostalCode { get; set; } | |
public string shippingAddressCity { get; set; } | |
public string shippingAddressState { get; set; } | |
public string shippingAddressStreet { get; set; } | |
public string shippingAddressNumber { get; set; } | |
public string shippingAddressComplement { get; set; } | |
public string installmentValue { get; set; } | |
public string installmentQuantity { get; set; } | |
public string billingAddressStreet { get; set; } | |
public string billingAddressNumber { get; set; } | |
public string billingAddressComplement { get; set; } | |
public string billingAddressDistrict { get; set; } | |
public string billingAddressPostalCode { get; set; } | |
public string billingAddressCity { get; set; } | |
public string billingAddressState { get; set; } | |
public string billingAddressCountry { get; set; } | |
public string creditCardHolderName { get; set; } | |
public string creditCardHolderBirthDate { get; set; } | |
public string creditCardHolderCPF { get; set; } | |
public string creditCardHolderAreaCode { get; set; } | |
public string creditCardHolderPhone { get; set; } | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment