106 lines
4.2 KiB
C#
106 lines
4.2 KiB
C#
using CmsPackage = CMSMicroservice.Protobuf.Protos.Package;
|
|
using PYMSMicroservice.Protobuf.Protos.Transaction;
|
|
|
|
namespace FrontOffice.BFF.Application.PackageCQ.Commands.VerifyBasePackagePayment;
|
|
|
|
/// <summary>
|
|
/// Handler برای تأیید پرداخت پکیج پایه
|
|
/// 1. ابتدا PYMS فراخوانی میشود برای Verify پرداخت
|
|
/// 2. سپس CMS فراخوانی میشود برای تکمیل یا رد تراکنش
|
|
/// </summary>
|
|
public class VerifyBasePackagePaymentCommandHandler : IRequestHandler<VerifyBasePackagePaymentCommand, VerifyBasePackagePaymentResponseDto>
|
|
{
|
|
private readonly IApplicationContractContext _context;
|
|
|
|
public VerifyBasePackagePaymentCommandHandler(IApplicationContractContext context)
|
|
{
|
|
_context = context;
|
|
}
|
|
|
|
public async Task<VerifyBasePackagePaymentResponseDto> 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
|
|
};
|
|
}
|
|
|
|
/// <summary>
|
|
/// اطلاع دادن به CMS که پرداخت ناموفق بود
|
|
/// </summary>
|
|
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);
|
|
}
|
|
}
|