From 0bbc11e82cf1fb5e55b81a45f817d9c15dd54a21 Mon Sep 17 00:00:00 2001 From: masoodafar-web Date: Thu, 26 Feb 2026 03:33:58 +0330 Subject: [PATCH] Phase 8a: Wire up Checkout page to Customer* RPCs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Checkout.razor.cs: Rewrite ProcessPayment() to use CustomerPurchasePackageAsync instead of disabled dead code (old TransactionsContract + UserOrderContract flow removed) - Callback URL now points to /profile/payment-callback (reuses existing verify page with CustomerVerifyPackagePurchase) - Remove unused DI: UserOrderContract, TransactionContract - Remove unused usings: Transactions, UserOrder, WellKnownTypes - Profile/Index.razor.cs: Rename basePackage → selectedPackage, tempCallbackUrl → callbackUrl (cosmetic) - Build: 0 errors --- src/FrontOffice.Main/Pages/Checkout.razor.cs | 50 +++++++------------ .../Pages/Profile/Index.razor.cs | 13 +++-- 2 files changed, 25 insertions(+), 38 deletions(-) diff --git a/src/FrontOffice.Main/Pages/Checkout.razor.cs b/src/FrontOffice.Main/Pages/Checkout.razor.cs index b132c8d..cdb5cb2 100644 --- a/src/FrontOffice.Main/Pages/Checkout.razor.cs +++ b/src/FrontOffice.Main/Pages/Checkout.razor.cs @@ -1,10 +1,7 @@ using CMSMicroservice.Protobuf.Protos.Package; -using CMSMicroservice.Protobuf.Protos.Transactions; using CMSMicroservice.Protobuf.Protos.UserAddress; -using CMSMicroservice.Protobuf.Protos.UserOrder; using FrontOffice.Main.Utilities; -using Google.Protobuf.WellKnownTypes; using Microsoft.AspNetCore.Components; using MudBlazor; using Severity = MudBlazor.Severity; @@ -15,8 +12,6 @@ public partial class Checkout { [Inject] private PackageContract.PackageContractClient PackageClient { get; set; } = default!; [Inject] private UserAddressContract.UserAddressContractClient UserAddressContract { get; set; } = default!; - [Inject] private UserOrderContract.UserOrderContractClient UserOrderContract { get; set; } = default!; - [Inject] private TransactionsContract.TransactionsContractClient TransactionContract { get; set; } = default!; [Parameter] public long? PackageId { get; set; } @@ -173,9 +168,6 @@ public partial class Checkout private async Task ProcessPayment() { - Snackbar.Add("درگاه پرداخت متصل نیست! لطفا در زمان دیگری مجددا تلاش فرمایید!", Severity.Warning); - return; - if (!CanProceedToPayment || _selectedPackage == null || _selectedAddress == null) { Snackbar.Add("لطفاً پکیج و آدرس را انتخاب کنید.", Severity.Warning); @@ -186,33 +178,29 @@ public partial class Checkout try { - // Step 1: Create payment request - var paymentRequest = new CustomerPaymentRequestRequest + var callbackUrl = $"{Navigation.BaseUri}profile/payment-callback"; + + var response = await PackageClient.CustomerPurchasePackageAsync(new CustomerPurchasePackageRequest { - Amount = _finalPrice, - CallbackUrl = $"{Navigation.BaseUri}checkout/callback", - Description = $"خرید پکیج {_selectedPackage.Title}", - Currency = CurrencyEnum.Irt, - Type = TransactionTypeEnum.Real - }; - - var paymentResponse = await TransactionContract.CustomerPaymentRequestAsync(paymentRequest); - - if (string.IsNullOrEmpty(paymentResponse.PaymentGWUrl)) - Snackbar.Add("آدرس درگاه پرداخت دریافت نشد.", Severity.Error); - - // Step 2: Create user order - var orderRequest = new CreateNewUserOrderRequest - { - Amount = _finalPrice, PackageId = _selectedPackage.Id, - PaymentStatus = CMSMicroservice.Protobuf.Protos.PaymentStatus.Pending - }; + CallbackUrl = callbackUrl, + PurchaseMethod = PurchaseMethodEnum.PurchaseMethodGateway + }); - var orderResponse = await UserOrderContract.CreateNewUserOrderAsync(orderRequest); + if (!response.Success) + { + Snackbar.Add(response.Message ?? "خطا در آغاز فرآیند پرداخت", Severity.Error); + return; + } - // Step 3: Redirect to payment gateway - Navigation.NavigateTo(paymentResponse.PaymentGWUrl); + if (!string.IsNullOrEmpty(response.PaymentGatewayUrl)) + { + Navigation.NavigateTo(response.PaymentGatewayUrl, forceLoad: true); + } + else + { + Snackbar.Add("خطا در دریافت آدرس درگاه پرداخت", Severity.Error); + } } catch (Exception ex) { diff --git a/src/FrontOffice.Main/Pages/Profile/Index.razor.cs b/src/FrontOffice.Main/Pages/Profile/Index.razor.cs index 26a88c2..06ee349 100644 --- a/src/FrontOffice.Main/Pages/Profile/Index.razor.cs +++ b/src/FrontOffice.Main/Pages/Profile/Index.razor.cs @@ -413,23 +413,22 @@ public partial class Index try { - // Get available packages and pick the first (base) one + // Get available packages and pick the first one var packages = await PackageContract.GetCustomerPackagesAsync(new GetCustomerPackagesRequest()); - var basePackage = packages?.Models?.FirstOrDefault(); - if (basePackage == null) + var selectedPackage = packages?.Models?.FirstOrDefault(); + if (selectedPackage == null) { Snackbar.Add("پکیجی برای خرید یافت نشد", Severity.Error); return; } // Call CMS to initiate purchase (UserId from JWT, PackageId explicit) - // First, get orderId — then embed in callback URL - var tempCallbackUrl = $"{Navigation.BaseUri}profile/payment-callback"; + var callbackUrl = $"{Navigation.BaseUri}profile/payment-callback"; var response = await PackageContract.CustomerPurchasePackageAsync(new CustomerPurchasePackageRequest { - PackageId = basePackage.Id, - CallbackUrl = tempCallbackUrl, + PackageId = selectedPackage.Id, + CallbackUrl = callbackUrl, PurchaseMethod = PurchaseMethodEnum.PurchaseMethodGateway });