Obtenir raw post demande dans une ApiController
Je suis en train de mettre en œuvre un Paypal Notification Instantanée de Paiement (IPN)
La protocole est
- PayPal HTTP Postes de votre auditeur un IPN message vous informe d'un événement.
- Votre auditeur retourne un vide réponse HTTP 200 à PayPal.
- Votre port d'écoute HTTP Postes de l'ensemble de la inchangée message
PayPal; le message doit contenir les mêmes champs (dans le même ordre)
comme le message d'origine et être codés de la même manière que le
message d'origine. - PayPal envoie un unique mot de back - soit VÉRIFIÉE (si le message
correspond à l'original) ou INVALIDE (si le message ne correspond pas à la
d'origine).
Pour l'instant j'ai
[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;
}
Mon problème est que je n'arrive pas à comprendre comment envoyer l'original de la demande de Paypal avec les paramètres dans le même ordre.
J'ai pu développer un HttpContent
avec mon PaypalIPNBindingModel
mais je ne peux pas garantir l'ordre.
Est-il possible que je puisse atteindre son but?
Merci
Il n'est pas possible de le recevoir en tant que chaîne de PayPal, vous pouvez désérialiser vous-même, faire ce que vous devez faire pour le valider, puis de publier la chaîne renvoyée?
Merci, oui je pense, mais j'ai pensé qu'il serait plus élégant d'utiliser le modèle de liaisons de asp.net mais si il n'y a pas d'autre moyen, je vais faire désérialiser moi-même.
Merci, oui je pense, mais j'ai pensé qu'il serait plus élégant d'utiliser le modèle de liaisons de asp.net mais si il n'y a pas d'autre moyen, je vais faire désérialiser moi-même.
OriginalL'auteur Marc | 2014-10-30
Vous devez vous connecter pour publier un commentaire.
Je crois que vous ne devriez pas utiliser le paramètre de liaison et il suffit de lire les premières demander vous-même. Par la suite, vous pouvez désérialiser dans le modèle. Sinon, si vous voulez tirer parti de l'API Web de la liaison du modèle et dans le même temps, l'accès à la crue du corps de la requête, voici un moyen que je pouvais penser.
Lors de l'API Web lie le corps de la requête dans le paramètre, le corps de la requête de flux est vidé. Par la suite, vous ne pouvez pas lire de nouveau.
Donc, vous devez lire le corps avant de la liaison de modèle s'exécute dans l'API Web de pipeline. Si vous créez un gestionnaire de messages, vous pouvez préparer le corps et de le stocker dans le dictionnaire des propriétés de l'objet request.
Puis, à partir de contrôleur, vous pouvez récupérer le corps de la chaîne, comme cela. À ce stade, vous avez le raw du corps de la requête ainsi que le paramètre lié modèle.
Je suppose qu'il n'y a aucun moyen de lier des matières demande à un modèle manuellement?
Qu'entendez-vous par liaison premières demande à un modèle manuellement? Si vous voulez dire la création d'une instance de l'objet du modèle basé sur la demande brute, vous devez le faire vous-même. Je ne suis pas familier avec IPN, mais basé sur le type de contenu, vous avez à faire. Si il y a un hors de la zone de type de média formateur disponible, Web API ne sera que pour vous par le biais de la liaison.
J'ai fait une classe PaypalIPNBindingModel et le Web api permettant de le lier avec la demande paypal. Maintenant, depuis que j'utilise le raw string, puis-je lier manuellement à l'PaypalIPNBindingModel comme l'api, l'habitude de faire?
Merci, je suppose que je dois le faire moi-même
OriginalL'auteur Badri