Existe alguma amostra para o IPN do PayPal
Eu tenho um projeto Asp.Net WEB API 2 e gostaria de implementar um controlador de ouvinte de notificação de pagamento instantâneo (IPN).
Não consigo encontrar nenhum exemplo e pacote de pepitas. Tudo o que preciso é reconhecer que o usuário pagou com o botão html padrão no Paypal. É bem simples
Todos os pacotes de pepitas são para criar fatura ou botão personalizado. Não é o que eu preciso
As amostras no paypal são para asp.net clássico e não para MVC ou WEB API MVC
Tenho certeza de que alguém já fez isso e, quando comecei a codificar, tive a sensação de que estava reinventando a roda.
Existe algum exemplo de controlador de ouvinte de IPN?
Pelo menos um PaypalIPNBindingModel para vincular a consulta Paypal.
[Route("IPN")]
[HttpPost]
public IHttpActionResult IPN(PaypalIPNBindingModel model)
{
if (!ModelState.IsValid)
{
return BadRequest();
}
return Ok();
}
EDITAR
Até agora eu tenho o seguinte código
[Route("IPN")]
[HttpPost]
public void IPN(PaypalIPNBindingModel model)
{
if (!ModelState.IsValid)
{
// if you want to use the PayPal sandbox change this from false to true
string response = GetPayPalResponse(model, true);
if (response == "VERIFIED")
{
}
}
}
string GetPayPalResponse(PaypalIPNBindingModel model, bool useSandbox)
{
string responseState = "INVALID";
// Parse the variables
// Choose whether to use sandbox or live environment
string paypalUrl = useSandbox ? "https://www.sandbox.paypal.com/"
: "https://www.paypal.com/";
using (var client = new HttpClient())
{
client.BaseAddress = new Uri(paypalUrl);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded"));
//STEP 2 in the paypal protocol
//Send HTTP CODE 200
HttpResponseMessage response = client.PostAsJsonAsync("cgi-bin/webscr", "").Result;
if (response.IsSuccessStatusCode)
{
//STEP 3
//Send the paypal request back with _notify-validate
model.cmd = "_notify-validate";
response = client.PostAsync("cgi-bin/webscr", THE RAW PAYPAL REQUEST in THE SAME ORDER ).Result;
if(response.IsSuccessStatusCode)
{
responseState = response.Content.ReadAsStringAsync().Result;
}
}
}
return responseState;
}
mas para a etapa 3, tentei postar meu modelo como json, mas o paypal retornará uma página HTML em vez de VALIDATED ou INVALID. Eu descobri que tenho que usarapplication/x-www-form-urlencoded
e são os parâmetros que estão na mesma ordem.
Como posso obter o URL da solicitação?
Eu usaria a consulta Url e adicionaria&cmd=_notify-validate
para isso