Holen Sie raw-post-Anforderung in einer ApiController
Ich versuche, die Implementierung eines Paypal Instant Payment Notification (IPN)
Den Protokoll ist
- PayPal HTTP-POSTs Ihre Zuhörer eine IPN-Nachricht, die Sie benachrichtigt von einer Veranstaltung.
- Der listener Rückgabe eines leeren HTTP 200-Antwort zu PayPal.
- 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. - 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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Glaube ich, sollten Sie nicht verwenden Sie den parameter-Bindung und Lesen Sie einfach die raw-Anfrage selbst. Anschließend können Sie Deserialisieren in das Modell selbst. Alternativ, wenn Sie möchten nutzen Sie die Web-API ' s Modell binden und gleichzeitig den Zugriff auf die raw-request-body, hier ist ein Weg, wie ich denken konnte.
Wenn Web-API bindet den request-body in der parameter, der request-body stream geleert wird. Anschließend können Sie ihn wieder Lesen.
So, Sie Lesen müssen, um den Körper vor dem Modell der Bindung läuft in Web API pipeline. Wenn Sie erstellen Sie eine message-handler, können Sie bereit der Körper es und speichern Sie es in den Eigenschaften Wörterbuch des request-Objekts.
Dann von der Steuerung abgerufen werden können die Körper-Zeichenfolge, wie dieses. An dieser Stelle haben Sie die raw-request-body als auch die parameter-Modell gebunden.