Holen Sie raw-post-Anforderung in einer ApiController

Ich versuche, die Implementierung eines Paypal Instant Payment Notification (IPN)

Den Protokoll ist

  1. PayPal HTTP-POSTs Ihre Zuhörer eine IPN-Nachricht, die Sie benachrichtigt von einer Veranstaltung.
  2. Der listener Rückgabe eines leeren HTTP 200-Antwort zu PayPal.
  3. Listener HTTP-POSTs die vollständige, unveränderte Nachricht zurück, um
    PayPal; die Meldung muss enthalten die gleichen Felder (in der gleichen Reihenfolge)
    wie die ursprüngliche Nachricht, die kodiert werden, in der gleichen Weise wie die
    ursprüngliche Nachricht.
  4. PayPal sendet ein einzelnes Wort zurück - entweder VERIFIZIERT (wenn die Nachricht
    mit dem original übereinstimmt) oder UNGÜLTIG (wenn die Meldung entspricht nicht der
    original).

Bisher habe ich

        [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/cgi-bin/webscr";

            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.PostAsync("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;
        }

Mein problem ist, ich kann nicht herausfinden, wie Sie senden Sie das original-Anfrage an Paypal mit den Parametern in der gleichen Reihenfolge.
Ich konnte bauen ein HttpContent mit meinem PaypalIPNBindingModel aber ich kann keine Garantie für die Reihenfolge.

Gibt es eine Möglichkeit, ich könnte dies erreichen?

Danke

  • Ist es nicht möglich, Sie zu empfangen, wie eine Zeichenfolge von PayPal, dann können Sie Deserialisieren es sich, tun, was Sie tun müssen, um ihn zu bestätigen, dann POST die Zeichenfolge, die Sie wieder zurück geschickt?
  • Danke, ja ich denke, aber ich dachte, es wäre eleganter, um die Bindung Modell aus asp.net aber wenn es keine andere Möglichkeit gibt, werde ich tun Deserialisieren mich.
InformationsquelleAutor Marc | 2014-10-30
Schreibe einen Kommentar