Toplu Ödeme Callback Metodu
Örnek Kod Bloğu
using System.IO.Compression;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;
namespace PaywallBulkPaymentCalback;
[ApiController]
[Route("api/[controller]")]
public class WebhookController : ControllerBase
{
private readonly ILogger<WebhookController> _logger;
public WebhookController(ILogger<WebhookController> logger)
{
_logger = logger;
}
public class FileUploadRequest
{
public int Type { get; set; }
public int BulkPaymentId { get; set; }
public int FileRecordId { get; set; }
public required string FileName { get; set; }
public long FileSize { get; set; }
public int LineCount { get; set; }
public required string FileFormat { get; set; }
public bool IsCompressed { get; set; }
public required string ErrorMessage { get; set; }
public DateTime DateTime { get; set; }
public DateTime CreatedAt { get; set; }
public DateTime FinishedAt { get; set; }
public double DurationTime { get; set; }
public required string Hash { get; set; }
public required string HashFormat { get; set; }
public short? HashKeyType { get; set; }
public string? MerchantUniqueCode { get; set; }
}
[HttpPost("receive")]
public async Task<IActionResult> ReceiveFileWithData()
{
try
{
if (!Request.HasFormContentType)
{
return BadRequest("Multipart form data expected");
}
var form = await Request.ReadFormAsync();
// JSON data'yı al
FileUploadRequest? uploadRequest = null;
if (form.ContainsKey("data"))
{
var jsonData = form["data"].ToString();
uploadRequest = JsonConvert.DeserializeObject<FileUploadRequest>(jsonData);
_logger.LogInformation($"Received data: {jsonData}");
}
// Dosyayı al
var file = form.Files.GetFile("file");
if (file == null || file.Length == 0)
{
return BadRequest("No file received");
}
byte[] fileBytes;
string originalFileName = file.FileName;
long originalSize = file.Length;
long processedSize;
// Dosyayı işle - compressed ise decompress et
if (uploadRequest?.IsCompressed == true)
{
_logger.LogInformation($"Decompressing file: {file.FileName}");
using var compressedStream = file.OpenReadStream();
using var gzipStream = new GZipStream(compressedStream, CompressionMode.Decompress);
using var decompressedStream = new MemoryStream();
await gzipStream.CopyToAsync(decompressedStream);
fileBytes = decompressedStream.ToArray();
processedSize = fileBytes.Length;
_logger.LogInformation($"File decompressed: {originalSize} bytes -> {processedSize} bytes");
}
else
{
using var memoryStream = new MemoryStream();
await file.CopyToAsync(memoryStream);
fileBytes = memoryStream.ToArray();
processedSize = fileBytes.Length;
}
// Dosyayı kaydet
var savedFilePath = await SaveFile(originalFileName, fileBytes);
// Response hazırla
var response = new
{
message = "File and data received successfully",
uploadRequest,
file = new
{
originalName = originalFileName,
originalSize = originalSize,
processedSize = processedSize,
contentType = file.ContentType,
savedPath = savedFilePath,
wasCompressed = uploadRequest?.IsCompressed == true
},
processedAt = DateTime.UtcNow
};
_logger.LogInformation($"File processed: {originalFileName} (Original: {originalSize} bytes, Processed: {processedSize} bytes)");
return Ok(response);
}
catch (InvalidDataException ex)
{
_logger.LogError(ex, "Invalid compressed data format");
return BadRequest("Invalid compressed file format");
}
catch (Newtonsoft.Json.JsonException ex)
{
_logger.LogError(ex, "Invalid JSON in data field");
return BadRequest("Invalid JSON format in data field");
}
catch (Exception ex)
{
_logger.LogError(ex, "Error processing upload request");
return StatusCode(500, "Upload processing failed");
}
}
private async Task<string> SaveFile(string originalFileName, byte[] fileBytes)
{
var uploadsDirectory = Path.Combine(Directory.GetCurrentDirectory(), "uploads");
if (!Directory.Exists(uploadsDirectory))
{
Directory.CreateDirectory(uploadsDirectory);
}
var fileName = $"{DateTime.UtcNow:yyyyMMdd_HHmmss}_{Path.GetFileName(originalFileName)}";
var filePath = Path.Combine(uploadsDirectory, fileName);
await System.IO.File.WriteAllBytesAsync(filePath, fileBytes);
return filePath;
}
}
Last updated