using _0_Framework.Application; using CompanyManagment.App.Contracts.PaymentTransaction; using CompanyManagment.EFCore.Migrations; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using ServiceHost.BaseControllers; using System.Globalization; using System.Security.Cryptography; using _0_Framework.Application.PaymentGateway; using Microsoft.Extensions.Options; using CompanyManagment.App.Contracts.FinancialStatment; using CompanyManagment.App.Contracts.FinancilTransaction; using CompanyManagment.App.Contracts.Workshop; using Newtonsoft.Json; using NuGet.Protocol; using Parbad; namespace ServiceHost.Controllers; public class GeneralController : GeneralBaseController { private readonly IPaymentTransactionApplication _paymentTransactionApplication; private readonly IPaymentGateway _paymentGateway; private readonly IFinancialStatmentApplication _financialStatmentApplication; private readonly IOnlinePayment _onlinePayment; public GeneralController(IPaymentTransactionApplication paymentTransactionApplication,IHttpClientFactory clientFactory, IFinancialStatmentApplication financialStatmentApplication, IOptions appSetting, IOnlinePayment onlinePayment) { _paymentTransactionApplication = paymentTransactionApplication; _paymentGateway = new AqayePardakhtPaymentGateway(clientFactory, appSetting); _financialStatmentApplication = financialStatmentApplication; _onlinePayment = onlinePayment; } /// /// نمایش اطلاعات عمومی مانند تاریخ ها و سال ها /// /// [HttpGet("Dates")] public IActionResult GetDates() { var pc = new PersianCalendar(); var now = DateTime.Now; var currentYear = pc.GetYear(now); var years = Enumerable.Range(1370, currentYear - 1370 + 1).ToList(); var months = Enumerable.Range(1, 12).ToList(); var currentDate = new { Year = currentYear, Month = pc.GetMonth(now), Day = pc.GetDayOfMonth(now) }; return new JsonResult(new { years, months, currentDate }); } [HttpGet("/api/callback"), HttpPost("/api/callback")] public async Task Verify(VerifySepehrTest res) { var invoice = await _onlinePayment.FetchAsync(); var data = JsonConvert.SerializeObject(invoice.AdditionalData); var statics = JsonConvert.SerializeObject(res); await _onlinePayment.CancelAsync(invoice); return new JsonResult(new { data, statics }); // Check if the invoice is new, or it's already processed before. if (invoice.Status != PaymentFetchResultStatus.ReadyForVerifying) { // You can also see if the invoice is already verified before. var isAlreadyVerified = invoice.IsAlreadyVerified; return Content("The payment was not successful."); } var verifyResult = await _onlinePayment.VerifyAsync(invoice); // Note: Save the verifyResult.TransactionCode in your database. } [HttpPost("/api/callback3232")] public async Task OnGetCallBack(string? transid, string? cardnumber, string? tracking_number, string bank, string invoice_id, string? status,CancellationToken cancellationToken) { if (!long.TryParse(invoice_id, out var paymentTransactionId)) { return BadRequest("Invalid invoice_id"); } var transaction = await _paymentTransactionApplication.GetDetails(paymentTransactionId); if (transaction == null) { return NotFound("Transaction not found"); } if (transaction.Status != PaymentTransactionStatus.Pending) { return BadRequest("این تراکنش قبلا پرداخت شده است"); } // اگر شماره کارت یا شماره پیگیری خالی باشد، تراکنش ناموفق است if (string.IsNullOrWhiteSpace(cardnumber) || string.IsNullOrWhiteSpace(tracking_number)) { return await HandleFailedTransaction(transaction, paymentTransactionId); } var verifyCommand = new VerifyPaymentGateWayRequest() { Amount = transaction.Amount/10, TransactionId = transid }; var verifyRes =await _paymentGateway.Verify(verifyCommand, cancellationToken); // اگر استاتوس 1 باشد، تراکنش موفق است if (verifyRes.IsSuccess) { var command = new CreateFinancialStatment() { ContractingPartyId = transaction.ContractingPartyId, Deptor = 0, Creditor = transaction.Amount, DeptorString = "0", TypeOfTransaction = "credit", DescriptionOption = "بابت قرارداد مابین (روابط کار)", Description = "درگاه بانکی", }; var statementResult = _financialStatmentApplication.CreateFromBankGateway(command); if (!statementResult.IsSuccedded) { return await HandleFailedTransaction(transaction, paymentTransactionId); } var setSuccessResult = _paymentTransactionApplication.SetSuccess(paymentTransactionId, cardnumber, bank); if (!setSuccessResult.IsSuccedded) { return new JsonResult(setSuccessResult); } return Redirect(BuildCallbackUrl(transaction.CallBackUrl, true, transaction.Id)); } // در غیر این صورت تراکنش ناموفق است return await HandleFailedTransaction(transaction, paymentTransactionId); } private async Task HandleFailedTransaction(PaymentTransactionDetailsViewModel transaction, long transactionId) { var result = _paymentTransactionApplication.SetFailed(transactionId); if (!result.IsSuccedded) { return new JsonResult(result); } return Redirect(BuildCallbackUrl(transaction.CallBackUrl, false, transaction.Id)); } private string BuildCallbackUrl(string baseUrl, bool isSuccess, long transactionId) { var statusCode = isSuccess ? "1" : "0"; return $"{baseUrl}/callback?Status={statusCode}&transactionId={transactionId}"; } } public class VerifySepehrTest { public long terminalid { get; set; } public string invoiceid { get; set; } public long amount { get; set; } public string cardnumber { get; set; } public string payload { get; set; } public string rrn { get; set; } public string tracenumber { get; set; } public string digitalreceipt { get; set; } public string datepaid { get; set; } public string respcode{ get; set; } public string respmsg { get; set; } public string issuerbank { get; set; } }