Я использую 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.Есть ли конкретный способ справиться с этим?