我有一个ASP MVC Web项目。为了出售产品,用户应注册或登录到我的网站。选择其产品后,用户将通过PaymandActy方法重定向到银行网关:
public String PaymentAction( TransAction Model )
{
try
{
Payment ob = new Payment();
Model.amount = 100000.ToString();
string result = ob.pay(Model.amount);
//, User.Identity.GetUserId()
/*
the result var is a string that contains the response from pay.ir/send
which contains: status, transId, errorCode, errorMessage and all things that
exist in JsonParameter
*/
JsonParameters Parmeters = JsonConvert.DeserializeObject<JsonParameters>(result);
// in this point the payment was successful and you can add info to your database
if ( Parmeters.status == 1 )
{
Response.Redirect("https://pay.ir/payment/gateway/" + Parmeters.transId);
}
else
{
return "error code : " + Parmeters.errorCode + "<br />" + "message " + Parmeters.errorMessage;
}
return "";
}
catch ( Exception exp )
{
return "error" + exp.Message;
}
}
付款后,用户通过以下URL重定向到我的网站:
http://www.mymvcapp.com/HelpMeToBuildMyExtraordinaryYear/VerifyPayment
这是verifypayment方法:
[HttpPost]
[AllowAnonymous]
public ActionResult VerifyPayment( VerifyResult Vresult )
{
try
{
if ( !string.IsNullOrEmpty(Request.Form["transId"]) )
{
Payment ob = new Payment();
string result = ob.verify(Request.Form["transId"].ToString());
JsonParameters Parmeters = JsonConvert.DeserializeObject<JsonParameters>(result);
if ( Parmeters.status == 1 )
{
var userId = User.Identity.GetUserId();
var user = db.Users.Where(u => u.Id == userId).FirstOrDefault();
user.SuccessfullPayment = true;
user.FactorNo = User.Identity.GetUserId();
user.TraceNo = Request.Form["traceNumber"];
user.TransId = int.Parse(Request.Form["transId"]);
user.CardNo = Request.Form["cardNumber"];
user.PurchasedDate = DateTime.Now;
user.State = Parmeters.status;
user.Message = Request.Form["message"];
db.Entry(user).State = System.Data.Entity.EntityState.Modified;
db.SaveChanges();
Vresult.success = true;
Vresult.TransActionID += Request.Form["transId"].ToString();
Vresult.Amount += Parmeters.amount.ToString();
Vresult.SuccessMessage = "successful payment";
return RedirectToAction("Index", "DownloadEbook", new { traceNumber = user.TraceNo , factorNumber = user.FactorNo, purchaseDate =Utils.Funcs.ObtainPersianDate( (DateTime)user.PurchasedDate ) });
}
else
{
Vresult.error = true;
Vresult.ErrorMessage = "error code " + Parmeters.errorCode + "<br />" + "Errr meesafe " + Parmeters.errorMessage;
}
}
}
catch ( Exception ex )
{
Vresult.error = true;
Vresult.ErrorMessage = ex.Source+"t"+ex.InnerException + "t" + ex.Message+"ERRR";
}
return View(new AllNeededModels() { VerifyResult = Vresult });
我们可以看到,必须登录用户才能完成销售过程。但是,在从银行重定向到上方的URL(verifyPay(之后,用户未登录,代码将返回null例外。问题是,从银行重定向到我的网站后,我应该如何保持用户登录?或者如何从cookie中获取用户并签署该用户?
在获取用户的过程中,问题是芳香的。我们应该使用此代码以获取用户:
var user = System.
Web.
HttpContext.
Current.
GetOwinContext().
GetUserManager<ApplicationUserManager>().
FindById(userId);
请注意,正确的方法如上所述。以下代码会产生问题。Donot使用它来获取当前用户:
var user = db.Users.Where(u => u.Id == userId).FirstOrDefault();