Skip to content

Instantly share code, notes, and snippets.

@synga
Created September 23, 2017 01:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save synga/ea085e4f80122448634a66e2f51b7317 to your computer and use it in GitHub Desktop.
Save synga/ea085e4f80122448634a66e2f51b7317 to your computer and use it in GitHub Desktop.
PagSeguro
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/sessions?email=felippe@edificareapp.com.br&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", "felippe@edificareapp.com.br"),
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", "felippe@edificareapp.com.br"),
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=felippe@edificareapp.com.br&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=felippe@edificareapp.com.br&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