OrderPayment, modern ve güvenli bir e-ticaret deneyimi sunan kapsamlı bir web uygulamasıdır. ASP.NET MVC mimarisi kullanılarak geliştirilen bu platform, kullanıcıların ürünleri kolayca bulmasını, sepete eklemesini ve güvenli ödeme yapmasını sağlar.
Projenin en önemli özellikleri arasında Iyzipay entegrasyonu sayesinde güvenli ve hızlı ödeme işlemleri ve Twilio SMS servisi ile sipariş durumu bildirimleri yer almaktadır. Bu entegrasyonlar sayesinde kullanıcılar, ödeme işlemlerini güvenle tamamlayabilir ve siparişlerinin durumu hakkında anında bildirim alabilirler.
MVC (Model-View-Controller) mimarisi ve Entity Framework kullanılarak geliştirilen bu proje, sürdürülebilir ve genişletilebilir bir kod yapısına sahiptir. Veritabanı işlemleri için Code First yaklaşımı kullanılmış olup, ürün katalogları, kullanıcı verileri ve sipariş bilgileri güvenli bir şekilde yönetilmektedir.
Iyzipay ödeme sistemiyle güvenli bir entegrasyon sağlamak bir zorluktu. Bu sorunu çözmek için Iyzipay'in sağladığı SDK'yı kullanarak özel bir ödeme servisi geliştirdim. Bu servis sayesinde, ödeme işlemleri güvenli bir şekilde gerçekleştirilip veritabanına kaydediliyor.
Sipariş durumlarını gerçek zamanlı olarak bildirmek için Twilio SMS API'sinin entegrasyonu gerekiyordu. Bu zorluğu, ASP.NET'in asenkron programlama yeteneklerini kullanarak ve siparişlerdeki durum değişikliklerini izleyen bir servis geliştirerek çözdüm.
// Iyzipay ödeme işlemi örneği
public IActionResult ProcessPayment(PaymentViewModel model)
{
try
{
// Iyzipay yapılandırması
Options options = new Options
{
ApiKey = _configuration["Iyzipay:ApiKey"],
SecretKey = _configuration["Iyzipay:SecretKey"],
BaseUrl = _configuration["Iyzipay:BaseUrl"]
};
// Ödeme isteği oluşturma
CreatePaymentRequest request = new CreatePaymentRequest
{
Locale = Locale.TR.ToString(),
ConversationId = Guid.NewGuid().ToString(),
Price = model.TotalAmount.ToString(CultureInfo.InvariantCulture),
PaidPrice = model.TotalAmount.ToString(CultureInfo.InvariantCulture),
Currency = Currency.TRY.ToString(),
Installment = 1,
BasketId = model.OrderId.ToString(),
PaymentChannel = PaymentChannel.WEB.ToString(),
PaymentGroup = PaymentGroup.PRODUCT.ToString(),
PaymentCard = MapPaymentCard(model.CardDetails),
Buyer = MapBuyer(model.UserDetails),
ShippingAddress = MapAddress(model.ShippingAddress),
BillingAddress = MapAddress(model.BillingAddress),
BasketItems = MapBasketItems(model.OrderItems)
};
// Ödeme işlemini gerçekleştirme
Payment payment = Payment.Create(request, options);
// Ödeme sonucunu kontrol etme
if (payment.Status == "success")
{
// Sipariş kaydetme ve SMS gönderme
var orderId = _orderService.CompleteOrder(model.OrderId);
SendOrderConfirmationSms(model.UserDetails.Phone, orderId);
return RedirectToAction("PaymentSuccess", new { orderId });
}
else
{
return RedirectToAction("PaymentError", new { errorMessage = payment.ErrorMessage });
}
}
catch (Exception ex)
{
_logger.LogError(ex, "Ödeme işlemi sırasında hata oluştu");
return RedirectToAction("PaymentError", new { errorMessage = "Beklenmeyen bir hata oluştu." });
}
}
// Twilio ile SMS gönderme servisi
public class SmsService : ISmsService
{
private readonly string _accountSid;
private readonly string _authToken;
private readonly string _fromNumber;
private readonly ILogger _logger;
public SmsService(IConfiguration configuration, ILogger logger)
{
_accountSid = configuration["Twilio:AccountSid"];
_authToken = configuration["Twilio:AuthToken"];
_fromNumber = configuration["Twilio:PhoneNumber"];
_logger = logger;
}
public async Task SendOrderStatusSms(string toPhoneNumber, string orderNumber, string status)
{
try
{
TwilioClient.Init(_accountSid, _authToken);
var message = await MessageResource.CreateAsync(
body: $"Sayın müşterimiz, {orderNumber} numaralı siparişinizin durumu '{status}' olarak güncellenmiştir. Teşekkür ederiz.",
from: new Twilio.Types.PhoneNumber(_fromNumber),
to: new Twilio.Types.PhoneNumber(toPhoneNumber)
);
_logger.LogInformation($"SMS gönderildi. SID: {message.Sid}");
return true;
}
catch (Exception ex)
{
_logger.LogError(ex, "SMS gönderimi sırasında hata oluştu");
return false;
}
}
}