У меня есть небольшой фрагмент кода C #, который должен запрашивать Paypal IPN, подтвердите платеж и получите некоторые параметры из запроса. Проблема в том, что я не могу получить эти параметры.
public class ipn : IHttpHandler {
protected string paypalUrl = "https://www.sandbox.paypal.com/cgi-bin/webscr";
public void ProcessRequest (HttpContext context) {
Task.Run(() => VerifyTask(context));
context.Response.Write("");
}
private void VerifyTask(HttpContext context)
{
var verificationResponse = string.Empty;
StreamReader reader = new StreamReader(context.Request.InputStream);
string requestFromPost = reader.ReadToEnd();
// at this point I am getting the request parameters correctly
File.WriteAllText(context.Server.MapPath("request.txt"), "Request: " + requestFromPost);
context.Request.InputStream.Position = 0;
try
{
// validating request here, all fine
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
var verificationRequest = (HttpWebRequest)WebRequest.Create(paypalUrl);
// set values for the verification request
verificationRequest.Method = "POST";
verificationRequest.ContentType = "application/x-www-form-urlencoded";
// add cmd=_notify-validate to the payload
var strRequest = "cmd=_notify-validate&" + requestFromPost;
verificationRequest.ContentLength = strRequest.Length;
// attach payload to the verification request
var streamOut = new StreamWriter(verificationRequest.GetRequestStream(), Encoding.ASCII);
streamOut.Write(strRequest);
streamOut.Close();
// send the request to PayPal and get the response
var streamIn = new StreamReader(verificationRequest.GetResponse().GetResponseStream());
verificationResponse = streamIn.ReadToEnd();
streamIn.Close();
}
catch ( Exception exception)
{
// handling exception here, later
}
// sending context and response
ProcessVerificationResponse(context, verificationResponse);
}
private void ProcessVerificationResponse(HttpContext context, string verificationResponse)
{
// verifications response is VERIFIED
if (verificationResponse.Equals("VERIFIED"))
{
try {
// trying to get payment status
File.WriteAllText(context.Server.MapPath("status.txt"), "Verified: " + context.Request.QueryString["payment_status"]);
}
catch ( Exception exception)
{
// capture exception for manual investigation
File.WriteAllText(context.Server.MapPath("error.txt"), "Error: " + exception.Message);
}
}
}
}
Исключение выдается, и создается файл error.txt с ошибкой «Ссылка на объект не установлена на экземпляр объекта». Это происходит независимо от того, что я делаю с context.Request
context.Request.QueryString.Count.ToString()
делает то же самое
context.Request["payment_status"]
context.Request.Params.Count.ToString()
вызывает то же исключение
поэтому я не знаю, что неинициализировано и почему, потому что context.Request.InputStream
не пусто, по крайней мере