public ActionResult Pay() { OperationResult <string> result = new OperationResult <string>(true); Stream req = Request.InputStream; req.Seek(0, System.IO.SeekOrigin.Begin); string json = new StreamReader(req).ReadToEnd(); Payment payment = null; try { IList <Product> outOfStocks; var orders = ConvertToOrders(json, out outOfStocks); if (outOfStocks.Count > 0) { result.Succeeded = false; result.Message = "Some Products are out of stock"; var sb = new StringBuilder("["); var comma = ""; foreach (var p in outOfStocks) { sb.Append(string.Format("{0}{{\"StallName\":\"{1}\",\"ProductName\":\"{2}\",\"Stock\":{3}}}", comma, p.Stall.StallName, p.BaseName, p.Stock)); comma = ","; } sb.Append("]"); result.ErrorType = "OutOfStock"; result.Data = sb.ToString(); return(Json(result, JsonRequestBehavior.AllowGet)); } using (var tran = _db.Database.BeginTransaction()) { //calc total amnount, orderIds decimal amount = 0.0M; foreach (var order in orders) { amount += order.ChargeAmount; } //create payment payment = Payment.CreatePayment(_db, amount); if (payment == null) { tran.Rollback(); result.Succeeded = false; result.Message = "fail to create payment"; return(Json(result, JsonRequestBehavior.AllowGet)); } //create order string orderIds = null; foreach (var order in orders) { order.PaymentId = payment.Id; order.IsPrintOrder = order.Stall.IsPrintOrder; if (!order.Save(_db)) { tran.Rollback(); result.Succeeded = false; result.Message = "fail to create order"; return(Json(result, JsonRequestBehavior.AllowGet)); } //get order id if (string.IsNullOrEmpty(orderIds)) { orderIds = order.Id.ToString(); } else { orderIds += "," + order.Id.ToString(); } } //update payment payment.OrderIds = orderIds; payment.Save(_db); //save tran.Commit(); } //return payment url string payUrl = null; string urlSuccess = string.Format("{0}/Customer/PxPay/{1}?paid=SUCCESS", GreenspotConfiguration.RootUrl, payment.Id); string urlFail = string.Format("{0}/Customer/PxPay/{1}?paid=FAIL", GreenspotConfiguration.RootUrl, payment.Id); try { payUrl = Accountant.GeneratePayURL(payment, urlFail, urlSuccess); StallApplication.BizInfoFormat("[PAY]go to payment url:{0}", payUrl); result.Data = payUrl; } catch (Exception ex) { StallApplication.SysError("[PAY]", ex); result.Succeeded = false; result.Message = "fail to generate payment url"; } } catch (Exception ex) { // Try and handle malformed POST body StallApplication.SysError("[PAY]", ex); result.Succeeded = false; result.Message = "fail to pay"; } return(Json(result, JsonRequestBehavior.AllowGet)); }
/// <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); } }