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