Example #1
0
        /// <inheritdoc />
        public override async Task <IPaymentRequestResult> RequestAsync(Invoice invoice, CancellationToken cancellationToken = default)
        {
            if (invoice == null)
            {
                throw new ArgumentNullException(nameof(invoice));
            }

            var account = await GetAccountAsync(invoice).ConfigureAwaitFalse();

            var data = MellatHelper.CreateRequestData(invoice, account);

            var responseMessage = await _httpClient
                                  .PostXmlAsync(_gatewayOptions.ApiUrl, data, cancellationToken)
                                  .ConfigureAwaitFalse();

            var response = await responseMessage.Content.ReadAsStringAsync().ConfigureAwaitFalse();

            return(MellatHelper.CreateRequestResult(
                       response,
                       invoice,
                       _httpContextAccessor.HttpContext,
                       _gatewayOptions,
                       _messagesOptions.Value,
                       account));
        }
Example #2
0
        public async Task <IActionResult> Verify(Guid id)
        {
            try
            {
                var application = await GetApplicationAsync();

                if (application == null || application.Status != 0)
                {
                    return(Unauthorized());
                }

                var transaction = await _transactionRepository.Get(id);

                if (transaction == null)
                {
                    return(Unauthorized());
                }

                switch (transaction.Bank.Code)
                {
                case (byte)BankCodeEnum.Mellat:
                    var mellatHelper = new MellatHelper(_logger, _transactionRepository, _applicationBankRepository);
                    var mellatResult = await mellatHelper.VerifyTransaction(transaction);

                    return(Ok(mellatResult));

                case (byte)BankCodeEnum.Efarda:
                    var efardaHelper = new EfardaHelper(_logger, _transactionRepository, _applicationBankRepository);
                    var efardaResult = await efardaHelper.VerifyTransaction(transaction);

                    return(Ok(efardaResult));

                case (byte)BankCodeEnum.Saman:
                default:
                    var samanHelper = new SamanHelper(_logger, _transactionRepository, _applicationBankRepository);
                    var result      = await samanHelper.VerifyTransaction(transaction);

                    return(Ok(result));
                }
            }
            catch (Exception ex)
            {
                _logger.LogError(ex.Message);
                if (ex.InnerException != null)
                {
                    _logger.LogError(ex.InnerException.Message);
                }
                throw;
            }
        }
Example #3
0
        /// <inheritdoc />
        public override async Task <IPaymentFetchResult> FetchAsync(InvoiceContext context, CancellationToken cancellationToken = default)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }

            var callbackResult = await MellatHelper
                                 .CrateCallbackResultAsync(_httpContextAccessor.HttpContext.Request, _messagesOptions.Value, cancellationToken)
                                 .ConfigureAwaitFalse();

            if (callbackResult.IsSucceed)
            {
                return(PaymentFetchResult.ReadyForVerifying());
            }

            return(PaymentFetchResult.Failed(callbackResult.Message));
        }
Example #4
0
        public async Task <IActionResult> Verify(string publicKey, Guid id)
        {
            try
            {
                Application application = await _applicationRepository.GetFirstBy(x => x.PublicKey == publicKey);

                if (application == null || application.Status != 0)
                {
                    return(Unauthorized());
                }

                var transaction = await _transactionRepository.Get(id);

                if (transaction == null)
                {
                    return(Unauthorized());
                }

                switch (transaction.Bank.Code)
                {
                case ((byte)BankCodeEnum.Mellat):
                    MellatHelper mellatHelper = new MellatHelper(_logger, _transactionRepository, _applicationRepository, _bankRepository, _applicationBankRepository);
                    VerifyTransactionResponseModel mellatResult = await mellatHelper.VerifyTransaction(transaction);

                    return(Ok(mellatResult));

                case ((byte)BankCodeEnum.Saman):
                default:
                    SamanHelper samanHelper = new SamanHelper(_logger, _transactionRepository, _applicationRepository, _bankRepository, _applicationBankRepository);
                    VerifyTransactionResponseModel result = await samanHelper.VerifyTransaction(transaction);

                    return(Ok(result));
                }
            }
            catch (Exception ex)
            {
                _logger.LogError(ex.Message);
                if (ex.InnerException != null)
                {
                    _logger.LogError(ex.InnerException.Message);
                }
                throw;
            }
        }
Example #5
0
        /// <inheritdoc />
        public override async Task <IPaymentVerifyResult> VerifyAsync(InvoiceContext context, CancellationToken cancellationToken = default)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }

            var callbackResult = await MellatHelper
                                 .CrateCallbackResultAsync(_httpContextAccessor.HttpContext.Request, _messagesOptions.Value, cancellationToken)
                                 .ConfigureAwaitFalse();

            if (!callbackResult.IsSucceed)
            {
                return(PaymentVerifyResult.Failed(callbackResult.Message));
            }

            var account = await GetAccountAsync(context.Payment).ConfigureAwaitFalse();

            var data = MellatHelper.CreateVerifyData(context, account, callbackResult);

            var responseMessage = await _httpClient
                                  .PostXmlAsync(_gatewayOptions.ApiUrl, data, cancellationToken)
                                  .ConfigureAwaitFalse();

            var response = await responseMessage.Content.ReadAsStringAsync().ConfigureAwaitFalse();

            var verifyResult = MellatHelper.CheckVerifyResult(response, callbackResult, _messagesOptions.Value);

            if (!verifyResult.IsSucceed)
            {
                return(verifyResult.Result);
            }

            data = MellatHelper.CreateSettleData(context, callbackResult, account);

            responseMessage = await _httpClient
                              .PostXmlAsync(_gatewayOptions.ApiUrl, data, cancellationToken)
                              .ConfigureAwaitFalse();

            response = await responseMessage.Content.ReadAsStringAsync().ConfigureAwaitFalse();

            return(MellatHelper.CreateSettleResult(response, callbackResult, _messagesOptions.Value));
        }
Example #6
0
        /// <inheritdoc />
        public override async Task <IPaymentRefundResult> RefundAsync(InvoiceContext context, Money amount, CancellationToken cancellationToken = default)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }

            var account = await GetAccountAsync(context.Payment).ConfigureAwaitFalse();

            var data = MellatHelper.CreateRefundData(context, account);

            var responseMessage = await _httpClient
                                  .PostXmlAsync(_gatewayOptions.ApiUrl, data, cancellationToken)
                                  .ConfigureAwaitFalse();

            var response = await responseMessage.Content.ReadAsStringAsync().ConfigureAwaitFalse();

            return(MellatHelper.CreateRefundResult(response, _messagesOptions.Value));
        }
Example #7
0
        private async Task <MellatCallbackResult> GetCallbackResult(InvoiceContext context, CancellationToken cancellationToken)
        {
            var callBackTransaction = context.Transactions.SingleOrDefault(x => x.Type == TransactionType.Callback);

            MellatCallbackResult callbackResult;

            if (callBackTransaction == null)
            {
                callbackResult = await MellatHelper
                                 .CrateCallbackResultAsync(_httpContextAccessor.HttpContext.Request, _messagesOptions.Value,
                                                           cancellationToken)
                                 .ConfigureAwaitFalse();
            }
            else
            {
                callbackResult =
                    JsonConvert.DeserializeObject <MellatCallbackResult>(callBackTransaction.AdditionalData);
            }

            return(callbackResult);
        }
Example #8
0
        public async Task <IActionResult> Callback()
        {
            ViewBag.Bank = "ملت";
            BypassCertificateError();
            var token           = Request.Query["token"];
            var secondTrackCode = Request.Query["secondTrackCode"];

            var transaction = await _transactionRepository.Get(Guid.Parse(secondTrackCode));

            if (transaction.Status == (byte)TransactionStatusEnum.Success ||
                transaction.Status == (byte)TransactionStatusEnum.Cancel)
            {
                return(BadRequest());
            }

            var longUrl    = transaction.CallbackUrl;
            var uriBuilder = new UriBuilder(longUrl);
            var query      = HttpUtility.ParseQueryString(uriBuilder.Query);

            _logger.LogError(longUrl);
            ErrorCodeEnum bankErrorCode;

            if (string.IsNullOrEmpty(Request.Form["SaleReferenceId"].ToString()))
            {
                bankErrorCode = ErrorCodeEnum.UnkownError;
                var errorMsg = "رسید قابل قبول نیست";
                //ResCode=StatusPayment
                if (!string.IsNullOrEmpty(Request.Form["ResCode"].ToString()))
                {
                    errorMsg      = MellatHelper.MellatResult(Request.Form["ResCode"].ToString());
                    bankErrorCode = MellatHelper.ErrorResult(Request.Form["ResCode"].ToString());
                }

                return(await ReturnErrorPage(transaction, (byte)bankErrorCode, errorMsg));
            }

            bankErrorCode = ErrorCodeEnum.NoError;
            try
            {
                try
                {
                    var SaleOrderId = long.Parse(Request.Form["SaleOrderId"].ToString().TrimEnd());

                    var SaleReferenceId = long.Parse(Request.Form["SaleReferenceId"].ToString().TrimEnd());

                    var RefId = Request.Form["RefId"].ToString().TrimEnd();
                }
                catch (Exception ex)
                {
                    _logger.LogError(ex.Message);
                    const string message =
                        " وضعیت:مشکلی در پرداخت بوجود آمده ، در صورتی که وجه پرداختی از حساب بانکی شما کسر شده است آن مبلغ به صورت خودکار برگشت داده خواهد شد ";
                    return(await ReturnErrorPage(transaction, (byte)ErrorCodeEnum.UnkownError, message));
                }

                transaction.BankErrorCode = (byte)bankErrorCode;
                transaction.Status        = (byte)TransactionStatusEnum.BankOk;
                transaction.ModifiedOn    = DateTime.Now;
                transaction.ModifiedBy    = 1;

                transaction.BankTrackCode = Request.Form["SaleReferenceId"].ToString();

                await _transactionRepository.Update(transaction);

                query["id"]        = transaction.Id.ToString();
                query["trackCode"] = transaction.UserTrackCode;
                query["status"]    = true.ToString();
                query["errorCode"] = bankErrorCode.ToString();
                query["message"]   = "پرداخت با موفقیت انجام شد";

                uriBuilder.Query = query.ToString();

                longUrl = uriBuilder.ToString();

                var url3 = string.Format(longUrl);
                return(Redirect(url3));
            }
            catch (Exception ex)
            {
                _logger.LogError(ex.Message);
                var message =
                    "مشکلی در پرداخت به وجود آمده است ، در صورتیکه وجه پرداختی از حساب بانکی شما کسر شده است آن مبلغ به صورت خودکار برگشت داده خواهد شد";
                return(await ReturnErrorPage(transaction, (byte)ErrorCodeEnum.UnkownError, message));
            }
        }
        public async Task <IActionResult> Go(Guid id)
        {
            _logger.LogDebug("Pay - Id : " + id);
            var transaction = await _transactionRepository.Get(id);

            if (transaction == null ||
                transaction.Status == (byte)TransactionStatusEnum.Cancel)
            {
                return(View("Error", "لینک وارد شده صحیح نیست."));
            }

            if (transaction.Status == (byte)TransactionStatusEnum.Success ||
                transaction.Status == (byte)TransactionStatusEnum.BankOk)
            {
                return(View("Error", "این تراکنش قبلا پرداخت شده است."));
            }

            if (transaction.ExpirationTime.HasValue &&
                transaction.ExpirationTime < DateTime.Now)
            {
                var persianCalendar = new PersianCalendar();
                var date            =
                    $"{persianCalendar.GetYear(transaction.ExpirationTime.Value)}/{persianCalendar.GetMonth(transaction.ExpirationTime.Value)}/" +
                    $"{persianCalendar.GetDayOfMonth(transaction.ExpirationTime.Value)}" +
                    $" - {transaction.ExpirationTime.Value.Hour}:{transaction.ExpirationTime.Value.Minute}";
                return(View("Error",
                            $"این لینک تا تاریخ {date} معتبر بوده است، لطفا از پشتیبانی تقاضای لینک جدید بفرمایید."));
            }

            var applicationBank = await _applicationBankRepository.GetFirstBy(x =>
                                                                              x.ApplicationId == transaction.ApplicationId && x.BankId == transaction.BankId);

            switch (transaction.Bank.Code)
            {
            case (byte)BankCodeEnum.Parsian:
                _logger.LogDebug("Parsian");
                if (!string.IsNullOrWhiteSpace(transaction.BankTrackCode))
                {
                    var url = string.Format(applicationBank.Bank.PostUrl, transaction.BankTrackCode);
                    return(Redirect(url));
                }

                var pinParam = applicationBank.ApplicationBankParams.FirstOrDefault(x => x.ParamKey == "ParsianPIN");

                var parsianGateway = new ParsianGateway(pinParam.ParamValue);
                var resp           = await parsianGateway.SalePaymentRequestasync(Convert.ToInt64(transaction.Amount),
                                                                                  Convert.ToInt64(transaction.UserTrackCode), transaction.BankRedirectUrl, transaction.Id.ToString());

                if (resp.Body.SalePaymentRequestResult.Status == 0)
                {
                    _logger.LogDebug("authority after callback", resp.Body.SalePaymentRequestResult.Token);
                    transaction.BankTrackCode = resp.Body.SalePaymentRequestResult.Token.ToString();
                    await _transactionRepository.Update(transaction);

                    var url = string.Format(applicationBank.Bank.PostUrl, transaction.BankTrackCode);
                    return(Redirect(url));
                }
                else
                {
                    _logger.LogDebug("Critical Error: Payment Error. StatusCode={0} - Message={1}", resp.Body.SalePaymentRequestResult.Status, ParsianErrors.GetResult(resp.Body.SalePaymentRequestResult.Status).Message);
                    transaction.BankTrackCode = resp.Body.SalePaymentRequestResult.Token.ToString();
                    switch (resp.Body.SalePaymentRequestResult.Status)
                    {
                    case -126:
                        transaction.ErrorCode        = (byte)ErrorCodeEnum.InvalidPin;
                        transaction.BankErrorMessage = "پین فروشنده درست نیست";
                        break;

                    case 2:
                    case -1533:
                    case -1536:
                        transaction.ErrorCode        = (byte)ErrorCodeEnum.OperationAlreadyDone;
                        transaction.BankErrorMessage = "عملیات قبلا با موفقیت انجام شده است";
                        break;

                    case -112:
                        transaction.ErrorCode        = (byte)ErrorCodeEnum.UserTrackCodeIsInvalid;
                        transaction.BankErrorMessage = "شماره تراكنش فروشنده درست نیست";
                        break;
                    }

                    await _transactionRepository.Update(transaction);

                    return(View("Error", transaction.BankErrorMessage));
                }

            case (byte)BankCodeEnum.Mellat:
                _logger.LogDebug("mellat");
                var terminalParam = applicationBank.ApplicationBankParams.FirstOrDefault(x => x.ParamKey == "MellatTerminalId");
                var userNameParam = applicationBank.ApplicationBankParams.FirstOrDefault(x => x.ParamKey == "MellatUserName");
                var passwordParam = applicationBank.ApplicationBankParams.FirstOrDefault(x => x.ParamKey == "MellatPassword");

                var mellatGateway = new MellatGateway(terminalParam.ParamValue, userNameParam.ParamValue, passwordParam.ParamValue);
                var mellatResp    = await mellatGateway.BpPayRequest(Convert.ToInt32(transaction.Amount),
                                                                     Convert.ToInt32(transaction.UserTrackCode), transaction.BankRedirectUrl);

                _logger.LogError((mellatResp == null).ToString());

                if (mellatResp != null)
                {
                    _logger.LogError(mellatResp.Body.@return);

                    var resultArray = [email protected](',');
                    if (resultArray[0] == "0")
                    {
                        var refId = resultArray[1];
                        transaction.BankTrackCode = refId;
                        await _transactionRepository.Update(transaction);

                        ViewBag.RefId = refId;
                        return(View("Mellat", transaction));
                    }

                    _logger.LogError("Critical Error: Payment Error. StatusCode={0}", resultArray[0]);
                    transaction.ErrorCode        = (byte)MellatHelper.ErrorResult(resultArray[0]);
                    transaction.BankErrorCode    = Convert.ToInt32(resultArray[0]);
                    transaction.BankErrorMessage = MellatHelper.MellatResult(resultArray[0]);
                    await _transactionRepository.Update(transaction);

                    return(View("Error", transaction.BankErrorMessage));
                }
                else
                {
                    _logger.LogError("Critical Error: Payment Error. StatusCode=no resp");

                    transaction.BankErrorMessage = "امکان اتصال به درگاه بانک وجود ندارد";
                    await _transactionRepository.Update(transaction);

                    return(View("Error", transaction.BankErrorMessage));
                }

            case (byte)BankCodeEnum.Efarda:
                _logger.LogDebug("Efarda");

                var EfardaServiceId =
                    applicationBank.ApplicationBankParams.FirstOrDefault(x => x.ParamKey == "serviceId");
                var EfardaUsername =
                    applicationBank.ApplicationBankParams.FirstOrDefault(x => x.ParamKey == "userName");
                var EfardaPassword =
                    applicationBank.ApplicationBankParams.FirstOrDefault(x => x.ParamKey == "password");

                EfardaGateway efardaGateway = new EfardaGateway(_logger, EfardaUsername.ParamValue, EfardaPassword.ParamValue, EfardaServiceId.ParamValue);
                var           traceNumber   = await efardaGateway.GetTraceId(transaction.UserTrackCode, transaction.Amount.ToString("###############0"), transaction.BankRedirectUrl, transaction.Mobile.HasValue?transaction.Mobile.Value.ToString() : string.Empty);

                transaction.BankTrackCode = traceNumber;
                await _transactionRepository.Update(transaction);

                ViewBag.Username    = EfardaUsername.ParamValue;
                ViewBag.traceNumber = traceNumber;

                return(View("Efarda", transaction));

            case (byte)BankCodeEnum.Saman:
            default:
                _logger.LogDebug("Saman");
                ViewBag.Params = applicationBank.ApplicationBankParams.ToList();
                return(View("Saman", transaction));
            }
        }
Example #10
0
        public async Task <IActionResult> Index(Guid id)
        {
            var transaction = await _transactionRepository.Get(id);

            if (transaction == null ||
                transaction.Status == (byte)TransactionStatusEnum.Cancel)
            {
                return(View("Error", "لینک وارد شده صحیح نیست."));
            }

            if (transaction.Status == (byte)TransactionStatusEnum.Success ||
                transaction.Status == (byte)TransactionStatusEnum.BankOk)
            {
                return(View("Error", "این تراکنش قبلا پرداخت شده است."));
            }

            if (transaction.ExpirationTime.HasValue &&
                transaction.ExpirationTime < DateTime.Now)
            {
                PersianCalendar persianCalendar = new PersianCalendar();
                string          date            = $"{persianCalendar.GetYear(transaction.ExpirationTime.Value)}/{persianCalendar.GetMonth(transaction.ExpirationTime.Value)}/" +
                                                  $"{persianCalendar.GetDayOfMonth(transaction.ExpirationTime.Value)}" +
                                                  $" - {transaction.ExpirationTime.Value.Hour}:{transaction.ExpirationTime.Value.Minute}";
                return(View("Error", $"این لینک تا تاریخ {date} معتبر بوده است، لطفا از پشتیبانی تقاضای لینک جدید بفرمایید."));
            }

            var applicationBank = await _applicationBankRepository.GetFirstBy(x => x.ApplicationId == transaction.ApplicationId && x.BankId == transaction.BankId);

            switch (transaction.Bank.Code)
            {
            case (byte)BankCodeEnum.Parsian:
                _logger.LogInformation("Parsian");
                var pinParam = applicationBank.ApplicationBankParams.FirstOrDefault(x => x.ParamKey == "ParsianPIN");
                Parsian.ParsianGateway parsianGateway = new Parsian.ParsianGateway(pinParam.ParamValue);
                var resp = await parsianGateway.PinPaymentRequest(Convert.ToInt32(transaction.Amount), Convert.ToInt32(transaction.UserTrackCode), transaction.CallbackUrl);

                var paramsInfo = applicationBank.ApplicationBankParams.ToList();
                if (resp.Body.status == 0)
                {
                    _logger.LogInformation("authority after callback", resp.Body.authority);
                    var url = string.Format(applicationBank.Bank.PostUrl, resp.Body.authority);
                    transaction.BankTrackCode = resp.Body.authority.ToString();
                    await _transactionRepository.Update(transaction);

                    return(Redirect(url));
                }
                else
                {
                    _logger.LogInformation("Critical Error: Payment Error. StatusCode={0}", resp.Body.status);
                    transaction.BankTrackCode = resp.Body.authority.ToString();
                    switch (resp.Body.status)
                    {
                    case 20:
                    case 22:
                        transaction.ErrorCode        = (byte)ErrorCodeEnum.InvalidPin;
                        transaction.BankErrorMessage = "پين فروشنده درست نميباشد";
                        break;

                    case 30:
                        transaction.ErrorCode        = (byte)ErrorCodeEnum.OperationAlreadyDone;
                        transaction.BankErrorMessage = "عمليات قبلا با موفقيت انجام شده است";
                        break;

                    case 34:
                        transaction.ErrorCode        = (byte)ErrorCodeEnum.UserTrackCodeIsInvalid;
                        transaction.BankErrorMessage = "شماره تراكنش فروشنده درست نميباشد";
                        break;
                    }

                    await _transactionRepository.Update(transaction);

                    return(BadRequest(transaction.BankErrorMessage));
                }

            case (byte)BankCodeEnum.Mellat:
                _logger.LogInformation("mellat");
                var termialParam  = applicationBank.ApplicationBankParams.FirstOrDefault(x => x.ParamKey == "MellatTerminalId");
                var userNameParam = applicationBank.ApplicationBankParams.FirstOrDefault(x => x.ParamKey == "MellatUserName");
                var passwordParam = applicationBank.ApplicationBankParams.FirstOrDefault(x => x.ParamKey == "MellatPassword");

                var           terminalID    = termialParam.ParamValue;
                var           userName      = userNameParam.ParamValue;
                var           password      = passwordParam.ParamValue;
                MellatGateway mellatGateway = new MellatGateway(terminalID, userName, password);
                var           mellatResp    = await mellatGateway.bpPayRequest(Convert.ToInt32(transaction.Amount), Convert.ToInt32(transaction.UserTrackCode), transaction.BankRedirectUrl);

                var mellatParamsInfo = applicationBank.ApplicationBankParams.ToList();
                _logger.LogError((mellatResp == null).ToString());

                if (mellatResp != null)
                {
                    _logger.LogError(mellatResp.Body.@return);

                    string[] ResultArray = [email protected](',');
                    if (ResultArray[0].ToString() == "0")
                    {
                        var refId = ResultArray[1];
                        transaction.BankTrackCode = refId;
                        await _transactionRepository.Update(transaction);

                        ViewBag.RefId = refId;
                        return(View("Mellat", transaction));
                    }
                    else
                    {
                        _logger.LogError("Critical Error: Payment Error. StatusCode={0}", ResultArray[0].ToString());
                        transaction.ErrorCode        = (byte)MellatHelper.ErrorResult(ResultArray[0].ToString());
                        transaction.BankErrorCode    = Convert.ToInt32(ResultArray[0].ToString());
                        transaction.BankErrorMessage = MellatHelper.MellatResult(ResultArray[0].ToString());
                        await _transactionRepository.Update(transaction);

                        return(BadRequest(transaction.BankErrorMessage));
                    }
                }
                else
                {
                    _logger.LogError("Critical Error: Payment Error. StatusCode=no resp");

                    transaction.BankErrorMessage = "امکان اتصال به درگاه بانک وجود ندارد";
                    await _transactionRepository.Update(transaction);

                    return(BadRequest(transaction.BankErrorMessage));
                }

            case (byte)BankCodeEnum.Saman:
            default:
                _logger.LogInformation("Saman");
                ViewBag.Params = applicationBank.ApplicationBankParams.ToList();
                return(View("Saman", transaction));
            }
        }
        public async Task <IActionResult> Callback()
        {
            ViewBag.Bank = "ملت";
            BypassCertificateError();
            var token           = Request.Query["token"];
            var secondTrackCode = Request.Query["secondTrackCode"];

            _logger.LogInformation("CallBack");
            _logger.LogInformation("token:" + token);
            _logger.LogInformation("secondTrackCode:" + secondTrackCode);

            _logger.LogInformation(Request.Form["SaleReferenceId"].ToString());
            _logger.LogInformation(Request.Form["ResCode"].ToString());
            _logger.LogInformation(Request.Form["SaleOrderId"].ToString());
            _logger.LogInformation(Request.Form["SaleReferenceId"].ToString());

            Transaction transaction = await _transactionRepository.Get(Guid.Parse(secondTrackCode));

            if (transaction.Status == (byte)TransactionStatusEnum.Success ||
                transaction.Status == (byte)TransactionStatusEnum.Cancel)
            {
                return(BadRequest());
            }

            string longurl            = transaction.CallbackUrl;
            var    uriBuilder         = new UriBuilder(longurl);
            NameValueCollection query = HttpUtility.ParseQueryString(uriBuilder.Query);

            _logger.LogError(longurl);
            if (string.IsNullOrEmpty(Request.Form["SaleReferenceId"].ToString()))
            {
                var bankErrorCode = ErrorCodeEnum.UnkownError;
                var _errorMsg     = "رسید قابل قبول نیست";
                //ResCode=StatusPayment
                if (!string.IsNullOrEmpty(Request.Form["ResCode"].ToString()))
                {
                    _errorMsg     = MellatHelper.MellatResult(Request.Form["ResCode"].ToString());
                    bankErrorCode = MellatHelper.ErrorResult(Request.Form["ResCode"].ToString());
                }

                return(await ReturnErrorPage(transaction, (byte)bankErrorCode, _errorMsg));
            }
            else
            {
                try
                {
                    var applicationBank = await _applicationBankRepository.GetFirstBy(x => x.ApplicationId == transaction.ApplicationId && x.BankId == transaction.BankId);

                    string TerminalId = applicationBank.ApplicationBankParams.FirstOrDefault(x => x.ParamKey == "MellatTerminalId").ParamValue;

                    string UserName = applicationBank.ApplicationBankParams.FirstOrDefault(x => x.ParamKey == "MellatUserName").ParamValue;
                    string Password = applicationBank.ApplicationBankParams.FirstOrDefault(x => x.ParamKey == "MellatPassword").ParamValue;

                    long   SaleOrderId     = 0; //PaymentID
                    long   SaleReferenceId = 0;
                    string RefId           = null;
                    try
                    {
                        SaleOrderId = long.Parse(Request.Form["SaleOrderId"].ToString().TrimEnd());

                        SaleReferenceId = long.Parse(Request.Form["SaleReferenceId"].ToString().TrimEnd());

                        RefId = Request.Form["RefId"].ToString().TrimEnd();
                    }
                    catch (Exception ex)
                    {
                        _logger.LogError(ex.Message);
                        var message = " وضعیت:مشکلی در پرداخت بوجود آمده ، در صورتی که وجه پرداختی از حساب بانکی شما کسر شده است آن مبلغ به صورت خودکار برگشت داده خواهد شد ";
                        return(await ReturnErrorPage(transaction, (byte)ErrorCodeEnum.UnkownError, message));
                    }

                    var bankErrorCode = ErrorCodeEnum.NoError;
                    transaction.BankErrorCode = (byte)bankErrorCode;
                    transaction.Status        = (byte)TransactionStatusEnum.BankOk;
                    transaction.ModifiedOn    = DateTime.Now;
                    transaction.ModifiedBy    = 1;

                    transaction.BankTrackCode = Request.Form["SaleReferenceId"].ToString();

                    await _transactionRepository.Update(transaction);

                    query["id"]        = transaction.Id.ToString();
                    query["trackCode"] = transaction.UserTrackCode.ToString();
                    query["status"]    = true.ToString();
                    query["errorCode"] = bankErrorCode.ToString();
                    query["message"]   = "پرداخت با موفقیت انجام شد";

                    uriBuilder.Query = query.ToString();

                    longurl = uriBuilder.ToString();

                    var url3 = string.Format(longurl);
                    return(Redirect(url3));
                }
                catch (Exception ex)
                {
                    _logger.LogError(ex.Message);
                    var message = "مشکلی در پرداخت به وجود آمده است ، در صورتیکه وجه پرداختی از حساب بانکی شما کسر شده است آن مبلغ به صورت خودکار برگشت داده خواهد شد";
                    return(await ReturnErrorPage(transaction, (byte)ErrorCodeEnum.UnkownError, message));
                }
            }
        }