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> 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> 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)); } }
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)); } } }