¿Hay alguna muestra para PayPal IPN?

Tengo un proyecto Asp.Net WEB API 2 y me gustaría implementar un controlador de escucha de Notificación de pago instantánea (IPN).

No puedo encontrar ningún ejemplo y paquete nuget. Todo lo que necesito es reconocer que el usuario pagó con el botón html estándar en Paypal. Es bastante simple.

Todos los paquetes nuget son para crear una factura o un botón personalizado. No es lo que necesito

Las muestras en paypal son para asp.net clásico y no para MVC o WEB API MVC

Estoy seguro de que alguien ya lo hizo y cuando comencé a codificar tuve la sensación de que estaba reinventando la rueda.

¿Hay algún ejemplo de controlador de escucha IPN?

Al menos un PaypalIPNBindingModel para vincular la consulta de Paypal.

    [Route("IPN")]
    [HttpPost]
    public IHttpActionResult IPN(PaypalIPNBindingModel model)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest();
        }

        return Ok();
    }

EDITAR

Hasta ahora tengo el siguiente 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;
        }

pero para el paso 3 intenté publicar mi modelo como json pero paypal devuelve una página HTML en lugar de VALIDADA o NO VÁLIDA. Descubrí que tengo que usarapplication/x-www-form-urlencoded y los parámetros deben estar en el mismo orden.

¿Cómo puedo obtener la URL de solicitud?

Usaría la consulta Url y agregaría&cmd=_notify-validate lo

Respuestas a la pregunta(5)

Su respuesta a la pregunta