示例#1
0
        public async Task <string> ProcessCardcomTransaction()
        {
            #region ### IPN Parameters ###

            /*
             *  GET https://localhost:44373/Purchase/ProcessCardcomTransaction?terminalnumber=1000&lowprofilecode=2467a885-1f97-40d5-8b5f-42222ce64c80&Operation=2&DealRespone=0&DealResponse=0&TokenResponse=0&InvoiceResponseCode=0&OperationResponse=0&OperationResponseText=OK&ReturnValue=39.90%7c3%7c1%7c98F41F8F-6F6C-4A0A-A7D4-D719A41A6BD7
             *
             *  ---
             *
             *  terminalnumber=1000
             *  lowprofilecode=2467a885-1f97-40d5-8b5f-42222ce64c80
             *  Operation=2
             *  DealResponse=0
             *  TokenResponse=0
             *  InvoiceResponseCode=0
             *  OperationResponse=0
             *  OperationResponseText=OK
             *  ReturnValue=39.90|3|1|98F41F8F-6F6C-4A0A-A7D4-D719A41A6BD7
             */
            #endregion

            var step        = 0;
            var transaction = new Entities.Transaction();
            var httpResult  = "";

            var transactionsBLL = new TransactionsBLL();
            var ordersBLL       = new OrdersBLL();

            try
            {
                LoggerSingleton.Instance.Info("Cardcom", "Process-Transaction", new List <string> {
                    $"QueryString: {Request.QueryString}"
                });

                step = 1;

                var cardcomManager = new CardcomManager(ConfigSingleton.Instance.CardcomTerminal, ConfigSingleton.Instance.CardcomUserName);

                step = 2;

                // Collect basic details
                transaction.Raw            = Request.QueryString?.ToString();
                transaction.Code           = Request.QueryString["lowprofilecode"];
                transaction.StatusCode     = Convert.ToInt32(Request.QueryString["OperationResponse"]);
                transaction.StatusCodeCard = Convert.ToInt32(Request.QueryString["DealResponse"]);

                step = 3;

                if (transaction.StatusCode != 0)
                {
                    throw new Exception($"[StatusCode Error] StatusCode {transaction.StatusCode} ({transaction.Code})");
                }

                step = 4;

                // Collect extra details
                var detailsResponse = cardcomManager.GetTransactionDetails(transaction.Code);
                transaction.StatusCodeDetails = Convert.ToInt32(detailsResponse.Details["ResponseCode"]);
                transaction.RawDetails        = detailsResponse.Raw;

                step = 5;

                // add invoice details
                transaction.InvoiceStatusCode = Convert.ToInt32(detailsResponse.Details["InvoiceResponseCode"]);
                transaction.InvoiceNumber     = detailsResponse.Details["InvoiceNumber"] ?? "";
                transaction.InvoiceType       = Convert.ToInt32(detailsResponse.Details["InvoiceType"] ?? "0");

                step = 6;

                if (transaction.StatusCodeDetails != 0)
                {
                    throw new Exception($"[StatusCode Error] StatusCodeDetails {transaction.StatusCodeDetails} ({transaction.Code})");
                }

                step = 7;

                transaction.CardOwnerId = detailsResponse.Details["CardOwnerID"] ?? "";

                // fix format > MM (e.g: 7 to 07)
                var CardValidityMonth = detailsResponse.Details["CardValidityMonth"] ?? "";
                if (CardValidityMonth.Length == 1)
                {
                    CardValidityMonth = $"0{CardValidityMonth}";
                }

                transaction.CardExpiry    = $"{detailsResponse.Details["CardValidityYear"] ?? ""}{CardValidityMonth}";
                transaction.CardSuffix    = detailsResponse.Details["ExtShvaParams.CardNumber5"] ?? "";
                transaction.NumOfPayments = Convert.ToInt32(detailsResponse.Details["NumOfPayments"] ?? "1");

                step = 8;

                // load ReturnValue field > extract order-id
                var returnValue = detailsResponse.Details["ReturnValue"].Trim();
                var orderId     = Convert.ToInt32(returnValue);

                step = 9;

                // load related order
                var order = await ordersBLL.Get(orderId);

                step = 10;

                // Collect custom details
                transaction.Price   = order.Total;
                transaction.OrderId = order.Details.Id;

                step = 11;

                // update Order Status
                order.Details.Status = Entities.eOrderStatus.APPROVED;
                order.Details.IsPaid = true;
                var orderUpdated = await ordersBLL.SaveDetails(order.Details) > 0;

                if (!orderUpdated)
                {
                    LoggerSingleton.Instance.Info("Cardcom", "Save Order Details Failed", new List <string> {
                        $"#{orderId}", "Status: APPROVED", $"Code: {transaction.Code}"
                    });
                }

                step = 12;

                // send sms
                if (orderUpdated)
                {
                    SMSManager.OrderStatusChanged(order);
                }

                step = 13;

                httpResult = "OK";
            }
            catch (Exception ex)
            {
                ex.Data.Add("step", step);
                ex.Data.Add("Method", "ProcessCardcomTransaction");
                LoggerSingleton.Instance.Error("Cardcom", ex);
                httpResult = ex.Message;
            }

            try {
                // add a transaction
                var transactionId = await transactionsBLL.Create(transaction);

                if (transactionId <= 0)
                {
                    throw new Exception($"Error while trying to save an incoming transaction ({transaction.Code})");
                }
            }
            catch (Exception ex)
            {
                ex.Data.Add("Action", "CreateTransaction");
                ex.Data.Add("Method", "ProcessCardcomTransaction");
                LoggerSingleton.Instance.Error("Cardcom", ex);
                httpResult = ex.Message;
            }

            Response.StatusCode = httpResult == "OK" ? (int)HttpStatusCode.OK : (int)HttpStatusCode.InternalServerError;
            return(httpResult);
        }