public ShopProductController(ShopProductRepository shopProductRepository
                              , IConfiguration configuration
                              , ProductRepostitory productRepostitory
                              , ProductPackageDetailsRepostitory productPackageDetailsRepostitory
                              , ShopOrderRepository shopOrderRepository
                              , ManageBankService manageBankService
                              , UsersPaymentRepository usersPaymentRepository)
 {
     _bankConfig                       = configuration.GetSection(nameof(BankConfig)).Get <BankConfig>();
     _shopProductRepository            = shopProductRepository;
     _configuration                    = configuration;
     _productRepostitory               = productRepostitory;
     _productPackageDetailsRepostitory = productPackageDetailsRepostitory;
     _shopOrderRepository              = shopOrderRepository;
     _manageBankService                = manageBankService;
     _usersPaymentRepository           = usersPaymentRepository;
 }
        public async Task <IActionResult> RequestBuilder(int id)
        {
            if (!User.Identity.IsAuthenticated)
            {
                return(RedirectToAction("Login", "Account"));
            }

            var factorInfo = await _shopOrderRepository.GetByIdAsync(id);

            #region BankDependency

            if (factorInfo == null)
            {
                TempData.AddResult(SweetAlertExtenstion.Error("اطلاعات سبد خریدی با این عنوان یافت نشد"));
                return(RedirectToAction("Index", "ShopProductController"));
            }

            // شماره خرید
            var OrderId = new Random().Next(1000, int.MaxValue).ToString();

            // رمز گذاری اطلاعات
            var dataBytes = Encoding.UTF8.GetBytes(string.Format("{0};{1};{2}", _bankConfig.TerminalId, OrderId, 1000));

            var symmetric = SymmetricAlgorithm.Create("TripleDes");
            symmetric.Mode    = CipherMode.ECB;
            symmetric.Padding = PaddingMode.PKCS7;

            // رمز گذاری گلید پایانه
            var encryptor = symmetric.CreateEncryptor(Convert.FromBase64String(_bankConfig.MerchantKey), new byte[8]);
            var SignData  = Convert.ToBase64String(encryptor.TransformFinalBlock(dataBytes, 0, dataBytes.Length));

            // ادرس بازگشت از درگاه
            var ReturnUrl = string.Format(_bankConfig.ReturnUrl);

            // ادرس وب سرویس درگاه
            var ipgUri = string.Format("{0}/api/v0/Request/PaymentRequest", _bankConfig.PurchasePage);

            #endregion

            #region Informations

            // آماده سازی اطلاعات برای ا
            var data = new
            {
                _bankConfig.TerminalId,
                _bankConfig.MerchantId,
                Amount = 1000,
                SignData,
                _bankConfig.ReturnUrl,
                LocalDateTime = DateTime.Now,
                OrderId,
                //MultiplexingData = request.MultiplexingData
            };

            #endregion

            #region RequestBuild

            var res = ManageBankService.CallApi <BankResultViewModel>(ipgUri, data);
            res.Wait();

            #endregion

            #region Request Result

            if (res != null && res.Result != null)
            {
                if (res.Result.ResCode == "0")
                {
                    factorInfo.OrderId = OrderId;

                    await _usersPaymentRepository.MapAddAsync(SetValue(res.Result.Token));

                    await _shopOrderRepository.UpdateAsync(factorInfo);

                    Response.Redirect(string.Format("{0}/Purchase/Index?token={1}", _bankConfig.PurchasePage, res.Result.Token));
                }
                ViewBag.Message = res.Result.Description;
                return(View());
            }

            #endregion

            return(View());

            #region LocalMethods

            AddUserPaymentViewModel SetValue(string token)
            {
                return(new AddUserPaymentViewModel()
                {
                    Amount = data.Amount,
                    DateTime = data.LocalDateTime,
                    OrderId = data.OrderId,
                    Token = token,
                    UserId = UserId,
                    ShopOrderId = id
                });
            }

            #endregion
        }