using CmsPackage = CMSMicroservice.Protobuf.Protos.Package; using PYMSMicroservice.Protobuf.Protos.Transaction; namespace FrontOffice.BFF.Application.PackageCQ.Commands.VerifyBasePackagePayment; /// /// Handler برای تأیید پرداخت پکیج پایه /// 1. ابتدا PYMS فراخوانی می‌شود برای Verify پرداخت /// 2. سپس CMS فراخوانی می‌شود برای تکمیل یا رد تراکنش /// public class VerifyBasePackagePaymentCommandHandler : IRequestHandler { private readonly IApplicationContractContext _context; public VerifyBasePackagePaymentCommandHandler(IApplicationContractContext context) { _context = context; } public async Task Handle(VerifyBasePackagePaymentCommand request, CancellationToken cancellationToken) { // اگر وضعیت از زرین‌پال NOK باشد، کاربر پرداخت را لغو کرده if (request.Status != "OK") { // به CMS اطلاع بده که پرداخت ناموفق بود await NotifyCmsPaymentFailed(request.OrderId, request.TransactionId, "پرداخت توسط کاربر لغو شد", cancellationToken); return new VerifyBasePackagePaymentResponseDto { Success = false, Message = "پرداخت لغو شد", OrderId = request.OrderId, TransactionId = request.TransactionId }; } // 1. تأیید پرداخت از زرین‌پال var verifyRequest = new PaymentVerificationRequest { Authority = request.Authority, Status = request.Status, }; var verifyResponse = await _context.ZarinTransactions.PaymentVerificationAsync( verifyRequest, cancellationToken: cancellationToken); // 2. بر اساس نتیجه Verify، CMS را به‌روزرسانی کن if (!verifyResponse.PaymentStatus) { // پرداخت ناموفق بود await NotifyCmsPaymentFailed(request.OrderId, request.TransactionId, verifyResponse.Message, cancellationToken); return new VerifyBasePackagePaymentResponseDto { Success = false, Message = verifyResponse.Message ?? "پرداخت ناموفق بود", OrderId = request.OrderId, TransactionId = request.TransactionId }; } // پرداخت موفق بود - CMS را برای شارژ کیف پول فراخوانی کن var cmsRequest = new CmsPackage.VerifyBasePackagePaymentRequest { OrderId = request.OrderId, TransactionId = request.TransactionId, PaymentSuccess = true, RefId = verifyResponse.RefId, Message = verifyResponse.Message }; var cmsResponse = await _context.Package.VerifyBasePackagePaymentAsync( cmsRequest, cancellationToken: cancellationToken); return new VerifyBasePackagePaymentResponseDto { Success = cmsResponse.Success, Message = cmsResponse.Message, OrderId = cmsResponse.OrderId, TransactionId = cmsResponse.TransactionId, RefId = cmsResponse.ReferenceCode, WalletBalance = cmsResponse.WalletBalance, DiscountBalance = cmsResponse.DiscountBalance }; } /// /// اطلاع دادن به CMS که پرداخت ناموفق بود /// private async Task NotifyCmsPaymentFailed(long orderId, long transactionId, string reason, CancellationToken cancellationToken) { var cmsRequest = new CmsPackage.VerifyBasePackagePaymentRequest { OrderId = orderId, TransactionId = transactionId, PaymentSuccess = false, Message = reason }; await _context.Package.VerifyBasePackagePaymentAsync(cmsRequest, cancellationToken: cancellationToken); } }