Exemplo n.º 1
0
        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));
        }
Exemplo n.º 2
0
        /// <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);
            }
        }