ASP.NET MVC - переменные сеанса в обратном вызове от сервера метод ActionResult имеют значение null - PullRequest
0 голосов
/ 25 сентября 2018

Я использую CoinPayments IPN в своем приложении, и у меня возникают проблемы с передачей данных в метод, который принимает их Обратный вызов.Я пытался, как и все, что мог найти: TempData, SessionVariables, пытался реализовать его где-нибудь в формах и, возможно, запросить его, но это не сработало для меня.Поэтому я также попытался реализовать это с помощью глобальных статических переменных.И это сработало!Но затем возникла другая проблема: если более чем один пользователь покупал что-то на веб-сайте одновременно или даже между любыми обратными вызовами, их данные смешивались.Итак, я снова пытаюсь заставить переменные сеанса работать и понятия не имею, почему они не работают, как я их использовал раньше.Вероятно, я могу думать о том, что, поскольку это обратный вызов от CoinPayments, и я что-то неправильно обрабатываю.

Вот код, который у меня есть прямо сейчас: То есть я пробовал разные варианты, такие как реализация Session в методе Get Payment.Теперь я закончил с этим, и он по-прежнему имеет значение null в POST METHOD.

Класс для обработки переменных сеанса:

 public static class MyGlobalVariables
    {
        public static int TokenChoice
        {
            get
            {
                if (System.Web.HttpContext.Current.Session["TokenChoice"] == null)
                {
                    return -1;
                }
                else
                {
                    return (int)System.Web.HttpContext.Current.Session["TokenChoice"];
                }
            }
            set
            {
                System.Web.HttpContext.Current.Session["TokenChoice"] = value;
            }
        }
        public static int PaymentChoice
        {
            get
            {
                if (System.Web.HttpContext.Current.Session["PaymentChoice"] == null)
                {
                    return -1;
                }
                else
                {
                    return (int)System.Web.HttpContext.Current.Session["PaymentChoice"];
                }
            }
            set
            {
                System.Web.HttpContext.Current.Session["PaymentChoice"] = value;
            }
        }
        public static string CurrentUser
        {
            get
            {
                System.Web.HttpContext.Current.Session["CurrentUser"] = System.Web.HttpContext.Current.User.Identity.Name;
                return (string)System.Web.HttpContext.Current.Session["CurrentUser"];
            }
        }

    }

Класс, который возвращает представление, когда вы нажимаете кнопку CoinPayments:

 public ActionResult Payment(int tokenChoice, int paymentChoice)
    {

        ViewBag.Payment = paymentChoice;
        MyGlobalVariables.PaymentChoice = paymentChoice;
        MyGlobalVariables.TokenChoice = tokenChoice;

        return View();
    }

Класс обратного вызова, который обрабатывает обратный вызов из CoinPayments:

  [HttpPost]
    public ActionResult Payment()
    {
        NameValueCollection nvc = Request.Form;


        var merchant_id = id;
            var ipn_secret = secret;
        var order_total = MyGlobalVariables.PaymentChoice;

            if (String.IsNullOrEmpty(nvc["ipn_mode"]) || nvc["ipn_mode"] != "hmac")
            {
                Trace.WriteLine("IPN Mode is not HMAC");
                return View();
            }

            if (String.IsNullOrEmpty(HTTP_HMAC))
            {
                Trace.WriteLine("No HMAC signature sent");
                return View();
            }

            if (String.IsNullOrEmpty(nvc["merchant"]) || nvc["merchant"] != merchant_id.Trim())
            {
                Trace.WriteLine("No or incorrect Merchant ID passed");
                return View();
            }

            //var hmac = hash_hmac("sha512", request, ipn_secret.Trim());

            var txn_id = nvc["txn_id"]; 
            var item_name = nvc["item_name"]; 
            var item_number = nvc["item_number"];
            var amount1 = nvc["amount1"];
            var amount2 = float.Parse(nvc["amount2"], CultureInfo.InvariantCulture.NumberFormat);
            var currency1 = nvc["currency1"];
            var currency2 = nvc["currency2"];
            var status = Convert.ToInt32(nvc["status"]);
            var status_text = nvc["status_text"];
            Trace.WriteLine(status);
            if (currency1 != "USD") {
                Trace.WriteLine("Original currency mismatch!");
                return View();
            }

        if (Convert.ToInt32(amount1) < Convert.ToInt32(order_total))
        {
            Trace.WriteLine("Amount is less than order total!");
            return View();
        }

        if (status >= 100 || status == 2) {

                using (MyDatabaseEntities1 dc = new MyDatabaseEntities1())
                {
                var account = dc.Users.Where(a => a.Username == MyGlobalVariables.CurrentUser).FirstOrDefault();
                if (account != null && account.Paid == 0)
                {
                    Trace.WriteLine("Payment Completed");
                    Trace.WriteLine("Tokens to add: " + MyGlobalVariables.TokenChoice);
                    account.Tokens += MyGlobalVariables.TokenChoice;
                    account.Paid = 1;
                    dc.Configuration.ValidateOnSaveEnabled = false;
                    dc.SaveChanges();
                }
                }
              } else if (status < 0)
            {
                Trace.WriteLine(
                    "payment error, this is usually final but payments will sometimes be reopened if there was no exchange rate conversion or with seller consent");
            } else {
            using (MyDatabaseEntities1 dc = new MyDatabaseEntities1())
            {
                var account = dc.Users.Where(a => a.Username == MyGlobalVariables.CurrentUser).FirstOrDefault();
                if (account != null)
                {
                    account.Paid = 0;
                    dc.Configuration.ValidateOnSaveEnabled = false;
                    dc.SaveChanges();
                }
            }
            Trace.WriteLine("Payment is pending");
            }

        return View();
    }

Как видите, мне нужно обработать только 3 переменные.Также кто-то может спросить, почему я использую переменную сеанса для Current.User?Ну, по какой-то причине метод обратного вызова не может прочитать Current.User, поскольку он возвращает ноль.И хорошо ... ничего действительно не изменилось, как сейчас.

Если вы когда-либо сталкивались с чем-то подобным или можете найти проблему, я был бы так благодарен, так как потратил на это уже более 2 дней.

РЕДАКТИРОВАТЬ: После некоторого тестирования я обнаружил, что переменные работают нормально, если я запускаю метод Post самостоятельно.Так что проблема в обработке обратного вызова из CoinPayments.Есть ли конкретный способ справиться с этим?

...