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

questionAnswers(5)

yourAnswerToTheQuestion