protected void PayRequestButton_Click(object sender, EventArgs e)
    {
        try
        {
            string result;

            BypassCertificateError();

            ir.shaparak.bpm.PaymentGatewayImplService bpService = new ir.shaparak.bpm.PaymentGatewayImplService();
            result = bpService.bpPayRequest(Int64.Parse(TerminalIdTextBox.Text),
                                            UserNameTextBox.Text,
                                            UserPasswordTextBox.Text,
                                            Int64.Parse(PayOrderIdTextBox.Text),
                                            Int64.Parse(PayAmountTextBox.Text),
                                            PayDateTextBox.Text,
                                            PayTimeTextBox.Text,
                                            PayAdditionalDataTextBox.Text,
                                            PayCallBackUrlTextBox.Text,
                                            Int64.Parse(PayPayerIdTextBox.Text));

            PayOutputLabel.Text = result;

            String[] resultArray = result.Split(',');
            if (resultArray[0] == "0")
            {
                ClientScript.RegisterStartupScript(typeof(Page), "ClientScript", "<script language='javascript' type='text/javascript'> postRefId('" + resultArray[1] + "');</script> ", false);
            }
        }
        catch (Exception exp)
        {
            PayOutputLabel.Text = "Error: " + exp.Message;
        }
    }
    protected void SettleRequestButton_Click(object sender, EventArgs e)
    {
        try
        {
            string result;

            BypassCertificateError();

            ir.shaparak.bpm.PaymentGatewayImplService bpService = new ir.shaparak.bpm.PaymentGatewayImplService();
            result = bpService.bpSettleRequest(Int64.Parse(TerminalIdTextBox.Text),
                                               UserNameTextBox.Text,
                                               UserPasswordTextBox.Text,
                                               Int64.Parse(SettleOrderIdTextBox.Text),
                                               Int64.Parse(SettleSaleOrderIdTextBox.Text),
                                               Int64.Parse(SettleSaleReferenceIdTextBox.Text));
            SettleOutputLabel.Text = result;
        }
        catch (Exception exp)
        {
            SettleOutputLabel.Text = "Error: " + exp.Message;
        }
    }
        /// <summary>
        ///
        /// </summary>
        /// <returns></returns>
        public ActionResult CallBack()
        {
            string comment;
            var    resCode = Request.Params["ResCode"];
            var    orderId = int.Parse(Request.Params["OrderId"] ?? "0");
            var    order   = _orderService.GetOrderById(orderId);

            #region [After Call Mellat WebService]
            if (!string.IsNullOrEmpty(Request.Params["RefId"]) &&
                !string.IsNullOrEmpty(Request.Params["saleOrderId"]) &&
                !string.IsNullOrEmpty(Request.Params["SaleReferenceId"]))
            {
                var refId           = Request.Params["RefId"];
                var saleOrderId     = long.Parse(Request.Params["saleOrderId"]);
                var saleReferenceId = long.Parse(Request.Params["SaleReferenceId"]);
                if (resCode == "0")
                {
                    if (order != null)
                    {
                        try
                        {
                            #region [Mellat : bpVerifyRequest , bpSettleRequest]
                            var terminalId   = _mellatPaymentSettings.TerminalId;
                            var userName     = _mellatPaymentSettings.UserName;
                            var userPassword = _mellatPaymentSettings.UserPassword;
                            BypassCertificateError();
                            var bpService             = new ir.shaparak.bpm.PaymentGatewayImplService();
                            var resultOfVerifyRequest = bpService.bpVerifyRequest(Int64.Parse(terminalId),
                                                                                  userName,
                                                                                  userPassword,
                                                                                  saleOrderId,
                                                                                  saleOrderId,
                                                                                  saleReferenceId);
                            var settleRequestArray = resultOfVerifyRequest.Split(',');
                            if (settleRequestArray[0] == "0")
                            {
                                var resultOfSettleRequest = bpService.bpSettleRequest(Int64.Parse(terminalId),
                                                                                      userName,
                                                                                      userPassword,
                                                                                      saleOrderId,
                                                                                      saleOrderId,
                                                                                      saleReferenceId);
                                if (resultOfSettleRequest != "0")
                                {
                                    throw new Exception();
                                }
                            }
                            else
                            {
                                throw new Exception();
                            }

                            #endregion
                            #region [mark order as paid]
                            if (_orderProcessingService.CanMarkOrderAsPaid(order))
                            {
                                //TODO : check saleOrderId is match by this Order.CaptureTransactionId
                                order.CaptureTransactionId      = saleOrderId.ToString(CultureInfo.InvariantCulture);
                                order.SubscriptionTransactionId = string.Format("[RefId = {0}]", refId);

                                order.AuthorizationTransactionId = string.Format("[SaleReferenceId = {0}]",
                                                                                 saleReferenceId.ToString(CultureInfo.InvariantCulture));
                                order.AuthorizationTransactionResult = string.Format("[ResCode = {0}]", resCode);

                                _orderService.UpdateOrder(order);
                                _orderProcessingService.MarkOrderAsPaid(order);
                            }
                            #endregion
                        }
                        catch
                        {
                            comment = string.Format("Error in Mellat Pay Verify or Pay Settle. OrderId= {0}", orderId);
                            _logger.Error(comment);
                            return(RedirectToAction("Error", "PaymentMellat", new
                            {
                                result = comment,
                                cashRefId = Request.Params["SaleReferenceId"],
                                insRefId = "",
                                cashOrder = Request.Params["saleOrderId"],
                                insOrder = "",
                                id = order.Id
                            }));
                        }
                        return(RedirectToRoute("CheckoutCompleted", new { orderId = order.Id }));
                    }
                    comment = string.Format("Order Not Found. OrderId= {0}", orderId);
                    _logger.Error(comment);
                    return(RedirectToAction("Error", "PaymentMellat", new
                    {
                        result = comment,
                        cashRefId = Request.Params["SaleReferenceId"],
                        insRefId = "",
                        cashOrder = Request.Params["saleOrderId"],
                        insOrder = "",
                        id = orderId
                    }));
                }
                comment = Utility.ErrorCode("bpPayRequest", resCode);
                _logger.Warning(comment);
                return(RedirectToAction("Error", "PaymentMellat", new
                {
                    result = comment,
                    cashRefId = Request.Params["SaleReferenceId"],
                    insRefId = "",
                    cashOrder = Request.Params["saleOrderId"],
                    insOrder = "",
                    id = order.Id
                }));
            }
            comment = Utility.ErrorCode("bpPayRequest", resCode);
            _logger.Error(comment);
            return(RedirectToAction("Error", "PaymentMellat", new
            {
                result = comment,
                cashRefId = Request.Params["SaleReferenceId"],
                insRefId = "",
                cashOrder = Request.Params["saleOrderId"],
                insOrder = "",
                id = order.Id
            }));

            #endregion
        }
        /// <summary>
        /// Post process payment (used by payment gateways that require redirecting to a third-party URL)
        /// </summary>
        /// <param name="postProcessPaymentRequest">Payment info required for an order processing</param>
        /// public void
        public void PostProcessPayment(PostProcessPaymentRequest postProcessPaymentRequest)
        {
            //Todo: اگر مشخصات اولیه درگاه ثبت نشده باشد، نباید خطا داشته باشیم.
            var order = postProcessPaymentRequest.Order;
            #region [Call bpMellat Web Service]

            var orderTotal = Math.Round(order.OrderTotal, 2);
            var mellatOrderId = _mellatPaymentSettings.OrderId;
            var terminalId = _mellatPaymentSettings.TerminalId;
            var userName = _mellatPaymentSettings.UserName;
            var userPassword = _mellatPaymentSettings.UserPassword;
            var price = Convert.ToInt64(orderTotal);
            const string description = "خرید از بازار اینترنتی";
            var callBackUrl = _webHelper.GetStoreLocation(false)
                              + "Plugins/PaymentMellat/CallBack?OrderId="
                              + order.Id;
            do
            {
                BypassCertificateError();
                var payDate = DateTime.Now.Year +
                              DateTime.Now.Month.ToString(CultureInfo.InvariantCulture).PadLeft(2, '0') +
                              DateTime.Now.Day.ToString(CultureInfo.InvariantCulture).PadLeft(2, '0');
                var payTime = DateTime.Now.Hour.ToString(CultureInfo.InvariantCulture).PadLeft(2, '0') +
                              DateTime.Now.Minute.ToString(CultureInfo.InvariantCulture).PadLeft(2, '0') +
                              DateTime.Now.Second.ToString(CultureInfo.InvariantCulture).PadLeft(2, '0');

                var bpService = new ir.shaparak.bpm.PaymentGatewayImplService();
                var result = bpService.bpPayRequest(Int64.Parse(terminalId),
                    userName,
                    userPassword,
                    mellatOrderId,
                    price,
                    payDate,
                    payTime,
                    description,
                    callBackUrl,
                    0);

                string url, comment;
                var resultArray = result.Split(',');
                if (resultArray[0] == "0") // آماده برای انتقال به بانک
                {
                    order.CaptureTransactionId = mellatOrderId.ToString(CultureInfo.InvariantCulture);
                    _orderService.UpdateOrder(order);
                    UpdateOrderId(++mellatOrderId, null);
                    url = (_webHelper.GetStoreLocation(false)
                                             + "Plugins/PaymentMellat/Pay?result="
                                             + resultArray[1]);
                    _httpContext.Response.Redirect(url, true);
                }
                switch (result)
                {
                    case "41": // Order Id Already Exist
                        mellatOrderId++;
                        break;
                    case "421":// Invalid IP
                        comment = Utility.ErrorCode("bpPayRequest", result);
                        url = (_webHelper.GetStoreLocation(false)
                                                 + string.Format("Plugins/PaymentMellat/Error?result={0}&cashRefId={1}&insRefId={2}&cachOrder={3}&insOrder={4}&id={5}"
                                                     , comment, "", "", mellatOrderId, "", order.Id));
                        _httpContext.Response.Redirect(url, true);
                        break;
                    default:   // Other Errors
                        comment = Utility.ErrorCode("bpPayRequest");
                        url = (_webHelper.GetStoreLocation(false)
                                                 + string.Format("Plugins/PaymentMellat/Error?result={0}&cashRefId={1}&insRefId={2}&cachOrder={3}&insOrder={4}&id={5}"
                                                     , comment, "", "", mellatOrderId, "", order.Id));
                        _httpContext.Response.Redirect(url, true);
                        break;
                }
            }
            while (true);
            #endregion
        }
    protected void Page_Load(object sender, EventArgs e)
    {
        //Read Fact Number
        if ((Request.QueryString["n"] != null))
        {
            code_s          = Request.QueryString["n"];
            Session["Fact"] = code_s;
        }
        else
        {
            //Response.Redirect("perfact.aspx");
        }

        //Select Data Value
        tblFactOnCollection list_fact = new tblFactOnCollection();

        list_fact.ReadList(Criteria.NewCriteria(tblFactOn.Columns.id_fact, CriteriaOperators.Equal, Convert.ToInt32(code_s)));

        string new_content = "";
        int    count_stuff = 0, Sum_price = 0;
        tblDetailStuffCollection list_detail = new tblDetailStuffCollection();

        list_detail.ReadList(Criteria.NewCriteria(tblDetailStuff.Columns.id_fact, CriteriaOperators.Equal, Convert.ToInt32(code_s)));

        for (int i = 0; i < list_detail.Count; i++)
        {
            count_stuff += 1;
            string stuff_id = list_detail[i].id_stuff.ToString();
            tblPorfolioCollection info_stuff = new tblPorfolioCollection();
            info_stuff.ReadList(Criteria.NewCriteria(tblPorfolio.Columns.id_profolio, CriteriaOperators.Like, stuff_id));

            new_content += info_stuff[0].id_profolio;

            Sum_price += Convert.ToInt32((list_detail[i].pay_one * list_detail[i].no_stuff).ToString());
        }

        PayAmountTextBox.Text  = Sum_price.ToString();
        PayOrderIdTextBox.Text = code_s;
        if (!IsPostBack)
        {
            SetDefaultDateTime();
            PayCallBackUrlTextBox.Text = "http://shahdforoush.ir/resultbuy.aspx";
            TerminalIdTextBox.Text     = "1309976";
            UserNameTextBox.Text       = "shfd";
            UserPasswordTextBox.Text   = "shfd47";
        }
        //send data to the bank
        try
        {
            string result;

            BypassCertificateError();

            //BPService.PaymentGatewayImplService bpService = new BPService.PaymentGatewayImplService();
            ir.shaparak.bpm.PaymentGatewayImplService bpService = new ir.shaparak.bpm.PaymentGatewayImplService();
            result = bpService.bpPayRequest(Int64.Parse(TerminalIdTextBox.Text),
                                            UserNameTextBox.Text,
                                            UserPasswordTextBox.Text,
                                            Int64.Parse(PayOrderIdTextBox.Text),
                                            Int64.Parse(PayAmountTextBox.Text),
                                            PayDateTextBox.Text,
                                            PayTimeTextBox.Text,
                                            PayAdditionalDataTextBox.Text,
                                            PayCallBackUrlTextBox.Text,
                                            Int64.Parse(PayPayerIdTextBox.Text));

            PayOutputLabel.Text = result;

            String[] resultArray = result.Split(',');
            if (resultArray[0] == "0")
            {
                ClientScript.RegisterStartupScript(typeof(Page), "ClientScript", "<script language='javascript' type='text/javascript'> postRefId('" + resultArray[1] + "');</script> ", false);
            }
        }
        catch (Exception exp)
        {
            PayOutputLabel.Text = "Error: " + exp.Message;
        }
    }
        /// <summary>
        /// Post process payment (used by payment gateways that require redirecting to a third-party URL)
        /// </summary>
        /// <param name="postProcessPaymentRequest">Payment info required for an order processing</param>
        /// public void
        public void PostProcessPayment(PostProcessPaymentRequest postProcessPaymentRequest)
        {
            //Todo: اگر مشخصات اولیه درگاه ثبت نشده باشد، نباید خطا داشته باشیم.
            var order = postProcessPaymentRequest.Order;

            #region [Call bpMellat Web Service]

            var          orderTotal    = Math.Round(order.OrderTotal, 2);
            var          mellatOrderId = _mellatPaymentSettings.OrderId;
            var          terminalId    = _mellatPaymentSettings.TerminalId;
            var          userName      = _mellatPaymentSettings.UserName;
            var          userPassword  = _mellatPaymentSettings.UserPassword;
            var          price         = Convert.ToInt64(orderTotal);
            const string description   = "خرید از بازار اینترنتی";
            var          callBackUrl   = _webHelper.GetStoreLocation(false)
                                         + "Plugins/PaymentMellat/CallBack?OrderId="
                                         + order.Id;
            do
            {
                BypassCertificateError();
                var payDate = DateTime.Now.Year +
                              DateTime.Now.Month.ToString(CultureInfo.InvariantCulture).PadLeft(2, '0') +
                              DateTime.Now.Day.ToString(CultureInfo.InvariantCulture).PadLeft(2, '0');
                var payTime = DateTime.Now.Hour.ToString(CultureInfo.InvariantCulture).PadLeft(2, '0') +
                              DateTime.Now.Minute.ToString(CultureInfo.InvariantCulture).PadLeft(2, '0') +
                              DateTime.Now.Second.ToString(CultureInfo.InvariantCulture).PadLeft(2, '0');


                var bpService = new ir.shaparak.bpm.PaymentGatewayImplService();
                var result    = bpService.bpPayRequest(Int64.Parse(terminalId),
                                                       userName,
                                                       userPassword,
                                                       mellatOrderId,
                                                       price,
                                                       payDate,
                                                       payTime,
                                                       description,
                                                       callBackUrl,
                                                       0);

                string url, comment;
                var    resultArray = result.Split(',');
                if (resultArray[0] == "0") // آماده برای انتقال به بانک
                {
                    order.CaptureTransactionId = mellatOrderId.ToString(CultureInfo.InvariantCulture);
                    _orderService.UpdateOrder(order);
                    UpdateOrderId(++mellatOrderId, null);
                    url = (_webHelper.GetStoreLocation(false)
                           + "Plugins/PaymentMellat/Pay?result="
                           + resultArray[1]);
                    _httpContext.Response.Redirect(url, true);
                }
                switch (result)
                {
                case "41":     // Order Id Already Exist
                    mellatOrderId++;
                    break;

                case "421":    // Invalid IP
                    comment = Utility.ErrorCode("bpPayRequest", result);
                    url     = (_webHelper.GetStoreLocation(false)
                               + string.Format("Plugins/PaymentMellat/Error?result={0}&cashRefId={1}&insRefId={2}&cachOrder={3}&insOrder={4}&id={5}"
                                               , comment, "", "", mellatOrderId, "", order.Id));
                    _httpContext.Response.Redirect(url, true);
                    break;

                default:       // Other Errors
                    comment = Utility.ErrorCode("bpPayRequest");
                    url     = (_webHelper.GetStoreLocation(false)
                               + string.Format("Plugins/PaymentMellat/Error?result={0}&cashRefId={1}&insRefId={2}&cachOrder={3}&insOrder={4}&id={5}"
                                               , comment, "", "", mellatOrderId, "", order.Id));
                    _httpContext.Response.Redirect(url, true);
                    break;
                }
            }while (true);
            #endregion
        }