diff --git a/EventPlatform.Infrastructure/Services/Payment/PaymentService.cs b/EventPlatform.Infrastructure/Services/Payment/PaymentService.cs index 0403256..8290d41 100644 --- a/EventPlatform.Infrastructure/Services/Payment/PaymentService.cs +++ b/EventPlatform.Infrastructure/Services/Payment/PaymentService.cs @@ -192,76 +192,90 @@ private async Task SendTicketEmailAsync(Transaction transaction) var priceStr = transaction.Amount.ToString("N0", new CultureInfo("vi-VN")); var dateStr = evt.StartTime.ToString("dd/MM/yyyy HH:mm"); - // Nội dung chung + // Nội dung chung (Thông tin đơn hàng) string commonInfo = $@" -

Thanh toán thành công!

-

Xin chào {user.FullName},

-

Cảm ơn bạn đã đặt vé. Dưới đây là thông tin vé của bạn:

-
- "; +
+

Thanh toán thành công!

+

Xin chào {user.FullName},

+

Cảm ơn bạn đã đặt vé. Dưới đây là thông tin giao dịch của bạn:

+
+ +
+
"; // Xử lý logic Online vs Offline if (evt.EventType == "Online") { string joinLink = evt.OnlineUrl ?? "#"; - // Tạo link tham gia kèm token để verify (nếu hệ thống hỗ trợ) - // var secureLink = $"{joinLink}?token={registration.UniqueToken}"; body = commonInfo + $@" -
-

ℹ️ Hướng dẫn tham gia Online

-

Sự kiện sẽ diễn ra trực tuyến. Vui lòng truy cập vào đường dẫn dưới đây đúng giờ:

-

- - THAM GIA NGAY - -

-

Mã vé của bạn: {registration.UniqueToken}

-
"; +
+
+

ℹ️ Hướng dẫn tham gia Online

+

Sự kiện sẽ diễn ra trực tuyến. Vui lòng truy cập vào đường dẫn dưới đây đúng giờ:

+
+
+ + THAM GIA NGAY + +
+

Mã vé của bạn: {registration.UniqueToken}

+
+
"; } else // Offline { - // 1. Tạo object chứa thông tin hiển thị trong QR + // 1. Tạo object chứa thông tin hiển thị trong QR (JSON) var qrPayload = new { - Token = registration.UniqueToken, // Cái này quan trọng nhất để verify - Event = evt.Title.Length > 20 ? evt.Title.Substring(0, 17) + "..." : evt.Title, + Token = registration.UniqueToken, + Event = evt.Title.Length > 20 ? evt.Title.Substring(0, 17) + "..." : evt.Title, User = user.FullName, Type = ticketType.Name }; - // 2. Chuyển sang JSON string: {"Token":"...","Event":"...","User":"..."} + // 2. Chuyển sang JSON string & Mã hóa URL string jsonString = JsonSerializer.Serialize(qrPayload); - - // 3. Mã hóa URL để gửi qua API (vì JSON chứa ký tự đặc biệt như { } " :) string encodedData = Uri.EscapeDataString(jsonString); - // 4. Gọi API tạo QR - // Lưu ý: QR chứa nhiều thông tin thì điểm ảnh sẽ nhỏ hơn, nên tăng size lên 300x300 - string qrUrl = $"https://api.qrserver.com/v1/create-qr-code/?size=300x300&data={encodedData}"; - + // 3. API QR Code (Thêm margin=15 để tạo viền trắng đẹp hơn) + string qrUrl = $"https://api.qrserver.com/v1/create-qr-code/?size=300x300&margin=15&data={encodedData}"; string location = evt.Location ?? evt.VenueName; + // 4. Giao diện Vé "Xịn" (Ticket Card Style) body = commonInfo + $@" -
-

📍 Vé Check-in Sự Kiện

-

Địa điểm: {location}

-

Vui lòng đưa mã QR này cho nhân viên soát vé:

-
- Ticket QR Code -

{registration.UniqueToken}

-
-
"; +
+
+

VÉ THAM DỰ

+

Vui lòng xuất trình tại quầy soát vé

+
+ +
+ + Check-in QR Code + +
+ +
+

Khách hàng

+

{user.FullName}

+ +

Địa điểm

+

📍 {location}

+
+
+
"; } // Footer - body += "

Cảm ơn bạn đã sử dụng EventPlatform!

"; + body += "

Cảm ơn bạn đã sử dụng EventPlatform!

"; await _emailSender.SendEmailAsync(user.Email, subject, body); } diff --git a/EventPlatform.WebApi/Properties/PublishProfiles/site43643-WebDeploy1.pubxml.user b/EventPlatform.WebApi/Properties/PublishProfiles/site43643-WebDeploy1.pubxml.user index ded38ca..f28f2b5 100644 --- a/EventPlatform.WebApi/Properties/PublishProfiles/site43643-WebDeploy1.pubxml.user +++ b/EventPlatform.WebApi/Properties/PublishProfiles/site43643-WebDeploy1.pubxml.user @@ -7,7 +7,7 @@ by editing this MSBuild file. In order to learn more about this please visit htt AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAA22yD33++aECv3fPWH7DG0AAAAAACAAAAAAAQZgAAAAEAACAAAABo6DtgrbgxHE1/HkxqAbK89tJXDm4VuQTXlq/bgbfzxgAAAAAOgAAAAAIAACAAAADOLcWWEqsGYwr9ph1zUWkdE+gL6c9NPc2VIy5/EkKY+yAAAABNoGvWzXxy4i/aYDdnngZtHSYEBSl9c3xIpa3iYYE5p0AAAACEfPzUvkWrhD0ld9CidH0HJB+lESVHmmFZEHYUNProsKQKxN9kgNx/0v/NokC4PSGNMFB+q/AwQ40jMyu4ehap - True|2025-11-20T03:11:00.2059137Z||;True|2025-11-20T01:16:41.1577629+07:00||;True|2025-11-19T22:43:34.5684626+07:00||;True|2025-11-19T20:48:52.2878657+07:00||;True|2025-11-19T17:47:33.5442075+07:00||;True|2025-11-19T17:36:26.5764423+07:00||;True|2025-11-19T17:32:40.0380205+07:00||;True|2025-11-19T17:24:29.7499869+07:00||;True|2025-11-19T17:13:50.9583009+07:00||;True|2025-11-19T17:11:30.6363448+07:00||;True|2025-11-19T17:07:33.5261807+07:00||;True|2025-11-19T16:30:41.4081440+07:00||; + True|2025-11-20T04:14:00.3510654Z||;True|2025-11-20T11:13:16.3269180+07:00||;True|2025-11-20T10:11:00.2059137+07:00||;True|2025-11-20T01:16:41.1577629+07:00||;True|2025-11-19T22:43:34.5684626+07:00||;True|2025-11-19T20:48:52.2878657+07:00||;True|2025-11-19T17:47:33.5442075+07:00||;True|2025-11-19T17:36:26.5764423+07:00||;True|2025-11-19T17:32:40.0380205+07:00||;True|2025-11-19T17:24:29.7499869+07:00||;True|2025-11-19T17:13:50.9583009+07:00||;True|2025-11-19T17:11:30.6363448+07:00||;True|2025-11-19T17:07:33.5261807+07:00||;True|2025-11-19T16:30:41.4081440+07:00||; \ No newline at end of file diff --git a/EventPlatform.WebApi/web.config b/EventPlatform.WebApi/web.config index 9f53780..841c013 100644 --- a/EventPlatform.WebApi/web.config +++ b/EventPlatform.WebApi/web.config @@ -3,17 +3,24 @@ - - - + + + + + + + + + +