using CmsPackage = CMSMicroservice.Protobuf.Protos.Package; using PYMSMicroservice.Protobuf.Protos; using PYMSMicroservice.Protobuf.Protos.Transaction; namespace FrontOffice.BFF.Application.PackageCQ.Commands.InitiateBasePackagePayment; /// /// Handler برای درخواست پرداخت پکیج پایه 56 میلیون تومان /// 1. ابتدا CMS فراخوانی می‌شود برای ثبت Transaction و Order /// 2. سپس PYMS فراخوانی می‌شود برای دریافت URL درگاه پرداخت /// public class InitiateBasePackagePaymentCommandHandler : IRequestHandler { private readonly IApplicationContractContext _context; private readonly ICurrentUserService _currentUserService; private const string ZarinpalMerchantId = "6b098fc8-f490-47a1-aac3-1de1a1b84404"; public InitiateBasePackagePaymentCommandHandler(IApplicationContractContext context, ICurrentUserService currentUserService) { _context = context; _currentUserService = currentUserService; } public async Task Handle(InitiateBasePackagePaymentCommand request, CancellationToken cancellationToken) { // 1. ابتدا CMS را فراخوانی کن برای ثبت تراکنش و سفارش var cmsRequest = new CmsPackage.InitiateBasePackagePaymentRequest { UserId = _currentUserService.UserId.Value }; var cmsResponse = await _context.Package.InitiateBasePackagePaymentAsync( cmsRequest, cancellationToken: cancellationToken); // اگر CMS خطا داد if (!cmsResponse.Success) { return new InitiateBasePackagePaymentResponseDto { Success = false, Message = cmsResponse.Message }; } // 2. حالا PYMS را برای دریافت URL درگاه فراخوانی کن // مبلغ به ریال (56 میلیون تومان = 560,000,000 ریال) var paymentRequest = new PaymentRequestRequest { MerchantId = ZarinpalMerchantId, Amount = cmsResponse.Amount * 10, // تبدیل تومان به ریال CallbackUrl = $"{request.CallbackUrl}?orderId={cmsResponse.OrderId}&transactionId={cmsResponse.TransactionId}", Description = "پرداخت پکیج پایه", Currency = CurrencyEnum.Irr, Type = TransactionTypeEnum.Sandbox, OrderId = cmsResponse.OrderId.ToString() }; var paymentResponse = await _context.ZarinTransactions.PaymentRequestAsync( paymentRequest, cancellationToken: cancellationToken); // اگر درگاه URL برنگردانده if (string.IsNullOrEmpty(paymentResponse.PaymentGWUrl)) { return new InitiateBasePackagePaymentResponseDto { Success = false, Message = "خطا در دریافت آدرس درگاه پرداخت", OrderId = cmsResponse.OrderId, TransactionId = cmsResponse.TransactionId }; } // استخراج Authority از URL // URL معمولا به شکل: https://www.zarinpal.com/pg/StartPay/{Authority} var authority = ExtractAuthorityFromUrl(paymentResponse.PaymentGWUrl); return new InitiateBasePackagePaymentResponseDto { Success = true, Message = "لطفا برای تکمیل پرداخت به درگاه بانکی مراجعه کنید", OrderId = cmsResponse.OrderId, TransactionId = cmsResponse.TransactionId, Amount = cmsResponse.Amount, PaymentGatewayUrl = paymentResponse.PaymentGWUrl, Authority = authority }; } private static string ExtractAuthorityFromUrl(string url) { // URL: https://www.zarinpal.com/pg/StartPay/{Authority} if (string.IsNullOrEmpty(url)) return string.Empty; var parts = url.TrimEnd('/').Split('/'); return parts.Length > 0 ? parts[^1] : string.Empty; } }