public async Task <ActionResult> InitStall(int id) { try { var stall = Models.Stall.FindById(id, _db); if (stall == null) { StallApplication.BizErrorFormat("stall {0} not exist", id); return(View("Error")); } if (!stall.UserId.Equals(CurrentUser.Id)) { StallApplication.BizErrorFormat("user id not match {0} <> {1}", stall.UserId, CurrentUser.Id); return(View("Error")); } var initResult = await stall.Init(); if (initResult.Succeeded) { return(RedirectToAction("Index")); } else { StallApplication.BizErrorFormat("Failed to init stall, {0}", initResult.Message); return(View("Error")); } } catch (Exception ex) { StallApplication.BizError("Failed to init stall", ex); return(View("Error")); } }
public async Task <ActionResult> WeChatMpLoginCallback(string returnUrl) { var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync(); if (loginInfo == null) { StallApplication.BizErrorFormat("[MSG]failed to get login info"); return(View("Error")); } // Sign in the user with this external login provider if the user already has a login var result = await SignInManager.ExternalSignInAsync(loginInfo, isPersistent : false); switch (result) { case SignInStatus.Success: StallApplication.SysInfoFormat(string.Format("[MSG]signIn succeed, redirec to {0}", returnUrl)); return(Redirect(returnUrl)); case SignInStatus.LockedOut: return(View("Lockout")); case SignInStatus.RequiresVerification: return(RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = false })); case SignInStatus.Failure: default: // If the user does not have an account, then prompt the user to create an account ViewBag.ReturnUrl = returnUrl; ViewBag.LoginProvider = loginInfo.Login.LoginProvider; GreenspotUser user = new GreenspotUser() { UserName = "" }; var rslt = await UserManager.CreateAsync(loginInfo, user); if (rslt.Succeeded) { await SignInManager.SignInAsync(user, isPersistent : false, rememberBrowser : false); return(Redirect(returnUrl)); } return(Redirect(returnUrl)); } }
public ActionResult PxPay(int id) { string paidFlag = Request["paid"]; if (paidFlag == null) { StallApplication.SysError("[MSG]pxpay callback without paid parameter"); return(View("Error")); } StallApplication.SysInfoFormat("[MSG]PxPay call back [{0}]:{1}", paidFlag, Request.Url.ToString()); bool isSuccess = "SUCCESS".Equals(paidFlag.ToUpper()); string payResultId = Request["result"]; if (string.IsNullOrEmpty(payResultId)) { StallApplication.SysError("[MSG]pxpay callback without result id"); return(View("Error")); } int paymentId = 0; if (!Accountant.VerifyPxPayPayment(payResultId, isSuccess, out paymentId)) { StallApplication.BizErrorFormat("[MSG]PxPay not verified, result id={0}", payResultId); return(View("Error")); } if (paymentId != id) { StallApplication.BizErrorFormat("[MSG]transaction not matched, px {0} <> url {1}", paymentId, id); return(View("Error")); } if (isSuccess) { if (StallApplication.IsPaymentOperating(paymentId)) { StallApplication.BizErrorFormat("[MSG]payment {0} is operating", paymentId); return(Redirect("/customer/orders")); } //set order as paid var orders = Models.Order.FindByPaymentId(paymentId, _db); foreach (var order in orders) { if (!order.HasPaid) { try { order.HasPaid = true; _db.SaveChanges(); //notify var openIds = new List <string>(); //owner var owner = UserManager.FindById(order.Stall.UserId); var ownerId = owner?.SnsInfos[WeChatClaimTypes.OpenId].InfoValue; openIds.Add(ownerId); //delivery man var deliveryMen = Models.User.GetByRole(_db, "DeliveryMan"); foreach (var d in deliveryMen) { var dId = d.SnsInfos.FirstOrDefault(x => WeChatClaimTypes.OpenId.Equals(x.InfoKey))?.InfoValue; if (!string.IsNullOrEmpty(dId)) { openIds.Add(dId); } } //await order.Notify(_db, openId); HostingEnvironment.QueueBackgroundWorkItem(x => order.Notify(_db, openIds)); } catch (Exception ex) { StallApplication.SysError($"[MSG]failed to save order {order.Id}", ex); } } } StallApplication.RemoveOperatingPayment(paymentId); return(Redirect("/customer/orders?act=paid")); } else { return(Redirect("/errorpage/payfailed")); } }
/// <summary> /// verify px payment match transaction /// if pay success set transaction as paid /// </summary> /// <param name="resultId"></param> /// <param name="isSuccess"></param> /// <returns></returns> public static bool VerifyPxPayPayment(string resultId, bool isSuccess, out int outPaymentId) { outPaymentId = 0; try { //check response StallApplication.BizInfoFormat("[ACCOUNTANT-PXPAY]start to get pxpay payment result={0}", resultId); ResponseOutput output = _pxPay.ProcessResponse(resultId); if (output == null) { StallApplication.BizError("[ACCOUNTANT-PXPAY]can not get pxpay payment result - resposne is null"); return(false); } if (!(isSuccess ? "1" : "0").Equals(output.Success)) { StallApplication.BizErrorFormat("[ACCOUNTANT-PXPAY]payment result not match except {0} - actual {1}", output.Success, isSuccess); StallApplication.BizErrorFormat("[ACCOUNTANT-PXPAY]{0}", output); return(false); } //set payment int paymentId = int.Parse(output.TxnId.Split('-')[0]); decimal amount = decimal.Parse(output.AmountSettlement); using (StallEntities db = new StallEntities()) { Payment payment = db.Payments.FirstOrDefault(o => o.Id == paymentId); if (payment == null) { StallApplication.BizErrorFormat("[ACCOUNTANT-PXPAY]payment {0} can not mactch payment {1}", resultId, outPaymentId); StallApplication.BizErrorFormat("[ACCOUNTANT-PXPAY]{0}", output); return(false); } payment.ResponseTime = DateTime.Now; outPaymentId = paymentId; bool result = true; if (!isSuccess) { //pay fail StallApplication.BizErrorFormat("[ACCOUNT-PAPAY]pay failed payment id={0}", payment.Id); } else { //pay success if (payment.Amount != amount) { StallApplication.BizErrorFormat("[ACCOUNT-PAPAY]pxpay amount {0} <> transaction amount {1}", amount, payment.Amount); result = false; } else { payment.HasPaid = true; } } payment.PxPayResponse = output.ToString(); db.SaveChanges(); return(result); } } catch (Exception ex) { StallApplication.SysError("can not get pxpay payment result", ex); return(false); } }