Не удается получить параметры Context.Request из Paypal IPN - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть небольшой фрагмент кода 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 не пусто, по крайней мере

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...