<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:media="http://search.yahoo.com/mrss/" >

<channel>
	<title>Code &#8211; AnonyViet</title>
	<atom:link href="https://anonyviet.com/category/thu-thuat/code/feed/" rel="self" type="application/rss+xml" />
	<link>https://anonyviet.com</link>
	<description>Webiste chia sẻ kiến thức công nghệ thông tin, mạng máy tính, bảo mật phổ biến nhất Việt Nam. Luôn cập nhật tin tức, thủ thuật nóng hổi nhất</description>
	<lastBuildDate>Sun, 22 Mar 2026 14:13:27 +0000</lastBuildDate>
	<language>vi</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://anonyviet.com/wp-content/uploads/2018/10/cropped-ico-logo-75x75.png</url>
	<title>Code &#8211; AnonyViet</title>
	<link>https://anonyviet.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Cách dùng Google Stitch: Thiết kế giao diện ứng dụng bằng AI cực nhanh</title>
		<link>https://anonyviet.com/cach-dung-google-stitch-thiet-ke-giao-dien-ung-dung-bang-ai-cuc-nhanh/</link>
					<comments>https://anonyviet.com/cach-dung-google-stitch-thiet-ke-giao-dien-ung-dung-bang-ai-cuc-nhanh/#respond</comments>
		
		<dc:creator><![CDATA[Thanh Kim]]></dc:creator>
		<pubDate>Sun, 22 Mar 2026 14:13:27 +0000</pubDate>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[ai]]></category>
		<category><![CDATA[google stitch]]></category>
		<category><![CDATA[Stitch]]></category>
		<category><![CDATA[UI]]></category>
		<guid isPermaLink="false">https://anonyviet.com/?p=99537</guid>

					<description><![CDATA[Cách dùng Google Stitch mang lại giải pháp thiết kế giao diện hiện đại dựa trên sức mạnh của mô hình Gemini. Dù bạn là designer chuyên nghiệp hay người mới, công cụ này đều giúp rút ngắn quy trình làm việc đáng kể. Hãy cùng AnonyViet tìm hiểu cách vận hành của Google Stitch [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><strong>Cách dùng Google Stitch</strong> mang lại giải pháp thiết kế giao diện hiện đại dựa trên sức mạnh của mô hình Gemini. Dù bạn là designer chuyên nghiệp hay người mới, công cụ này đều giúp rút ngắn quy trình làm việc đáng kể. Hãy cùng AnonyViet tìm hiểu cách vận hành của Google Stitch nhé.</p>
<h2><strong>Google Stitch là gì và khả năng ứng dụng thực tế</strong></h2>
<p>Google Stitch là một sản phẩm thử nghiệm từ Google Labs, được thiết kế để hỗ trợ người dùng tạo ra các giao diện người dùng (UI) thông qua trí tuệ nhân tạo. Thay vì phải bắt đầu từ một trang trắng trong các phần mềm đồ họa, bạn có thể sử dụng mô tả văn bản, hình ảnh hoặc các bản vẽ phác thảo để AI tự động dựng lên layout.</p>
<p>Mục đích chính của công cụ này là giúp các nhà phát triển, quản lý sản phẩm (PM) và designer rút ngắn giai đoạn lên ý tưởng (ideation) và tạo bản mẫu (prototype). Với sự hỗ trợ của mô hình<a href="https://anonyviet.com/cach-chat-an-danh-tren-gemini-cho-nhung-cuoc-tro-chuyen-rieng-tu/"><strong> Gemini</strong></a>, Google Stitch có khả năng hiểu các yêu cầu phức tạp và chuyển đổi chúng thành các thành phần giao diện trực quan, có tính thẩm mỹ cao.</p>
<figure id="attachment_99539" aria-describedby="caption-attachment-99539" style="width: 600px" class="wp-caption aligncenter"><img fetchpriority="high" decoding="async" class="wp-image-99539 size-full" src="https://anonyviet.com/wp-content/uploads/2026/03/cach-dung-google-stitch-1.jpg" alt="Google Stitch là gì và khả năng ứng dụng thực tế" width="600" height="257" title="Cách dùng Google Stitch: Thiết kế giao diện ứng dụng bằng AI cực nhanh 1" srcset="https://anonyviet.com/wp-content/uploads/2026/03/cach-dung-google-stitch-1.jpg 600w, https://anonyviet.com/wp-content/uploads/2026/03/cach-dung-google-stitch-1-300x129.jpg 300w" sizes="(max-width: 600px) 100vw, 600px" /><figcaption id="caption-attachment-99539" class="wp-caption-text">Google Stitch là gì và khả năng ứng dụng thực tế<span style="color: #333333; font-size: 15px;">    </span></figcaption></figure>
<h2><strong>Cách dùng Google Stitch để thiết kế UI chuyên nghiệp</strong></h2>
<p>Để tận dụng tối đa sức mạnh của trí tuệ nhân tạo trong thiết kế, bạn cần nắm vững quy trình 5 bước cơ bản dưới đây:</p>
<h3><strong>Bước 1: Khởi động và thiết lập không gian làm việc</strong></h3>
<p>Đầu tiên, bạn cần truy cập vào trang web chính thức của <a href="https://stitch.withgoogle.com/" rel="noopener"><strong>Stitch</strong></a> trong hệ sinh thái Google Labs. Nhấn<strong> Try Now</strong> để đăng nhập bằng tài khoản Google cá nhân.</p>
<figure id="attachment_99540" aria-describedby="caption-attachment-99540" style="width: 600px" class="wp-caption aligncenter"><img decoding="async" class="wp-image-99540 size-full" src="https://anonyviet.com/wp-content/uploads/2026/03/cach-dung-google-stitch-2.jpg" alt="Cách dùng Google Stitch" width="600" height="259" title="Cách dùng Google Stitch: Thiết kế giao diện ứng dụng bằng AI cực nhanh 2" srcset="https://anonyviet.com/wp-content/uploads/2026/03/cach-dung-google-stitch-2.jpg 600w, https://anonyviet.com/wp-content/uploads/2026/03/cach-dung-google-stitch-2-300x130.jpg 300w" sizes="(max-width: 600px) 100vw, 600px" /><figcaption id="caption-attachment-99540" class="wp-caption-text">Cách dùng Google Stitch</figcaption></figure>
<p>Tại giao diện chính, bạn có thể quản lý các dự án cũ hoặc bắt đầu một dự án mới. Đừng quên vào phần cài đặt (Settings) để tùy chỉnh quyền riêng tư, đặc biệt là tùy chọn cho phép Google sử dụng dữ liệu của bạn để huấn luyện AI hay không (Nhấn vào <strong>avatar</strong> &gt; Chọn<strong> Cài đặt Stitch</strong> &gt; Bỏ tích ở ô <strong>Cho phép huấn luyện mô hình AI</strong>).</p>
<figure id="attachment_99541" aria-describedby="caption-attachment-99541" style="width: 600px" class="wp-caption aligncenter"><img decoding="async" class="wp-image-99541 size-full" src="https://anonyviet.com/wp-content/uploads/2026/03/cach-dung-google-stitch-3.jpg" alt="Tắt Google sử dụng dữ liệu để huấn luyện AI" width="600" height="400" title="Cách dùng Google Stitch: Thiết kế giao diện ứng dụng bằng AI cực nhanh 3" srcset="https://anonyviet.com/wp-content/uploads/2026/03/cach-dung-google-stitch-3.jpg 600w, https://anonyviet.com/wp-content/uploads/2026/03/cach-dung-google-stitch-3-300x200.jpg 300w" sizes="(max-width: 600px) 100vw, 600px" /><figcaption id="caption-attachment-99541" class="wp-caption-text">Tắt Google sử dụng dữ liệu để huấn luyện AI</figcaption></figure>
<h3><strong>Bước 2: Hiện thực hóa ý tưởng qua câu lệnh</strong></h3>
<p>Bạn sẽ nhập các câu lệnh bằng tiếng Anh mô tả giao diện mình mong muốn. Ví dụ: “<strong>A trip packing checklist app that suggests what to pack based on your destination&#8217;s weather and trip type</strong>”.</p>
<p>Bạn có thể chọn thiết kế cho giao diện trên ứng dụng hoặc website. Sau đó nhấn Enter.</p>
<figure id="attachment_99542" aria-describedby="caption-attachment-99542" style="width: 600px" class="wp-caption aligncenter"><img decoding="async" class="wp-image-99542 size-full" src="https://anonyviet.com/wp-content/uploads/2026/03/cach-dung-google-stitch-4.jpg" alt="Hiện thực hóa ý tưởng qua câu lệnh" width="600" height="315" title="Cách dùng Google Stitch: Thiết kế giao diện ứng dụng bằng AI cực nhanh 4" srcset="https://anonyviet.com/wp-content/uploads/2026/03/cach-dung-google-stitch-4.jpg 600w, https://anonyviet.com/wp-content/uploads/2026/03/cach-dung-google-stitch-4-300x158.jpg 300w" sizes="(max-width: 600px) 100vw, 600px" /><figcaption id="caption-attachment-99542" class="wp-caption-text">Hiện thực hóa ý tưởng qua câu lệnh</figcaption></figure>
<h3><strong>Bước 3: Tối ưu hóa thiết kế từ hình ảnh tham chiếu</strong></h3>
<p>Nếu bạn đã có sẵn một bản vẽ tay trên giấy hoặc một mẫu wireframe thô, hãy tải chúng lên hệ thống. AI sẽ phân tích bố cục từ hình ảnh đó để xây dựng giao diện UI tương ứng.</p>
<figure id="attachment_99543" aria-describedby="caption-attachment-99543" style="width: 600px" class="wp-caption aligncenter"><img decoding="async" class="wp-image-99543 size-full" src="https://anonyviet.com/wp-content/uploads/2026/03/cach-dung-google-stitch-5.jpg" alt="Tối ưu hóa thiết kế từ hình ảnh tham chiếu" width="600" height="400" title="Cách dùng Google Stitch: Thiết kế giao diện ứng dụng bằng AI cực nhanh 5" srcset="https://anonyviet.com/wp-content/uploads/2026/03/cach-dung-google-stitch-5.jpg 600w, https://anonyviet.com/wp-content/uploads/2026/03/cach-dung-google-stitch-5-300x200.jpg 300w" sizes="(max-width: 600px) 100vw, 600px" /><figcaption id="caption-attachment-99543" class="wp-caption-text">Tối ưu hóa thiết kế từ hình ảnh tham chiếu</figcaption></figure>
<h3><strong>Bước 4: Tinh chỉnh giao diện</strong></h3>
<p>Sau khi AI trả về kết quả đầu tiên, bạn có thể tiếp tục yêu cầu chỉnh sửa. Bạn có thể ra lệnh cho AI thay đổi font chữ, điều chỉnh màu sắc chủ đạo hoặc thêm các nút bấm mới. Một tính năng hay trong cách dùng Google Stitch là bạn có thể tạo ra nhiều biến thể khác nhau cho cùng một màn hình để so sánh trước khi chốt phương án cuối cùng.</p>
<figure id="attachment_99544" aria-describedby="caption-attachment-99544" style="width: 600px" class="wp-caption aligncenter"><img decoding="async" class="wp-image-99544 size-full" src="https://anonyviet.com/wp-content/uploads/2026/03/cach-dung-google-stitch-6.jpg" alt="Tinh chỉnh giao diện" width="600" height="400" title="Cách dùng Google Stitch: Thiết kế giao diện ứng dụng bằng AI cực nhanh 6" srcset="https://anonyviet.com/wp-content/uploads/2026/03/cach-dung-google-stitch-6.jpg 600w, https://anonyviet.com/wp-content/uploads/2026/03/cach-dung-google-stitch-6-300x200.jpg 300w" sizes="(max-width: 600px) 100vw, 600px" /><figcaption id="caption-attachment-99544" class="wp-caption-text">Tinh chỉnh giao diện</figcaption></figure>
<h3><strong>Bước 5: Chuyển đổi sang mã nguồn và Figma</strong></h3>
<p>Khi đã hài lòng với bản thiết kế, bạn có thể xuất sản phẩm dưới dạng mã nguồn HTML và CSS. Điều này cực kỳ hữu ích cho các lập trình viên frontend để xây dựng khung xương cho ứng dụng. Ngoài ra, việc xuất sang Figma cũng giúp các designer chuyên nghiệp tiếp tục tinh chỉnh các chi tiết nhỏ nhất mà AI chưa xử lý hoàn hảo.</p>
<figure id="attachment_99546" aria-describedby="caption-attachment-99546" style="width: 600px" class="wp-caption aligncenter"><img decoding="async" class="wp-image-99546 size-full" src="https://anonyviet.com/wp-content/uploads/2026/03/cach-dung-google-stitch-8.jpg" alt="Chuyển đổi sang mã nguồn và Figma" width="600" height="400" title="Cách dùng Google Stitch: Thiết kế giao diện ứng dụng bằng AI cực nhanh 7" srcset="https://anonyviet.com/wp-content/uploads/2026/03/cach-dung-google-stitch-8.jpg 600w, https://anonyviet.com/wp-content/uploads/2026/03/cach-dung-google-stitch-8-300x200.jpg 300w" sizes="(max-width: 600px) 100vw, 600px" /><figcaption id="caption-attachment-99546" class="wp-caption-text">Chuyển đổi sang mã nguồn và Figma</figcaption></figure>
<h2><strong>So sánh Google Stitch và phần mềm thiết kế truyền thống</strong></h2>
<p>Để hiểu rõ hơn về giá trị của công cụ này, hãy cùng xem bảng so sánh dưới đây:</p>
<table style="width: 82.6205%;">
<tbody>
<tr>
<td style="text-align: center; width: 23.8245%;"><b>Đặc điểm</b></td>
<td style="text-align: center; width: 29.3103%;"><b>Google Stitch (AI)</b></td>
<td style="text-align: center; width: 44.4802%;"><b>Phần mềm truyền thống (Figma/Adobe XD)</b></td>
</tr>
<tr>
<td style="text-align: center; width: 23.8245%;"><b>Tốc độ khởi tạo</b></td>
<td style="text-align: center; width: 29.3103%;"><span style="font-weight: 400;">Cực nhanh (vài phút)</span></td>
<td style="text-align: center; width: 44.4802%;"><span style="font-weight: 400;">Chậm (cần vẽ thủ công từng thành phần)</span></td>
</tr>
<tr>
<td style="text-align: center; width: 23.8245%;"><b>Độ chính xác</b></td>
<td style="text-align: center; width: 29.3103%;"><span style="font-weight: 400;">Tương đối, cần tinh chỉnh lại</span></td>
<td style="text-align: center; width: 44.4802%;"><span style="font-weight: 400;">Tuyệt đối theo ý người vẽ</span></td>
</tr>
<tr>
<td style="text-align: center; width: 23.8245%;"><b>Yêu cầu kỹ năng</b></td>
<td style="text-align: center; width: 29.3103%;"><span style="font-weight: 400;">Thấp, chỉ cần biết viết prompt</span></td>
<td style="text-align: center; width: 44.4802%;"><span style="font-weight: 400;">Cao, cần kiến thức về UI/UX</span></td>
</tr>
<tr>
<td style="text-align: center; width: 23.8245%;"><b>Khả năng xuất code</b></td>
<td style="text-align: center; width: 29.3103%;"><span style="font-weight: 400;">Hỗ trợ xuất HTML/CSS cơ bản</span></td>
<td style="text-align: center; width: 44.4802%;"><span style="font-weight: 400;">Cần plugin hoặc công cụ bên thứ ba</span></td>
</tr>
<tr>
<td style="text-align: center; width: 23.8245%;"><b>Tính đồng bộ</b></td>
<td style="text-align: center; width: 29.3103%;"><span style="font-weight: 400;">Đang hoàn thiện</span></td>
<td style="text-align: center; width: 44.4802%;"><span style="font-weight: 400;">Rất tốt với hệ thống Design System</span></td>
</tr>
</tbody>
</table>
<h2><strong>Những ưu điểm và rào cản khi sử dụng Google Stitch</strong></h2>
<p>Việc hiểu rõ hai mặt của công cụ sẽ giúp bạn áp dụng cách dùng Google Stitch vào công việc một cách thông minh hơn.</p>
<h3><strong>Ưu điểm</strong></h3>
<ul>
<li>Tiết kiệm tối đa thời gian cho giai đoạn brainstorming.</li>
<li>Giao diện trực quan, dễ tiếp cận cho cả những người không có nền tảng về mỹ thuật.</li>
<li>Khả năng biến ý tưởng trừu tượng thành hình ảnh trực quan một cách kỳ diệu.</li>
</ul>
<h3><strong>Hạn chế</strong></h3>
<ul>
<li>Độ đồng bộ giữa các luồng màn hình (flow) phức tạp đôi khi còn rời rạc.</li>
<li>Màu sắc và khoảng cách (spacing) có thể chưa đạt chuẩn thiết kế chuyên nghiệp.</li>
<li>Vẫn cần sự can thiệp thủ công của con người để tối ưu hóa mã nguồn và layout.</li>
</ul>
<figure id="attachment_99547" aria-describedby="caption-attachment-99547" style="width: 600px" class="wp-caption aligncenter"><img decoding="async" class="wp-image-99547 size-full" src="https://anonyviet.com/wp-content/uploads/2026/03/cach-dung-google-stitch-9.jpg" alt="Những ưu điểm và rào cản khi sử dụng Google Stitch" width="600" height="400" title="Cách dùng Google Stitch: Thiết kế giao diện ứng dụng bằng AI cực nhanh 8" srcset="https://anonyviet.com/wp-content/uploads/2026/03/cach-dung-google-stitch-9.jpg 600w, https://anonyviet.com/wp-content/uploads/2026/03/cach-dung-google-stitch-9-300x200.jpg 300w" sizes="(max-width: 600px) 100vw, 600px" /><figcaption id="caption-attachment-99547" class="wp-caption-text">Những ưu điểm và rào cản khi sử dụng Google Stitch</figcaption></figure>
<h2><strong>Khi nào bạn nên lựa chọn Google Stitch?</strong></h2>
<p>Bạn nên áp dụng cách dùng Google Stitch khi cần tạo nhanh các bản demo để thuyết trình với khách hàng hoặc cấp trên. Nó cũng là công cụ tuyệt vời để các lập trình viên tự xây dựng giao diện cơ bản cho các dự án cá nhân mà không cần thuê designer. Tuy nhiên, đối với các sản phẩm thương mại quy mô lớn, hãy coi Stitch là bước đệm để tạo ra bản phác thảo chất lượng trước khi chuyển sang các công cụ chuyên dụng khác.</p>
<h2><strong>Lời kết</strong></h2>
<p>Việc nắm vững <strong>cách dùng Google Stitch</strong> sẽ giúp bạn tiết kiệm được rất nhiều thời gian trong giai đoạn lên ý tưởng ban đầu. Đây thực sự là một bước tiến lớn trong việc ứng dụng AI vào lĩnh vực thiết kế sáng tạo. Chúc bạn sớm tạo ra những giao diện ấn tượng cho dự án của mình.</p>
<h2><strong>Những câu hỏi thường gặp</strong></h2>
<p><strong>1. Google Stitch có hỗ trợ tiếng Việt không?</strong></p>
<p>Hiện tại, công cụ hoạt động tốt nhất với các prompt bằng tiếng Anh để đảm bảo AI hiểu chính xác các thuật ngữ chuyên ngành UI/UX.</p>
<p><strong>2. Tôi có thể dùng Google Stitch miễn phí không?</strong></p>
<p>Vì là sản phẩm của Google Labs, công cụ hiện đang cho phép trải nghiệm miễn phí, tuy nhiên có thể có giới hạn về số lượng lượt tạo mỗi tháng.</p>
<p><strong>3. Code xuất ra từ Google Stitch có dùng ngay được không?</strong></p>
<p>Code HTML/CSS từ Stitch cung cấp cấu trúc layout cơ bản, bạn vẫn cần lập trình viên tối ưu lại để đảm bảo tính phản hồi (responsive) và hiệu suất.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://anonyviet.com/cach-dung-google-stitch-thiet-ke-giao-dien-ung-dung-bang-ai-cuc-nhanh/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Pixel Agents: Biến VS Code Thành Văn Phòng Pixel Art Cho AI</title>
		<link>https://anonyviet.com/pixel-agents-vscode/</link>
					<comments>https://anonyviet.com/pixel-agents-vscode/#respond</comments>
		
		<dc:creator><![CDATA[AnonyViet]]></dc:creator>
		<pubDate>Wed, 11 Mar 2026 21:54:19 +0000</pubDate>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[ai]]></category>
		<category><![CDATA[Pixel Agents]]></category>
		<category><![CDATA[visual studio]]></category>
		<guid isPermaLink="false">https://anonyviet.com/?p=99236</guid>

					<description><![CDATA[Bạn có bao giờ cảm thấy hơi… khô khan khi làm việc với AI Agent chỉ qua các dòng lệnh text trong terminal? Bạn muốn biến không gian làm việc thành văn phòng ảo, hãy dùng Pixel Agents. Với các công cụ như Claude Code, Blackbox AI hay các hệ thống multi-agent đang ngày càng [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Bạn có bao giờ cảm thấy hơi… khô khan khi làm việc với AI Agent chỉ qua các dòng lệnh text trong terminal? Bạn muốn biến không gian làm việc thành văn phòng ảo, hãy dùng Pixel Agents.</p>
<p>Với các công cụ như Claude Code, Blackbox AI hay các hệ thống multi-agent đang ngày càng phổ biến trong cộng đồng dev Việt Nam, việc theo dõi AI hoạt động đôi khi giống như nhìn một màn hình log chạy liên tục.</p>
<blockquote><p><strong>Quick Answer:</strong> Pixel Agents là một extension mã nguồn mở cho <strong>Visual Studio Code</strong> giúp biến các AI Agent chạy trong terminal (như Claude Code hoặc Blackbox AI) thành các nhân vật pixel đang làm việc trong một văn phòng ảo. Bạn có thể theo dõi tiến trình AI trực quan, tùy chỉnh layout văn phòng và quan sát trạng thái làm việc theo thời gian thực.</p></blockquote>
<p>Nhưng nếu những AI đó có thể trở thành <strong>những nhân vật pixel đang ngồi code trong văn phòng riêng của bạn</strong> thì sao?</p>
<p>Đó chính là ý tưởng phía sau <strong>Pixel Agents</strong> &#8211; một extension cực thú vị dành cho <a href="https://anonyviet.com/?s=visual+studio"><strong>VS Code</strong></a> giúp trực quan hóa hoạt động của AI Agent theo phong cách pixel art.</p>
<p>Nếu bạn thích cá nhân hóa môi trường làm việc giống như khi tùy biến giao diện VS Code cho lập trình, thì Pixel Agents chắc chắn là thứ đáng thử.</p>
<h2>Pixel Agents là gì?</h2>
<p><img decoding="async" class="aligncenter size-full wp-image-99237" src="https://anonyviet.com/wp-content/uploads/2026/03/Pixel-Agents-vscode.jpg" alt="Pixel Agents vscode" width="644" height="373" title="Pixel Agents: Biến VS Code Thành Văn Phòng Pixel Art Cho AI 10" srcset="https://anonyviet.com/wp-content/uploads/2026/03/Pixel-Agents-vscode.jpg 644w, https://anonyviet.com/wp-content/uploads/2026/03/Pixel-Agents-vscode-300x174.jpg 300w" sizes="(max-width: 644px) 100vw, 644px" /></p>
<p><strong>Pixel Agents</strong> là một extension mã nguồn mở dành cho <strong>Visual Studio Code</strong> giúp hiển thị trạng thái hoạt động của AI Agent dưới dạng các nhân vật pixel trong một không gian văn phòng ảo.</p>
<p>Thay vì chỉ nhìn terminal chạy lệnh, bạn sẽ thấy các nhân vật nhỏ đang:</p>
<ul>
<li>Ngồi gõ máy tính khi AI đang viết code</li>
<li>Đi lại hoặc đứng chờ khi AI đang suy nghĩ</li>
<li>Phát thông báo khi hoàn thành nhiệm vụ</li>
</ul>
<p>Mỗi terminal AI giống như một “nhân viên” trong văn phòng mini của bạn.</p>
<p>Điều này đặc biệt thú vị nếu bạn đang chạy nhiều AI agent cùng lúc để code, debug hoặc tạo nội dung.</p>
<h2>Các tính năng nổi bật của Pixel Agents</h2>
<h3>1. One Agent – One Character</h3>
<p>Mỗi terminal trong VS Code sẽ tương ứng với một nhân vật pixel riêng.</p>
<p>Nếu bạn mở nhiều terminal để chạy nhiều AI agent khác nhau, bạn sẽ thấy một văn phòng đầy “nhân viên AI” đang làm việc cùng lúc.</p>
<h3>2. Live Activity Tracking</h3>
<p>Pixel Agents có thể theo dõi trạng thái hoạt động của terminal theo thời gian thực.</p>
<p>Các trạng thái phổ biến bao gồm:</p>
<ul>
<li>Đang viết code</li>
<li>Đang chờ phản hồi</li>
<li>Đang xử lý tác vụ</li>
<li>Đã hoàn thành công việc</li>
</ul>
<p>Mỗi trạng thái sẽ đi kèm animation và biểu cảm khác nhau.</p>
<h3>3. Office Layout Editor</h3>
<p>Một trong những tính năng thú vị nhất là bạn có thể tự thiết kế văn phòng cho AI.</p>
<p>Bạn có thể:</p>
<ul>
<li>Chọn loại gạch lát sàn</li>
<li>Thêm bàn làm việc</li>
<li>Đặt kệ sách</li>
<li>Trang trí cây xanh</li>
<li>Sắp xếp vị trí các nhân vật</li>
</ul>
<p>Nó giống như đang chơi một game quản lý văn phòng mini ngay trong VS Code.</p>
<h3>4. Nhiều nhân vật Pixel khác nhau</h3>
<p>Pixel Agents cung cấp nhiều nhân vật khác nhau để bạn lựa chọn.</p>
<p>Mỗi nhân vật có animation riêng, giúp văn phòng AI của bạn trở nên sinh động hơn.</p>
<h2>Yêu cầu trước khi cài Pixel Agents</h2>
<p>Trước khi cài đặt extension này, bạn cần chuẩn bị một vài thành phần cơ bản:</p>
<ul>
<li><strong>Visual Studio Code</strong> phiên bản 1.109.0 trở lên</li>
<li>AI Agent CLI chạy trong terminal</li>
<li>Máy tính có khả năng chạy VS Code mượt</li>
</ul>
<p>Các AI Agent phổ biến có thể dùng chung với Pixel Agents:</p>
<ul>
<li>Claude Code CLI</li>
<li>Blackbox AI CLI</li>
<li>Các tool multi-agent chạy trong terminal</li>
</ul>
<p>Nếu bạn đang khám phá hệ sinh thái AI coding, bạn có thể xem thêm hướng dẫn cách sử dụng <a href="https://anonyviet.com/huong-dan-tu-lap-trinh-bang-blackbox-ai/">Blackbox AI</a> để viết code nhanh hơn.</p>
<h2>Hướng dẫn cài đặt Pixel Agents trên VS Code</h2>
<h3>Bước 1: Mở Extension Marketplace</h3>
<p>Mở <strong>Visual Studio Code</strong>, sau đó nhấn tổ hợp phím: <strong>Ctrl + Shift + X</strong></p>
<p>Đây là phím tắt để mở trang quản lý extension.</p>
<h3>Bước 2: Tìm extension Pixel Agents</h3>
<p>Tại thanh tìm kiếm, nhập: <strong>Pixel Agents. </strong>Sau đó nhấn <strong>Install</strong> để cài đặt extension. Hoặc truy cập Extension này để tải về <a href="https://marketplace.visualstudio.com/items?itemName=pablodelucca.pixel-agents" rel="noopener">https://marketplace.visualstudio.com/items?itemName=pablodelucca.pixel-agents</a></p>
<h3>Bước 3: Khởi chạy AI Agent trong terminal</h3>
<p>Sau khi cài xong, bạn chỉ cần mở terminal và chạy AI Agent như bình thường.</p>
<p>Ví dụ:</p>
<ul>
<li>Claude Code</li>
<li>Blackbox CLI</li>
<li>Các AI agent coding khác</li>
</ul>
<p>Pixel Agents sẽ tự động nhận diện terminal và tạo nhân vật tương ứng.</p>
<h3>Bước 4: Thiết kế văn phòng cho AI</h3>
<p>Sau khi extension hoạt động, bạn có thể mở <strong>Layout Editor</strong>.</p>
<p>Tại đây bạn có thể:</p>
<ul>
<li>Chọn sàn nhà</li>
<li>Đặt bàn làm việc</li>
<li>Thêm cây xanh</li>
<li>Di chuyển nhân vật</li>
<li>Sắp xếp không gian văn phòng</li>
</ul>
<p>Kết quả là một văn phòng pixel cực kỳ sinh động.</p>
<h2>Trải nghiệm thực tế khi dùng Pixel Agents</h2>
<p>Khi sử dụng Pixel Agents kết hợp với các AI coding tool, trải nghiệm làm việc thay đổi khá rõ.</p>
<p>Thay vì nhìn terminal chạy log, bạn sẽ thấy:</p>
<ul>
<li>AI đang “ngồi code”</li>
<li>AI “đi lại suy nghĩ” khi xử lý prompt</li>
<li>AI hoàn thành nhiệm vụ và báo hiệu</li>
</ul>
<p>Điều này giúp:</p>
<ul>
<li>Giảm cảm giác nhàm chán khi lập trình</li>
<li>Tạo động lực làm việc</li>
<li>Quan sát tiến trình AI dễ hơn</li>
</ul>
<p>Đặc biệt với các dev đang thử nghiệm <strong>multi-agent workflow</strong>, việc thấy nhiều AI “làm việc cùng lúc” trong một văn phòng ảo thực sự khá thú vị.</p>
<h2>Lỗi thường gặp khi cài Pixel Agents</h2>
<h3>Extension không hiển thị nhân vật</h3>
<p>Nguyên nhân thường gặp:</p>
<ul>
<li>VS Code quá cũ</li>
<li>Terminal chưa chạy AI agent</li>
<li>Extension chưa reload</li>
</ul>
<p>Giải pháp:</p>
<ul>
<li>Cập nhật VS Code lên bản mới</li>
<li>Restart VS Code</li>
<li>Reload window bằng Ctrl + Shift + P → Reload Window</li>
</ul>
<h3>Layout Editor không mở</h3>
<p>Một số trường hợp extension chưa load đầy đủ.</p>
<p>Bạn có thể:</p>
<ul>
<li>Tắt và bật lại extension</li>
<li>Khởi động lại VS Code</li>
</ul>
<h2>FAQ &#8211; Câu hỏi thường gặp</h2>
<h3>Pixel Agents có miễn phí không?</h3>
<p>Có. Đây là extension mã nguồn mở nên bạn có thể cài đặt miễn phí trên VS Code.</p>
<h3>Pixel Agents có ảnh hưởng hiệu năng VS Code không?</h3>
<p>Thông thường không đáng kể. Tuy nhiên nếu bạn chạy nhiều AI agent cùng lúc thì máy yếu có thể giảm hiệu năng.</p>
<h3>Pixel Agents có hoạt động với mọi AI CLI không?</h3>
<p>Phần lớn AI agent chạy trong terminal đều có thể hiển thị, miễn là terminal đó được Pixel Agents nhận diện.</p>
<h3>Có thể tùy chỉnh nhân vật Pixel không?</h3>
<p>Hiện tại extension cung cấp sẵn nhiều nhân vật khác nhau và bạn có thể chọn trong Layout Editor.</p>
<h2>Checklist để bắt đầu sử dụng Pixel Agents</h2>
<ul>
<li>Cài Visual Studio Code bản mới nhất</li>
<li>Mở Extension Marketplace</li>
<li>Tìm và cài Pixel Agents</li>
<li>Khởi chạy AI agent trong terminal</li>
<li>Tùy chỉnh văn phòng trong Layout Editor</li>
<li>Quan sát AI “làm việc” trong môi trường pixel</li>
</ul>
<h2>Kết luận</h2>
<p><strong>Pixel Agents</strong> mang đến một cách tiếp cận hoàn toàn mới khi làm việc với AI coding tools trong VS Code.</p>
<p>Thay vì một terminal khô khan, bạn sẽ có một <strong>văn phòng pixel nơi các AI agent đang làm việc cho bạn</strong>.</p>
<p>Với những lập trình viên yêu thích pixel art hoặc muốn tạo môi trường làm việc thú vị hơn, Pixel Agents chắc chắn là một extension đáng thử.</p>
<p>Thông tin trong bài viết mang tính tham khảo và trải nghiệm thực tế, bạn có thể khám phá thêm các công cụ AI coding khác để tối ưu workflow lập trình của mình.</p>
<h3>Nguồn tham khảo</h3>
<ul>
<li>Trang Extension Marketplace của Pixel Agents</li>
<li>Tài liệu Visual Studio Code</li>
<li>Cộng đồng AI Coding Tools</li>
</ul>
]]></content:encoded>
					
					<wfw:commentRss>https://anonyviet.com/pixel-agents-vscode/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Chia sẻ Code tuyết rơi cho Website đón Giáng Sinh</title>
		<link>https://anonyviet.com/chia-se-code-tuyet-roi-cho-website-don-giang-sinh/</link>
					<comments>https://anonyviet.com/chia-se-code-tuyet-roi-cho-website-don-giang-sinh/#respond</comments>
		
		<dc:creator><![CDATA[AnonyViet]]></dc:creator>
		<pubDate>Mon, 15 Dec 2025 21:08:30 +0000</pubDate>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[code tuyết rơi]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[hiệu ứng]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[tuyết rơi]]></category>
		<guid isPermaLink="false">https://anonyviet.com/?p=97007</guid>

					<description><![CDATA[Mỗi dịp Giáng sinh về, các Website đều thay đổi giao diện để hưởng ứng không khí lễ hội. Một trong những điểm nhấn đơn giản nhưng hiệu quả nhất chính là hiệu ứng tuyết rơi (Snowfall Effect). Tuy nhiên, nhiều script tuyết rơi cũ thường sử dụng thư viện jQuery nặng nề hoặc Canvas [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Mỗi dịp Giáng sinh về, các Website đều thay đổi giao diện để hưởng ứng không khí lễ hội. Một trong những điểm nhấn đơn giản nhưng hiệu quả nhất chính là <strong>hiệu ứng tuyết rơi (Snowfall Effect)</strong>.</p>
<p>Tuy nhiên, nhiều script tuyết rơi cũ thường sử dụng thư viện jQuery nặng nề hoặc Canvas phức tạp khiến website bị chậm, lag trên điện thoại. Trong bài viết này, mình sẽ chia sẻ đoạn <a href="https://anonyviet.com/?s=code+tuy%E1%BA%BFt+r%C6%A1i">code tuyết rơi</a> sử dụng <strong>CSS3 Animation và Vanilla JavaScript</strong> (JS thuần). Đảm bảo 3 tiêu chí: <strong>Siêu nhẹ &#8211; Không gây lag &#8211; Dễ cài đặt</strong>.</p>
<h2>Ưu điểm code tuyết rơi cho Website đón Giáng Sinh</h2>
<ul>
<li><strong>Tối ưu hiệu suất:</strong> Sử dụng <code>CSS Keyframes</code> để tạo chuyển động thay vì tính toán vị trí liên tục bằng JS, giúp giảm tải cho CPU.</li>
<li><strong>Không chặn tương tác:</strong> Đã được xử lý thuộc tính <code>pointer-events: none</code>, giúp người dùng vẫn click được vào các link/nút bấm bên dưới lớp tuyết mà không bị vướng.</li>
<li><strong>Tùy biến cao:</strong> Dễ dàng chỉnh số lượng tuyết, tốc độ rơi và hình dáng bông tuyết.</li>
</ul>
<h2>Full Code hiệu ứng tuyết rơi (HTML/CSS/JS)</h2>
<p><img decoding="async" class="aligncenter size-full wp-image-97009" src="https://anonyviet.com/wp-content/uploads/2025/12/cdoe-tuyet-trang-trang-tri-website.png" alt="cdoe tuyet trang trang tri website" width="748" height="443" title="Chia sẻ Code tuyết rơi cho Website đón Giáng Sinh 13" srcset="https://anonyviet.com/wp-content/uploads/2025/12/cdoe-tuyet-trang-trang-tri-website.png 748w, https://anonyviet.com/wp-content/uploads/2025/12/cdoe-tuyet-trang-trang-tri-website-300x178.png 300w" sizes="(max-width: 748px) 100vw, 748px" /></p>
<p>Dưới đây là đoạn mã đầy đủ. Bạn không cần tải file rườm rà, chỉ cần copy và dán.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">      &lt;style&gt;
  .snowflake {
    position: fixed;
    top: -10px;
    z-index: 9999;
    user-select: none;
    cursor: default;
    animation-name: fall;
    animation-timing-function: linear;
    animation-iteration-count: infinite;
    color: #F527E4; /* Màu tuyết nếu dùng ký tự */
  }

  @keyframes fall {
    to {
      transform: translateY(100vh);
    }
  }
&lt;/style&gt;

&lt;script&gt;
  (function() {
    var snowflakes = [],
        browserWidth, browserHeight,
        numberOfSnowflakes = 50, // Số lượng bông tuyết
        resetPosition = false;

    function setup() {
        window.addEventListener("DOMContentLoaded", generateSnowflakes, false);
        window.addEventListener("resize", setResetFlag, false);
    }

    function setResetFlag(e) {
        resetPosition = true;
    }

    function generateSnowflakes() {

        var originalSnowflake = document.createElement("div");
        originalSnowflake.classList.add("snowflake");
        originalSnowflake.innerHTML = "❄"; 
        originalSnowflake.style.fontSize = "20px"; // Kích thước cơ bản

        var snowflakeContainer = document.body;
        
        browserWidth = document.documentElement.clientWidth;
        browserHeight = document.documentElement.clientHeight;

        for (var i = 0; i &lt; numberOfSnowflakes; i++) {
            var snowflakeClone = originalSnowflake.cloneNode(true);
            snowflakeContainer.appendChild(snowflakeClone);

            var initialX = Math.floor(Math.random() * browserWidth);
            var fallDuration = Math.floor(Math.random() * 10) + 5 + "s";
            var snowflakeSize = Math.floor(Math.random() * 20) + 10 + "px"; // Random kích thước
            var delay = Math.floor(Math.random() * 5) + "s";

            snowflakeClone.style.left = initialX + "px";
            snowflakeClone.style.animationDuration = fallDuration;
            snowflakeClone.style.fontSize = snowflakeSize;
            snowflakeClone.style.animationDelay = delay;
            snowflakeClone.style.opacity = Math.random(); // Độ mờ ngẫu nhiên
        }
    }
    setup();
  })();
&lt;/script&gt;</pre>
<p>Để đổi màu tuyết bạn thay đổi mã màu ở dòng <code>color: #F527E4;</code></p>
<h2>Full Code hiệu ứng tuyết rơi có động tuyết ở chân trang</h2>
<p><img decoding="async" class="aligncenter size-full wp-image-97008" src="https://anonyviet.com/wp-content/uploads/2025/12/code-tuyet-roi-ngung-dong-chan-trang.png" alt="code tuyet roi ngung dong chan trang" width="775" height="720" title="Chia sẻ Code tuyết rơi cho Website đón Giáng Sinh 14" srcset="https://anonyviet.com/wp-content/uploads/2025/12/code-tuyet-roi-ngung-dong-chan-trang.png 775w, https://anonyviet.com/wp-content/uploads/2025/12/code-tuyet-roi-ngung-dong-chan-trang-300x279.png 300w, https://anonyviet.com/wp-content/uploads/2025/12/code-tuyet-roi-ngung-dong-chan-trang-768x713.png 768w, https://anonyviet.com/wp-content/uploads/2025/12/code-tuyet-roi-ngung-dong-chan-trang-750x697.png 750w" sizes="(max-width: 775px) 100vw, 775px" /></p>
<p data-path-to-node="11"><i>Đây là phiên bản nâng cao sử dụng HTML5 Canvas. Hiệu ứng này sẽ cho phép tuyết rơi và đọng lại dưới chân trang web. Theo thời gian, lớp tuyết sẽ dày lên và có thể che phủ màn hình giống như một trận bão tuyết thực sự.</i></p>
<blockquote data-path-to-node="13">
<p data-path-to-node="13,0">Hiệu ứng tuyết tích tụ sẽ <b>che khuất nội dung</b> website của bạn từ dưới lên trên. Hãy cân nhắc kỹ trước khi sử dụng cho trang bán hàng vì khách có thể không nhìn thấy nút &#8220;Mua ngay&#8221; hoặc Footer. Bạn có thể chỉnh biến <code>maxSnowHeight</code> trong code để giới hạn độ cao của tuyết (ví dụ chỉ cho cao 100px rồi dừng).</p>
</blockquote>
<hr data-path-to-node="14" />
<h3 data-path-to-node="15">Giải thích các thông số trong code để bạn tùy chỉnh:</h3>
<ul>
<li data-path-to-node="16,0,0"><code>maxSnowHeight = height;</code>: Tuyết sẽ dâng lên mãi cho đến khi lấp đầy màn hình (full screen). Nếu bạn chỉ muốn nó dâng lên một chút rồi dừng (để không che web), hãy đổi thành số pixel cụ thể, ví dụ: <code>maxSnowHeight = 150;</code>.</li>
<li data-path-to-node="16,1,0"><code>snowflakeCount = 200;</code>: Số lượng hạt tuyết đang rơi. Tăng lên thì dày hơn nhưng máy yếu có thể lag.</li>
<li data-path-to-node="16,2,0"><code>snowPile</code>: Đây là mảng kỹ thuật để lưu &#8220;bản đồ địa hình&#8221; của lớp tuyết dưới đáy.</li>
</ul>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">&lt;canvas id="snowCanvas" style="position: fixed; top: 0; left: 0; z-index: 99999; pointer-events: none;"&gt;&lt;/canvas&gt;

&lt;script&gt;
(function() {
    var canvas = document.getElementById('snowCanvas');
    if (!canvas) { console.error("Không tìm thấy thẻ canvas"); return; }
    
    var ctx = canvas.getContext('2d');
    var width = window.innerWidth;
    var height = window.innerHeight;
    
    // --- CẤU HÌNH ---
    var maxSnowHeight = 200;    // Độ cao tối đa tuyết đọng (pixel)
    var snowflakeCount = 200;   // Số lượng hạt tuyết
    var snowColor = "#ADD8E6";  // Màu tuyết (Xanh nhạt để dễ test, muốn trắng sửa thành #FFFFFF)
    // ----------------
    
    canvas.width = width;
    canvas.height = height;

    var snowflakes = [];
    var snowPile = new Array(width).fill(0); 

    // Hàm tạo lại hạt tuyết khi rơi xuống hoặc mới bắt đầu
    function resetSnowflake(flake) {
        flake.x = Math.floor(Math.random() * width);
        flake.y = Math.floor(Math.random() * -height); 
        flake.size = Math.random() * 3 + 2; 
        flake.speed = (Math.random() * 1) + 1.5; // Tốc độ rơi
        flake.velY = flake.speed;
        flake.velX = 0;
        flake.opacity = (Math.random() * 0.5) + 0.3;
    }

    // Khởi tạo các hạt tuyết
    function init() {
        snowflakes = [];
        for (var i = 0; i &lt; snowflakeCount; i++) {
            var flake = {};
            resetSnowflake(flake);
            snowflakes.push(flake);
        }
        // GỌI HÀM UPDATE ĐỂ BẮT ĐẦU CHẠY
        update();
    }

    // Vòng lặp chuyển động
    function update() {
        ctx.clearRect(0, 0, width, height);

        // 1. Vẽ đống tuyết tích tụ dưới đáy
        ctx.fillStyle = snowColor;
        ctx.beginPath();
        ctx.moveTo(0, height);
        for (var x = 0; x &lt; width; x++) {
            ctx.lineTo(x, height - snowPile[x]);
        }
        ctx.lineTo(width, height);
        ctx.fill();

        // 2. Vẽ và cập nhật bông tuyết đang rơi
        for (var i = 0; i &lt; snowflakes.length; i++) {
            var f = snowflakes[i];

            f.x += Math.sin(f.y * 0.05) * 0.5; // Lắc lư nhẹ
            f.y += f.velY;

            var currentX = Math.floor(f.x);
            if (currentX &lt; 0) currentX = 0;
            if (currentX &gt;= width) currentX = width - 1;

            // Kiểm tra va chạm với đống tuyết
            var pileHeight = snowPile[currentX];
            
            if (f.y &gt;= height - pileHeight) {
                // Tích tụ tuyết nếu chưa vượt quá giới hạn
                if (pileHeight &lt; maxSnowHeight) {
                    var range = 3; 
                    for(var k = -range; k &lt;= range; k++) {
                        var neighborX = currentX + k;
                        if(neighborX &gt;=0 &amp;&amp; neighborX &lt; width) {
                             snowPile[neighborX] += f.size * 0.3; 
                        }
                    }
                }
                resetSnowflake(f); // Tạo lại hạt mới từ trên cao
            }

            // Vẽ bông tuyết đơn lẻ
            ctx.fillStyle = snowColor;
            ctx.globalAlpha = f.opacity; // Độ trong suốt
            ctx.beginPath();
            ctx.arc(f.x, f.y, f.size, 0, Math.PI * 2);
            ctx.fill();
            ctx.globalAlpha = 1; // Reset lại alpha
        }
        
        requestAnimationFrame(update);
    }

    // Xử lý khi resize màn hình
    window.addEventListener('resize', function() {
        width = window.innerWidth;
        height = window.innerHeight;
        canvas.width = width;
        canvas.height = height;
        snowPile = new Array(width).fill(0); // Reset tuyết đọng khi resize để tránh lỗi hiển thị
    });

    init();
})();
&lt;/script&gt;</pre>
<h2>Hướng dẫn thêm Code tuyết rơi Website Code tay (HTML/PHP)</h2>
<p>Đối với các website tự code hoặc các mã nguồn mở khác (Laravel, CodeIgniter&#8230;), bạn thực hiện như sau:</p>
<ol>
<li>Mở file <strong>footer</strong> của giao diện (thường là <code>footer.php</code>, <code>footer.html</code> hoặc file layout chính).</li>
<li>Tìm đến thẻ đóng <code>&lt;/body&gt;</code>.</li>
<li>Dán đoạn code ở mục 2 vào ngay phía trên thẻ <code>&lt;/body&gt;</code>.</li>
<li>Lưu file và tải lại trang (Ctrl + F5) để xem kết quả.</li>
</ol>
<h2>4. Hướng dẫn cài đặt cho WordPress</h2>
<p>Với WordPress, có 2 cách để chèn code này mà không cần cài plugin nặng nề tạo hiệu ứng:</p>
<h3>Cách 1: Sử dụng Plugin chèn Header &amp; Footer (Khuyên dùng)</h3>
<p>Cách này an toàn nhất, khi đổi giao diện (theme) code vẫn hoạt động.</p>
<ol>
<li>Cài đặt plugin <strong>WPCode</strong> (trước đây là Insert Headers and Footers) hoặc <strong>Header Footer Code Manager</strong>.</li>
<li>Vào menu plugin, chọn <strong>Add New Snippet</strong>.</li>
<li>Chọn vị trí chèn là <strong>Footer</strong>.</li>
<li>Dán đoạn code trên vào và bấm <strong>Save/Activate</strong>.</li>
</ol>
<h3>Cách 2: Chèn trực tiếp vào Theme (Dành cho Dev)</h3>
<ol>
<li>Vào trang quản trị WP -&gt; <strong>Giao diện (Appearance)</strong> -&gt; <strong>Chỉnh sửa giao diện (Theme File Editor)</strong>.</li>
<li>Tìm file <code>footer.php</code> ở cột bên phải.</li>
<li>Dán code vào trước thẻ đóng <code>&lt;/body&gt;</code>.</li>
<li>Bấm <strong>Cập nhật tệp tin</strong>.</li>
</ol>
<p><em>Lưu ý: Với cách 2, nếu bạn update theme thì code sẽ mất, nên sử dụng Child Theme để tránh tình trạng này.</em></p>
<p>Chỉ với vài dòng code đơn giản, website của bạn đã trở nên sinh động hơn rất nhiều trong mắt khách truy cập. Đây là một mẹo nhỏ trong <strong>UI/UX</strong> giúp giữ chân người dùng lâu hơn trong dịp lễ hội.</p>
<p>Chúc các bạn thực hiện thành công và có một mùa Giáng sinh an lành! Nếu có thắc mắc gì, hãy để lại bình luận bên dưới nhé.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://anonyviet.com/chia-se-code-tuyet-roi-cho-website-don-giang-sinh/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Opal: Tạo ứng dụng AI không cần viết code</title>
		<link>https://anonyviet.com/opal-tao-ung-dung-ai-khong-can-viet-code/</link>
					<comments>https://anonyviet.com/opal-tao-ung-dung-ai-khong-can-viet-code/#respond</comments>
		
		<dc:creator><![CDATA[Thanh Kim]]></dc:creator>
		<pubDate>Sun, 03 Aug 2025 08:27:20 +0000</pubDate>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[ai]]></category>
		<category><![CDATA[opal]]></category>
		<guid isPermaLink="false">https://anonyviet.com/?p=92267</guid>

					<description><![CDATA[Opal, công cụ AI thử nghiệm mới nhất từ Google, đang tạo nên một làn sóng phấn khích khi hứa hẹn biến bất kỳ ai cũng có thể trở thành nhà phát triển ứng dụng. Bạn có một ý tưởng độc đáo nhưng lại e ngại vì không biết một dòng code nào? Với Opal, [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><strong>Opal</strong>, công cụ AI thử nghiệm mới nhất từ Google, đang tạo nên một làn sóng phấn khích khi hứa hẹn biến bất kỳ ai cũng có thể trở thành nhà phát triển ứng dụng. Bạn có một ý tưởng độc đáo nhưng lại e ngại vì không biết một dòng code nào? Với Opal, rào cản đó sẽ sớm chỉ còn là quá khứ, mở ra một kỷ nguyên sáng tạo không giới hạn cho tất cả mọi người.</p>
<h2><strong>Opal: Tạo ứng dụng AI không cần viết code</strong></h2>
<p>Vào ngày 24 tháng 7, Google đã chính thức vén màn bí mật về Opal, một công cụ trí tuệ nhân tạo mang tính thử nghiệm với khả năng vô cùng ấn tượng: cho phép người dùng tạo ra các ứng dụng nhỏ chỉ bằng cách mô tả yêu cầu của mình bằng ngôn ngữ tự nhiên.</p>
<p>Đúng vậy, bạn <strong>không cần phải gõ một dòng mã lệnh</strong> nào cả. Toàn bộ quá trình từ việc phân tích yêu cầu, xây dựng logic đến tạo ra giao diện đều do AI đảm nhiệm. Mục tiêu của Google là để bất kỳ ai, dù không có kiến thức nền tảng về lập trình, cũng có thể tự mình bắt đầu.</p>
<figure id="attachment_92273" aria-describedby="caption-attachment-92273" style="width: 600px" class="wp-caption aligncenter"><img decoding="async" class="wp-image-92273 size-full" src="https://anonyviet.com/wp-content/uploads/2025/08/opal-5.jpg" alt="Opal: Tạo ứng dụng AI không cần viết code" width="600" height="400" title="Opal: Tạo ứng dụng AI không cần viết code 15" srcset="https://anonyviet.com/wp-content/uploads/2025/08/opal-5.jpg 600w, https://anonyviet.com/wp-content/uploads/2025/08/opal-5-300x200.jpg 300w" sizes="(max-width: 600px) 100vw, 600px" /><figcaption id="caption-attachment-92273" class="wp-caption-text">Opal: Tạo ứng dụng AI không cần viết code</figcaption></figure>
<h2><strong>Cách thức hoạt động kỳ diệu của Opal</strong></h2>
<p>Sức mạnh của Opal nằm ở ý tưởng cốt lõi: Chuyển đổi một ý tưởng được diễn đạt bằng lời nói thành một ứng dụng có thể hoạt động được thông qua một giao diện trực quan.</p>
<p>Khi bạn đưa ra một yêu cầu, ví dụ như &#8220;Tạo một ứng dụng gợi ý thực đơn dựa trên những nguyên liệu còn lại trong tủ lạnh&#8221;, công cụ sẽ tự động tạo ra một quy trình làm việc (workflow) bao gồm nhiều khối logic nối tiếp nhau. Mỗi khối đại diện cho một hành động cụ thể như: nhận dữ liệu đầu vào từ người dùng, tạo phản hồi, hiển thị kết quả,…</p>
<figure id="attachment_92274" aria-describedby="caption-attachment-92274" style="width: 600px" class="wp-caption aligncenter"><img decoding="async" class="wp-image-92274 size-full" src="https://anonyviet.com/wp-content/uploads/2025/08/opal-6.jpg" alt="Cách thức hoạt động kỳ diệu của Opal" width="600" height="330" title="Opal: Tạo ứng dụng AI không cần viết code 16" srcset="https://anonyviet.com/wp-content/uploads/2025/08/opal-6.jpg 600w, https://anonyviet.com/wp-content/uploads/2025/08/opal-6-300x165.jpg 300w" sizes="(max-width: 600px) 100vw, 600px" /><figcaption id="caption-attachment-92274" class="wp-caption-text">Cách thức hoạt động kỳ diệu của Opal</figcaption></figure>
<p>Giao diện của công cụ được thiết kế thông minh và chia thành hai khu vực chính:</p>
<ul>
<li><strong>Khu vực biên tập (Editor):</strong> Đây là nơi bạn có thể xem và chỉnh sửa toàn bộ quy trình hoạt động của ứng dụng dưới dạng các khối được kết nối với nhau. Bạn hoàn toàn có thể nhấp vào từng khối để chỉnh sửa hoặc thay thế nó bằng cách mô tả sự thay đổi bạn muốn.</li>
<li><strong>Khu vực xem trước (App):</strong> Chế độ này hiển thị ứng dụng dưới góc nhìn của người dùng cuối, là phiên bản đã được hoàn thiện và có thể kiểm tra ngay lập tức để đảm bảo mọi thứ hoạt động đúng như mong đợi.</li>
</ul>
<p>Người dùng có thể tự do chuyển đổi qua lại giữa hai chế độ xem này, tinh chỉnh các bước một cách linh hoạt và thậm chí thêm các hướng dẫn mới thông qua thanh lệnh tích hợp. Tất cả đều diễn ra mượt mà mà không đòi hỏi bất kỳ kiến thức nào về code.</p>
<div class="jeg_video_container jeg_video_content"><iframe loading="lazy" title="Introducing Opal" width="500" height="281" src="https://www.youtube.com/embed/E0hrcDO3Noc?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></div>
<h2><strong>Khơi nguồn sáng tạo với thư viện mẫu có sẵn</strong></h2>
<p>Đối với những người dùng còn đang thiếu ý tưởng hoặc chỉ đơn giản là muốn khám phá khả năng của công cụ,<strong> Opal</strong> cung cấp một thư viện các ví dụ đa dạng. Tại đây có sẵn một số ứng dụng nhỏ đã được hoàn thiện, bạn có thể thử nghiệm trực tiếp hoặc tùy chỉnh lại theo nhu cầu của mình.</p>
<p>Mỗi dự án mẫu đều có thể trở thành nền tảng cho tác phẩm của riêng bạn. Chỉ cần một cú nhấp chuột, bạn có thể xem cách nó được xây dựng, thay đổi một vài khối lệnh hoặc lời nhắc (prompt), và bạn sẽ có ngay một phiên bản tùy chỉnh chỉ trong vài giây. Đây là một cách tuyệt vời để hiểu cơ chế của Opal mà không cần phải bắt đầu từ con số không.</p>
<figure id="attachment_92270" aria-describedby="caption-attachment-92270" style="width: 600px" class="wp-caption aligncenter"><img decoding="async" class="wp-image-92270 size-full" src="https://anonyviet.com/wp-content/uploads/2025/08/opal-2.jpg" alt="Khơi nguồn sáng tạo với thư viện mẫu có sẵn" width="600" height="400" title="Opal: Tạo ứng dụng AI không cần viết code 17" srcset="https://anonyviet.com/wp-content/uploads/2025/08/opal-2.jpg 600w, https://anonyviet.com/wp-content/uploads/2025/08/opal-2-300x200.jpg 300w" sizes="(max-width: 600px) 100vw, 600px" /><figcaption id="caption-attachment-92270" class="wp-caption-text">Khơi nguồn sáng tạo với thư viện mẫu có sẵn</figcaption></figure>
<h2><strong>Chia sẻ dễ dàng và tạo mã siêu tốc</strong></h2>
<p>Một khi ứng dụng nhỏ của bạn đã hoàn tất, Opal giúp việc chia sẻ trở nên vô cùng đơn giản. Chỉ với một cú nhấp chuột, bạn sẽ nhận được một đường dẫn URL duy nhất. Bạn có thể gửi liên kết này cho bạn bè hoặc đồng nghiệp để họ thử nghiệm sản phẩm của bạn bằng chính tài khoản <a href="https://anonyviet.com/cach-tao-google-ai-pro-12-thang-mien-phi/">Google</a> của họ. Không cần cài đặt, không cần xuất bản lên cửa hàng ứng dụng, mọi thứ đều diễn ra trực tuyến.</p>
<p>Đây chính là thế mạnh cốt lõi của Opal: Chỉ trong vài phút, bạn có thể đi từ một ý tưởng chợt nảy ra đến một phiên bản có thể hoạt động, kiểm tra và chia sẻ được. Dù đó là một dự án cá nhân, một bản thử nghiệm ý tưởng (proof of concept), hay một công cụ &#8220;cây nhà lá vườn&#8221; để sử dụng hàng ngày, mọi thứ đều được thiết kế để diễn ra nhanh chóng mà không cần bận tâm đến code.</p>
<figure id="attachment_92271" aria-describedby="caption-attachment-92271" style="width: 600px" class="wp-caption aligncenter"><img decoding="async" class="wp-image-92271 size-full" src="https://anonyviet.com/wp-content/uploads/2025/08/opal-3.jpg" alt="Chia sẻ dễ dàng và tạo mẫu siêu tốc" width="600" height="400" title="Opal: Tạo ứng dụng AI không cần viết code 18" srcset="https://anonyviet.com/wp-content/uploads/2025/08/opal-3.jpg 600w, https://anonyviet.com/wp-content/uploads/2025/08/opal-3-300x200.jpg 300w" sizes="(max-width: 600px) 100vw, 600px" /><figcaption id="caption-attachment-92271" class="wp-caption-text">Chia sẻ dễ dàng và tạo mẫu siêu tốc</figcaption></figure>
<h2><strong>Khi nào Opal triển khai ở Việt Nam?</strong></h2>
<p>Điểm trừ duy nhất ở thời điểm hiện tại là Opal mới chỉ được triển khai tại Hoa Kỳ thông qua chương trình<a href="https://labs.google/" rel="noopener"> <strong>Google Labs</strong></a>. Điều này có nghĩa là người dùng ở các khu vực khác, trong đó có Việt Nam, vẫn phải đứng ngoài và chờ đợi một đợt triển khai rộng rãi hơn trong tương lai.</p>
<figure id="attachment_92272" aria-describedby="caption-attachment-92272" style="width: 600px" class="wp-caption aligncenter"><img decoding="async" class="wp-image-92272 size-full" src="https://anonyviet.com/wp-content/uploads/2025/08/opal-4.jpg" alt="Khi nào Opal sẽ đến Việt Nam?" width="600" height="332" title="Opal: Tạo ứng dụng AI không cần viết code 19" srcset="https://anonyviet.com/wp-content/uploads/2025/08/opal-4.jpg 600w, https://anonyviet.com/wp-content/uploads/2025/08/opal-4-300x166.jpg 300w" sizes="(max-width: 600px) 100vw, 600px" /><figcaption id="caption-attachment-92272" class="wp-caption-text">Khi nào Opal sẽ đến Việt Nam?</figcaption></figure>
<h2><strong>Kết bài</strong></h2>
<p>Tóm lại, <strong>Opal</strong> đang định hình một tương lai đầy hứa hẹn, nơi việc tạo ra các công cụ số không còn là đặc quyền của riêng giới lập trình. Dù vẫn còn trong giai đoạn thử nghiệm và giới hạn khu vực, tiềm năng của nó là không thể phủ nhận. Chúng ta hãy cùng chờ xem ngày mà công cụ Opal chính thức ra mắt toàn cầu và trao sức mạnh sáng tạo vào tay tất cả mọi người nhé!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://anonyviet.com/opal-tao-ung-dung-ai-khong-can-viet-code/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<media:content url="https://www.youtube.com/embed/E0hrcDO3Noc" medium="video">
			<media:player url="https://www.youtube.com/embed/E0hrcDO3Noc" />
			<media:title type="plain">Code Archives - AnonyViet</media:title>
			<media:description type="html"><![CDATA[Chia sẽ kiến thức về coding: pascal, php, html, C++....]]></media:description>
			<media:thumbnail url="https://anonyviet.com/wp-content/uploads/2025/08/opal.jpg" />
			<media:rating scheme="urn:simple">nonadult</media:rating>
		</media:content>
	</item>
		<item>
		<title>Cách xóa nhanh tất cả Bình luận rác trên WordPress</title>
		<link>https://anonyviet.com/cach-xoa-nhanh-tat-ca-binh-luan-rac-tren-wordpress/</link>
					<comments>https://anonyviet.com/cach-xoa-nhanh-tat-ca-binh-luan-rac-tren-wordpress/#respond</comments>
		
		<dc:creator><![CDATA[AnonyViet]]></dc:creator>
		<pubDate>Sun, 13 Jul 2025 21:09:44 +0000</pubDate>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[sql]]></category>
		<category><![CDATA[WordPress]]></category>
		<guid isPermaLink="false">https://anonyviet.com/?p=88266</guid>

					<description><![CDATA[Nếu mới dựng Website WordPress lên mà chưa kịp cài các plugin chặn spam comment thì chắc chắn kiểu gì bạn cũng sẽ bị hàng trăm bình luận rác mỗi ngày. Tình trạng spam comment diễn ra mỗi ngày một tinh vi và có thể vượt qua cả plugin Akismet Anti-spam: Spam Protection. Mình có [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Nếu mới dựng Website WordPress lên mà chưa kịp cài các plugin chặn spam comment thì chắc chắn kiểu gì bạn cũng sẽ bị hàng trăm bình luận rác mỗi ngày. Tình trạng spam comment diễn ra mỗi ngày một tinh vi và có thể vượt qua cả plugin Akismet Anti-spam: Spam Protection. Mình có 1 Website vệ tinh lâu quá không vào và thế là hứng gần 1500 bình luận rác, tất cả vẫn đang trong chế độ chờ duyệt. Để xóa nhanh tất cả bình luận rác trên WordPress, bạn có thể thực hiện theo cách sau:</p>
<h2>Cách 1: Xóa Comment trong trang quản trị WordPress</h2>
<p>Đây là cách đơn giản nhất, phù hợp với những website có số lượng bình luận rác ở mức thấp hoặc trung bình. Người quản trị chỉ cần truy cập vào bảng điều khiển WordPress, chọn mục “Comments” (Bình luận), sau đó chuyển sang tab “Spam” hoặc “Pending” để lọc ra các bình luận không hợp lệ. Tại đây, bạn có thể chọn toàn bộ bình luận hiển thị, thực hiện hành động “Move to Trash” (Chuyển vào thùng rác) và xác nhận.</p>
<p>Mỗi trang thường hiển thị khoảng 20 bình luận, tuy nhiên bạn có thể tăng số lượng này lên 100 hoặc 200 bằng cách nhấn vào nút “Screen Options” (Tùy chọn màn hình) và chỉnh lại số lượng bình luận hiển thị trên 1 trang.</p>
<p><strong>Lưu ý</strong> nếu để số lượng quá lớn có thể là <strong>treo</strong> Website do chiếm nhiều tài nguyên xử lý php.</p>
<p><img decoding="async" class="aligncenter size-full wp-image-88265" src="https://anonyviet.com/wp-content/uploads/2025/06/xoa-thu-cong-binh-luan-rac.jpg" alt="xoa thu cong binh luan rac" width="1308" height="277" srcset="https://anonyviet.com/wp-content/uploads/2025/06/xoa-thu-cong-binh-luan-rac.jpg 1308w, https://anonyviet.com/wp-content/uploads/2025/06/xoa-thu-cong-binh-luan-rac-300x64.jpg 300w, https://anonyviet.com/wp-content/uploads/2025/06/xoa-thu-cong-binh-luan-rac-1024x217.jpg 1024w, https://anonyviet.com/wp-content/uploads/2025/06/xoa-thu-cong-binh-luan-rac-768x163.jpg 768w, https://anonyviet.com/wp-content/uploads/2025/06/xoa-thu-cong-binh-luan-rac-750x159.jpg 750w, https://anonyviet.com/wp-content/uploads/2025/06/xoa-thu-cong-binh-luan-rac-1140x241.jpg 1140w" sizes="(max-width: 1308px) 100vw, 1308px" title="Cách xóa nhanh tất cả Bình luận rác trên Wordpress 22"></p>
<h2>Cách 2: Xóa Bằng SQL Hoặc WP-CLI</h2>
<p>Nếu bạn có quyền truy cập vào cơ sở dữ liệu của website thông qua phpMyAdmin hoặc dùng VPS có hỗ trợ SSH, thì việc xóa bình luận rác bằng câu lệnh SQL hoặc công cụ WP-CLI là lựa chọn nhanh và gọn nhất.</p>
<p>Chỉ với một dòng lệnh SQL như<code> DELETE FROM wp_comments WHERE comment_approved = 'spam';</code>, toàn bộ bình luận bị đánh dấu là spam sẽ biến mất ngay lập tức.</p>
<p>Nếu muốn xóa bình luận đang chờ duyệt, bạn chỉ cần thay đổi điều kiện thành <code>comment_approved = '0'</code>.</p>
<p><img decoding="async" class="aligncenter size-full wp-image-88264" src="https://anonyviet.com/wp-content/uploads/2025/06/xoa-comment-spam.jpg" alt="xoa comment spam" width="600" height="192" srcset="https://anonyviet.com/wp-content/uploads/2025/06/xoa-comment-spam.jpg 600w, https://anonyviet.com/wp-content/uploads/2025/06/xoa-comment-spam-300x96.jpg 300w" sizes="(max-width: 600px) 100vw, 600px" title="Cách xóa nhanh tất cả Bình luận rác trên Wordpress 23"></p>
<p>Trong trường hợp sử dụng WP-CLI, bạn có thể dùng lệnh<code> wp comment delete $(wp comment list --status=spam --format=ids)</code> để xóa tất cả bình luận với 1 nút Enter.</p>
<h2>Cách 3: Dùng Plugin Để Xóa Hàng Loạt Bình Luận Rác Tự Động</h2>
<p>Đối với các website có khối lượng lớn bình luận spam, việc sử dụng plugin là giải pháp tối ưu. Plugin<a href="https://wordpress.org/plugins/wp-bulk-delete/" rel="noopener"> WP Bulk Delete</a> là một lựa chọn phổ biến và dễ sử dụng. Sau khi cài đặt và kích hoạt plugin này, bạn chỉ cần truy cập vào mục quản lý bình luận trong WP Bulk Delete, chọn loại bình luận cần xóa như “Spam”, “Pending” hoặc “All”, sau đó nhấn nút xác nhận để tiến hành xóa hàng loạt.</p>
<p>Thời gian thực hiện chỉ mất vài phút và không yêu cầu người dùng phải thao tác thủ công nhiều lần. Một số plugin khác như Delete Pending Comments bạn có thể tham khảo dùng thử</p>
<h2>Câu hỏi thường gặp</h2>
<h3>Tôi có thể xóa bình luận rác trên WordPress nếu chỉ có vài chục bình luận không?</h3>
<p>Bạn có thể dễ dàng xóa bình luận rác bằng cách truy cập mục &#8220;Bình luận&#8221; trong bảng điều khiển WordPress, lọc theo &#8220;Spam&#8221; hoặc &#8220;Pending&#8221;, chọn tất cả và chuyển vào thùng rác.  </p>
<h3>Nếu website có hàng trăm hoặc hàng ngàn bình luận rác thì sao?</h3>
<p>Với số lượng lớn, bạn nên sử dụng phương pháp xóa bằng SQL (<code>DELETE FROM wp_comments WHERE comment_approved = 'spam';</code>) hoặc WP-CLI (<code>wp comment delete $(wp comment list --status=spam --format=ids)</code>) để xóa nhanh chóng.  Hoặc cài đặt plugin như WP Bulk Delete để xóa hàng loạt một cách tự động.</p>
<h3>Có an toàn khi xóa bình luận rác bằng SQL hoặc WP-CLI không?</h3>
<p>Việc sử dụng SQL hoặc WP-CLI cần thận trọng. Hãy sao lưu cơ sở dữ liệu trước khi thực hiện.  Đảm bảo bạn hiểu chính xác câu lệnh SQL để tránh xóa nhầm dữ liệu khác.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://anonyviet.com/cach-xoa-nhanh-tat-ca-binh-luan-rac-tren-wordpress/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Code pháo hoa trang trí cho Website dịp tết</title>
		<link>https://anonyviet.com/code-phao-hoa-trang-tri-cho-website-dip-tet/</link>
					<comments>https://anonyviet.com/code-phao-hoa-trang-tri-cho-website-dip-tet/#respond</comments>
		
		<dc:creator><![CDATA[AnonyViet]]></dc:creator>
		<pubDate>Sat, 25 Jan 2025 06:38:23 +0000</pubDate>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[code pháo hoa tết]]></category>
		<category><![CDATA[pháo hoa]]></category>
		<guid isPermaLink="false">https://anonyviet.com/?p=79105</guid>

					<description><![CDATA[Dịp Tết là thời điểm lý tưởng để trang trí website của bạn với các hiệu ứng Code pháo hoa trang trí đẹp mắt và sống động nhằm mang đến không khí lễ hội. Một trong những hiệu ứng phổ biến và ấn tượng là bắn pháo hoa. Với hiệu ứng này, website của bạn [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><strong>Dịp Tết là thời điểm lý tưởng để trang trí website của bạn với các hiệu ứng Code pháo hoa trang trí đẹp mắt và sống động nhằm mang đến không khí lễ hội. Một trong những hiệu ứng phổ biến và ấn tượng là bắn pháo hoa. Với hiệu ứng này, website của bạn không chỉ thu hút sự chú ý của người xem mà còn tạo cảm giác vui vẻ, hứng khởi.</strong></p>
<p><img decoding="async" class="aligncenter size-full " src="https://anonyviet.com/wp-content/uploads/2025/01/code-phao-hoa-tet.jpg" alt="Code pháo hoa trang trí cho Website dịp tết 2" width="829" height="331" title="Code pháo hoa trang trí cho Website dịp tết 25"></p>
<p>Code bắn pháo hoa mang lại nhiều lợi ích và rất dễ áp dụng. Hiệu ứng này cho phép hiển thị các tia pháo hoa rực rỡ trên toàn màn hình, xuất hiện khi người dùng nhấp chuột hoặc tự động bắn sau mỗi vài giây. Đặc biệt, bạn có thể tùy chỉnh màu sắc, kích thước và tần suất pháo hoa để phù hợp với thiết kế tổng thể của website.</p>
<p>Ứng dụng của code pháo hoa rất đa dạng. Bạn có thể sử dụng nó để tạo điểm nhấn cho các chương trình khuyến mãi Tết trên website thương mại điện tử, làm đẹp blog cá nhân theo chủ đề năm mới, hoặc trang trí trang giới thiệu sự kiện và chiến dịch quảng bá lễ hội. Code được viết bằng JavaScript kết hợp với HTML và CSS, đảm bảo nhẹ nhàng, không ảnh hưởng đến tốc độ tải trang, và tương thích tốt trên hầu hết các trình duyệt hiện đại.</p>
<p>Ngoài ra bạn có thể tham khảo <a href="https://anonyviet.com/code-hieu-ung-phao-hoa-theo-chuot-trang-tri-website-tet/">code pháo hoa di theo chuột</a> ở bài viết trước</p>
<h1>Code pháo hoa trang trí Website</h1>
<p>Trước khi quyết định có dùng code hay không, bạn có thể xem Demo pháo hóa tại trang này: <a href="https://anonyviet.com/resource/phaohoa/demo.html">https://anonyviet.com/resource/phaohoa/demo.html</a></p>
<p>Đây là code gốc được tham khảo từ website: https://quaqueviet.nguyenlan.io.vn/phaohoa.txt</p>
<h3>Code pháo hoa tết cho WordPress</h3>
<p>Mở file functions.php trong thư mục theme của WordPress và copy toàn bộ code dưới đây dán vào ở cuối file functions.php (thường ở đường dẫn <strong>wp-content/themes/tên-theme/functions.php</strong>)</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">function chenphaohoa(){
?&gt;
&lt;link rel="stylesheet" href="https://anonyviet.com/resource/phaohoa/fireworks1.css"&gt;
&lt;script src="https://anonyviet.com/resource/phaohoa/fireworks1.js"&gt;&lt;/script&gt;
&lt;canvas id="fireworks" style="display:none;"&gt;&lt;/canvas&gt; 
&lt;?php
}

add_action('wp_footer','chenphaohoa');</pre>
<h3>Thêm code pháo hoa tết vào Blogspot/Website khác</h3>
<p>Bạn vào Menu đổi theme của Blogspot, edit html và thực hiện các bước sau:</p>
<ol>
<li class="whitespace-normal break-words">Vào Blogspot Dashboard</li>
<li class="whitespace-normal break-words">Theme &gt; Edit HTML</li>
<li class="whitespace-normal break-words">Dán code vào vị trí tương ứng bên dưới</li>
</ol>
<p><strong>Thêm code Trong phần <span style="color: #0000ff;">&lt;head&gt;</span></strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">&lt;link href='https://anonyviet.com/resource/phaohoa/fireworks1.css' rel='stylesheet' type='text/css'/&gt;</pre>
<p>Ngay trước thẻ đóng <span style="color: #0000ff;"><strong>&lt;/body&gt;</strong></span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">&lt;!-- FIREWORKS SCRIPT --&gt;
&lt;script src='https://anonyviet.com/resource/phaohoa/fireworks1.js' type='text/javascript'&gt;&lt;/script&gt;

&lt;!-- INITIALIZE FIREWORKS --&gt;
&lt;script&gt;
document.addEventListener("DOMContentLoaded", function() {
    const container = document.createElement('div');
    container.id = 'fireworks-container';
    document.body.appendChild(container);
    
    // Cấu hình pháo hoa
    const fireworksConfig = [
        {left:"15%", color:"#FF4C4C", explosionType:"circle", size:"large", launchTime:0},
        {left:"70%", color:"#FFD24C", explosionType:"star", size:"medium", launchTime:0},
        // ... (Giữ nguyên fireworksData như code gốc)
    ];

    fireworksConfig.forEach(config =&gt; {
        setTimeout(() =&gt; launchRocket(container, config), config.launchTime);
    });
    
    const maxTime = Math.max(...fireworksConfig.map(f =&gt; f.launchTime));
    setTimeout(() =&gt; launchGrandFinaleRocket(container), maxTime + 4000);
});
&lt;/script&gt;</pre>
<h1>Code pháo hoa phù hợp với Website có nền màu trắng sáng</h1>
<p>Đây là code pháo hoa khi bắn sẽ có thân pháo hoa pháo hình lắp lánh, tỏa sáng đối với các web có nền trắng, tạo hiệu ứng lung linh</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">&lt;!DOCTYPE html&gt;
&lt;html lang="vi"&gt;
&lt;head&gt;
  &lt;meta charset="UTF-8"&gt;
  &lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
  &lt;title&gt;Demo Pháo Hoa&lt;/title&gt;
  &lt;style&gt;
    body {
      margin: 0;
      background-color: #808080; /* Màu xám cho nền */
      overflow: hidden;
    }
    #fireworksCanvas {
      position: fixed;
      top: 0;
      left: 0;
      width: 100%;
      height: 100%;
      pointer-events: none;
      z-index: 9999;
    }
  &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;canvas id="fireworksCanvas"&gt;&lt;/canvas&gt;
  
  &lt;script&gt;
    const canvas = document.getElementById('fireworksCanvas');
    const ctx = canvas.getContext('2d');
    let width = window.innerWidth;
    let height = window.innerHeight;
    canvas.width = width;
    canvas.height = height;

    const fireworks = [];

    class Firework {
      constructor(x, targetY, colors) {
        this.x = x;
        this.y = height; // Xuất phát từ đáy màn hình
        this.targetY = targetY; // Mục tiêu vị trí phát nổ
        this.colors = colors;
        this.exploded = false;
        this.speedY = -6; // Tốc độ bay lên
        this.previousPositions = []; // Lưu trữ các vị trí trước đó để vẽ tia sáng
        this.particles = []; // Lưu hạt pháo hoa khi nổ
      }

      createParticles() {
        for (let i = 0; i &lt; 80; i++) {
          this.particles.push({
            x: this.x,
            y: this.y,
            speed: Math.random() * 3 + 1,
            angle: Math.random() * Math.PI * 2,
            radius: Math.random() * 2 + 1,
            color: this.colors[Math.floor(Math.random() * this.colors.length)],
            alpha: 1,
            decay: Math.random() * 0.02 + 0.01,
          });
        }
      }

      update() {
        if (!this.exploded) {
          // Lưu vị trí hiện tại vào mảng previousPositions
          this.previousPositions.push({ x: this.x, y: this.y });

          // Giữ lại chỉ một số lượng giới hạn vị trí để không làm đầy bộ nhớ
          if (this.previousPositions.length &gt; 10) {
            this.previousPositions.shift();
          }

          // Di chuyển pháo hoa lên
          this.y += this.speedY;
          if (this.y &lt;= this.targetY) {
            this.exploded = true;
            this.createParticles();
          }
        } else {
          this.updateParticles();
        }
      }

      updateParticles() {
        this.particles.forEach((particle, index) =&gt; {
          particle.x += Math.cos(particle.angle) * particle.speed;
          particle.y += Math.sin(particle.angle) * particle.speed;
          particle.alpha -= particle.decay;

          if (particle.alpha &lt;= 0) {
            this.particles.splice(index, 1);
          }
        });
      }

      draw() {
        if (!this.exploded) {
          // Vẽ tia sáng bằng các đoạn thẳng giữa các vị trí trước đó
          ctx.beginPath();
          for (let i = 0; i &lt; this.previousPositions.length - 1; i++) {
            const start = this.previousPositions[i];
            const end = this.previousPositions[i + 1];
            ctx.moveTo(start.x, start.y);
            ctx.lineTo(end.x, end.y);
          }
          // Sử dụng màu sắc ngẫu nhiên cho tia sáng
          ctx.strokeStyle = `rgb(${Math.random() * 255}, ${Math.random() * 255}, ${Math.random() * 255})`;
          ctx.lineWidth = 2; // Độ dày của tia sáng
          ctx.stroke();
        } else {
          // Vẽ các hạt pháo hoa khi nổ
          this.particles.forEach((particle) =&gt; {
            ctx.beginPath();
            ctx.arc(particle.x, particle.y, particle.radius, 0, Math.PI * 2);
            ctx.fillStyle = `rgba(${particle.color.r}, ${particle.color.g}, ${particle.color.b}, ${particle.alpha})`;
            ctx.fill();
          });
        }
      }

      isDone() {
        return this.exploded &amp;&amp; this.particles.length === 0;
      }
    }

    function createFirework() {
      const x = Math.random() * width; // Vị trí bắn pháo hoa ngẫu nhiên
      const targetY = Math.random() * (height / 2); // Mục tiêu phát nổ trong nửa trên màn hình
      const colors = [
        { r: 255, g: 0, b: 0 },    // Đỏ
        { r: 255, g: 255, b: 0 },  // Vàng
        { r: 0, g: 255, b: 0 },    // Xanh lá
        { r: 0, g: 0, b: 255 },    // Xanh dương
        { r: 255, g: 0, b: 255 },  // Tím
      ];
      fireworks.push(new Firework(x, targetY, colors));
    }

    function animateFireworks() {
      ctx.clearRect(0, 0, width, height);
      fireworks.forEach((firework, index) =&gt; {
        firework.update();
        firework.draw();

        if (firework.isDone()) {
          fireworks.splice(index, 1);
        }
      });

      requestAnimationFrame(animateFireworks);
    }

    // Tạo pháo hoa mới mỗi 3 giây
    setInterval(() =&gt; {
      createFirework();
    }, 3000);

    window.addEventListener('resize', () =&gt; {
      width = window.innerWidth;
      height = window.innerHeight;
      canvas.width = width;
      canvas.height = height;
    });

    animateFireworks();
  &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>&nbsp;</p>
<p>Hiệu ứng code pháo hoa là một trong những cách thú vị để tạo điểm nhấn và tăng tính thẩm mỹ cho các trang web hoặc sự kiện đặc biệt như Tết, Giáng Sinh, hay kỷ niệm. Code pháo hoa trong bài được được thiết kế bằng HTML, CSS, và JavaScript, giúp tạo ra những vụ nổ pháo hoa sống động, nhiều màu sắc và có thể dễ dàng tích hợp vào bất kỳ dự án nào. Cảm ơn chủ website https://quaqueviet.nguyenlan.io.vn/ đã share code cho mọi người</p>
<h2>Câu hỏi thường gặp</h2>
<h3>Tôi có thể sử dụng code pháo hoa này trên website của mình không?</h3>
<p>Có, code pháo hoa được viết bằng JavaScript, HTML và CSS, tương thích với hầu hết các trình duyệt hiện đại và dễ dàng tích hợp vào website của bạn.</p>
<h3>Code pháo hoa có ảnh hưởng đến tốc độ tải trang web không?</h3>
<p>Không đáng kể. Code được tối ưu để nhẹ nhàng và không gây ảnh hưởng đến tốc độ tải trang web.</p>
<h3>Tôi có thể tùy chỉnh code pháo hoa theo ý muốn không?</h3>
<p>Có, bạn có thể tùy chỉnh màu sắc, kích thước, tần suất và hiệu ứng của pháo hoa để phù hợp với thiết kế website của mình.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://anonyviet.com/code-phao-hoa-trang-tri-cho-website-dip-tet/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Code Hiệu Ứng Pháo Hoa Theo Chuột &#8211; Trang Trí Website Tết</title>
		<link>https://anonyviet.com/code-hieu-ung-phao-hoa-theo-chuot-trang-tri-website-tet/</link>
					<comments>https://anonyviet.com/code-hieu-ung-phao-hoa-theo-chuot-trang-tri-website-tet/#comments</comments>
		
		<dc:creator><![CDATA[AnonyViet]]></dc:creator>
		<pubDate>Mon, 23 Dec 2024 17:01:28 +0000</pubDate>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[code html]]></category>
		<category><![CDATA[code js]]></category>
		<category><![CDATA[code pháo hoa]]></category>
		<category><![CDATA[hiệu ứng pháo hoa]]></category>
		<guid isPermaLink="false">https://anonyviet.com/?p=75862</guid>

					<description><![CDATA[Code hiệu Ứng Pháo Hoa Theo Chuột là sự kết hợp giữa html, js và css tạo ra một hiệu ứng pháo hoa đẹp mắt, nơi các tia sáng rực rỡ xuất hiện và lan tỏa ngay tại vị trí chuột di chuyển. Với mỗi lần di chuột, các hạt sáng với màu sắc ngẫu [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Code hiệu Ứng Pháo Hoa Theo Chuột là sự kết hợp giữa html, js và css tạo ra một hiệu ứng pháo hoa đẹp mắt, nơi các tia sáng rực rỡ xuất hiện và lan tỏa ngay tại vị trí chuột di chuyển. Với mỗi lần di chuột, các hạt sáng với màu sắc ngẫu nhiên sẽ tạo thành pháo hoa bùng nổ, mang đến cảm giác sinh động và thú vị. Đang chuẩn bị dịp tết về, bạn có thể trang trí Website thêm chút không khí tết bằng các màn pháo hoa đẹp mắt này.</p>
<p>Bên cạnh việc <a href="https://anonyviet.com/javascript-hoa-mai-dao-roi-trang-tri-tet-cho-website/">trang trí hoa mai đào rơi cho Website</a>, bạn có thể thực hiện hiệu ứng pháo hoa cho đẹp mắt. Ngoài ra mình cũng đã chia sẻ cách <a href="https://anonyviet.com/huong-dan-tao-hieu-ung-tuyet-roi-khi-di-chuot/">tạo hiệu ứng tuyết rơi khi di chuột trên máy tính bằng phần mềm</a> giúp máy tính trong sinh động hơn mùa noel.</p>
<p>Xem <a href="https://anonyviet.com/resource/plugin-phao-hoa-theo-chuot/phaohoa.html">demo hiệu ứng tại đây</a>, nhớ rê chuột để thấy hiệu ứng.</p>
<p><img decoding="async" class="aligncenter size-full " src="https://anonyviet.com/wp-content/uploads/2024/12/code-phao-hoa-di-chuot-website.jpg" alt="Code Hiệu Ứng Pháo Hoa Theo Chuột - Trang Trí Website Tết 4" width="500" height="232" title="Code Hiệu Ứng Pháo Hoa Theo Chuột - Trang Trí Website Tết 27"></p>
<h2>Full code pháo hoa di chuột trên Website</h2>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
&lt;head&gt;
    &lt;meta charset="UTF-8"&gt;
    &lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
    &lt;title&gt;Fireworks Effect&lt;/title&gt;
    &lt;style&gt;
        body {
            margin: 0;
            overflow: hidden;
            background-color: #000;
        }

        canvas {
            display: block;
        }
    &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;canvas id="fireworksCanvas"&gt;&lt;/canvas&gt;

    &lt;script&gt;
        const canvas = document.getElementById("fireworksCanvas");
        const ctx = canvas.getContext("2d");

        canvas.width = window.innerWidth;
        canvas.height = window.innerHeight;

        window.addEventListener("resize", () =&gt; {
            canvas.width = window.innerWidth;
            canvas.height = window.innerHeight;
        });

        class Particle {
            constructor(x, y, color) {
                this.x = x;
                this.y = y;
                this.color = color;
                this.size = Math.random() * 5 + 1;
                this.speedX = Math.random() * 4 - 2;
                this.speedY = Math.random() * 4 - 2;
                this.life = Math.random() * 30 + 50;
            }

            update() {
                this.x += this.speedX;
                this.y += this.speedY;
                this.size *= 0.96;
                this.life--;
            }

            draw() {
                ctx.beginPath();
                ctx.arc(this.x, this.y, this.size, 0, Math.PI * 2);
                ctx.fillStyle = this.color;
                ctx.fill();
            }
        }

        const particles = [];

        function createFireworks(x, y) {
            const colors = ["#ff5733", "#33ff57", "#5733ff", "#f4ff33", "#ff33e3"];
            for (let i = 0; i &lt; 50; i++) {
                const color = colors[Math.floor(Math.random() * colors.length)];
                particles.push(new Particle(x, y, color));
            }
        }

        function animate() {
            ctx.fillStyle = "rgba(0, 0, 0, 0.1)";
            ctx.fillRect(0, 0, canvas.width, canvas.height);

            particles.forEach((particle, index) =&gt; {
                if (particle.life &lt;= 0 || particle.size &lt;= 0.1) {
                    particles.splice(index, 1);
                } else {
                    particle.update();
                    particle.draw();
                }
            });

            requestAnimationFrame(animate);
        }

        canvas.addEventListener("mousemove", (e) =&gt; {
            createFireworks(e.clientX, e.clientY);
        });

        animate();
    &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<h2>Thêm code pháo hoa vào WordPress</h2>
<p>Nếu Website bạn dùng WordPress, thì cần tinh chỉnh một xíu để ẩn nền đen của code gốc đi. Bạn có thể tải nhanh Plugin Hiệu Ứng Pháo Hoa Theo Chuột tại đường <a href="https://anonyviet.com/resource/plugin-phao-hoa-theo-chuot/mouse-fireworks.zip">link này</a>. Sau khi tải về chỉnh cần upload trong mục Plugin và kích hoạt. Sau đó xóa cache (nếu có) và truy cập vào bài viết bất kỳ để thưởng thức màn pháo hoa trên Website của bạn. Bạn có thể xem demo ngay trên viết này.</p>
<h2>Thêm code pháo hoa theo chuột vào Blogspot/Website khác</h2>
<p>Bạn vào Menu đổi theme của Blogspot, edit html và thực hiện các bước sau:</p>
<ol>
<li class="whitespace-normal break-words">Vào Blogspot Dashboard</li>
<li class="whitespace-normal break-words">Theme &gt; Edit HTML</li>
<li class="whitespace-normal break-words">Dán code vào vị trí tương ứng bên dưới</li>
</ol>
<p><strong>Thêm code Trong phần <span style="color: #0000ff;">&lt;head&gt;</span></strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">&lt;style&gt;
#fireworksCanvas {
    position: fixed;
    top: 0;
    left: 0;
    pointer-events: none;
    z-index: 999999;
    mix-blend-mode: screen;
}
&lt;/style&gt;</pre>
<p><strong>Ngay trước thẻ đóng<span style="color: #0000ff;"> &lt;/body&gt;</span></strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">&lt;canvas id="fireworksCanvas"&gt;&lt;/canvas&gt;
&lt;script src="https://anonyviet.com/resource/plugin-phao-hoa-theo-chuot/fireworks.js"&gt;&lt;/script&gt;</pre>
<p>Hiệu ứng pháo hoa bắn theo chuột là một cách tuyệt vời để làm nổi bật website của bạn, tạo ra trải nghiệm hấp dẫn cho người truy cập. Hãy thử tích hợp ngay hôm nay và mang đến sự khác biệt cho trang web của bạn!</p>
<p>Nếu bạn gặp khó khăn hoặc có thắc mắc khi sử dụng code này, đừng ngần ngại để lại bình luận hoặc liên hệ để được hỗ trợ.</p>
<h2>Câu hỏi thường gặp</h2>
<h3>Hiệu ứng pháo hoa hoạt động như thế nào?</h3>
<p>Hiệu ứng sử dụng JavaScript để tạo ra các hạt nhỏ (particles) xuất hiện và lan tỏa khi chuột di chuyển.  Màu sắc của hạt được chọn ngẫu nhiên, tạo ra hiệu ứng pháo hoa sống động.</p>
<h3>Tôi có thể sử dụng code này trên nền tảng nào?</h3>
<p>Code này hoạt động trên hầu hết các trình duyệt web hiện đại.  Hướng dẫn cụ thể được cung cấp cho WordPress, Blogspot và các website khác.</p>
<h3>Nếu tôi gặp sự cố khi cài đặt, tôi nên làm gì?</h3>
<p>Hãy kiểm tra lại xem bạn đã thêm code vào đúng vị trí trong file HTML của website. Nếu vẫn gặp vấn đề, vui lòng để lại bình luận để được hỗ trợ.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://anonyviet.com/code-hieu-ung-phao-hoa-theo-chuot-trang-tri-website-tet/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Code chuyển giao diện Website sang nền trắng đen để tưởng nhớ hoặc để Quốc tang</title>
		<link>https://anonyviet.com/code-chuyen-theme-website-sang-nen-trang-den/</link>
					<comments>https://anonyviet.com/code-chuyen-theme-website-sang-nen-trang-den/#respond</comments>
		
		<dc:creator><![CDATA[AnonyViet]]></dc:creator>
		<pubDate>Sat, 20 Jul 2024 04:55:36 +0000</pubDate>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[dark mode]]></category>
		<category><![CDATA[theme]]></category>
		<category><![CDATA[đổi theme trắng đen]]></category>
		<guid isPermaLink="false">https://anonyviet.com/?p=63445</guid>

					<description><![CDATA[Việc chuyển giao diện sang nền trắng đen là không bắt buộc, tuy nhiên nếu bạn tưởng nhớ hoặc hoặc để tang một nhân vật quan trọng đối với đất nước hoặc đình, bạn có thể dùng đoạn code dưới đây. Code này cũng gần giống với chuyển giao diện về Dark Mode, nhưng thay [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Việc chuyển giao diện sang nền trắng đen là không bắt buộc, tuy nhiên nếu bạn tưởng nhớ hoặc hoặc để tang một nhân vật quan trọng đối với đất nước hoặc đình, bạn có thể dùng đoạn code dưới đây. Code này cũng gần giống với chuyển giao diện về Dark Mode, nhưng thay vì nền tối thì giao diện web sẽ chuyển sang nền xám, chữ trắng. Nội dung của Website sẽ không thay đổi, chỉ thay đổi màu sắc của theme.</p>
<h2>Code chuyển theme Website sang nền trắng đen</h2>
<h3>Đổi nền trắng đen cho WordPress</h3>
<p>Nếu bạn dùng WordPress, hãy truy cập vào <strong>Menu -&gt; Apperance -&gt; Customize -&gt; Custom CSS</strong> vào copy đoạn code CSS này vào, sau đó save lại:</p>
<p><img decoding="async" class="aligncenter size-full " src="https://anonyviet.com/wp-content/uploads/2024/07/doi-theme-website-sang-trang-den.jpg" alt="Code chuyển giao diện Website sang nền trắng đen để tưởng nhớ hoặc để Quốc tang 6" width="509" height="280" title="Code chuyển giao diện Website sang nền trắng đen để tưởng nhớ hoặc để Quốc tang 34"></p>
<p><code>html {filter: grayscale(100%);}</code></p>
<p><img decoding="async" class="aligncenter size-full " src="https://anonyviet.com/wp-content/uploads/2024/07/css-trang-den-website.jpg" alt="css trang den website" width="457" height="401" title="Code chuyển giao diện Website sang nền trắng đen để tưởng nhớ hoặc để Quốc tang 35"></p>
<p>Nếu bạn dùng Theme có chức năng tinh chỉnh CSS, thì vào Menu chỉnh CSS của theme đó nhé. Sau đó bạn truy cập vào trang chủ website của bạn để thấy xem sự thay đổi màu sắc giao diện của Website</p>
<p><img decoding="async" class="aligncenter size-full " src="https://anonyviet.com/wp-content/uploads/2024/07/chuyen-giao-dien-website-sang-trang-den.jpg" alt="chuyen giao dien website sang trang den" width="961" height="483" title="Code chuyển giao diện Website sang nền trắng đen để tưởng nhớ hoặc để Quốc tang 36"></p>
<p>Code này mình sưu tầm trên Facebook</p>
<h3>Đổi nền trắng đen cho Blogspot</h3>
<p>Blogspot là nền tảng tạo blog miễn phí của Google, bạn cũng có thể đổi nền trắng đen để tưởng nhớ hoặc Quốc tang bằng chỉnh chỉnh CSS cho theme của Website.</p>
<p><strong>Bước 1:</strong> Truy cập vào bảng điều khiển Blogspot của bạn.</p>
<p><strong>Bước 2:</strong> Chọn &#8220;Theme&#8221; từ menu bên trái.</p>
<p><strong>Bước 3:</strong> Nhấp vào <strong>dấu mũi tên</strong> bên cạnh chữ &#8220;<strong>Customize</strong>&#8221;</p>
<p><img decoding="async" class="aligncenter size-full " src="https://anonyviet.com/wp-content/uploads/2024/07/chinh-css-trang-den-blogspot.jpg" alt="chinh css trang den blogspot" width="694" height="398" title="Code chuyển giao diện Website sang nền trắng đen để tưởng nhớ hoặc để Quốc tang 37"></p>
<p><strong> Bước 4:</strong> &#8220;Edit HTML&#8221; (tùy vào giao diện blogspot của bạn).</p>
<p><img decoding="async" class="aligncenter size-full " src="https://anonyviet.com/wp-content/uploads/2024/07/edit-html.jpg" alt="edit html" width="732" height="418" title="Code chuyển giao diện Website sang nền trắng đen để tưởng nhớ hoặc để Quốc tang 38"></p>
<p><strong>Bước 5:</strong> Phía dưới thẻ <strong>&lt;head&gt;</strong>, copy đoạn code này và save lại để hoàn tất chuyển Code chuyển giao diện Website sang nền trắng đen để tưởng nhớ hoặc để Quốc tang:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">html {
    filter: grayscale(100%);
}</pre>
<p>Đây là mẫu ví dụ đổi theme trắng đen cho Blogspot:</p>
<p><img decoding="async" class="aligncenter size-full " src="https://anonyviet.com/wp-content/uploads/2024/07/head-blogpsot.jpg" alt="head blogpsot" width="771" height="375" title="Code chuyển giao diện Website sang nền trắng đen để tưởng nhớ hoặc để Quốc tang 39"></p>
<h3>Đổi nền trắng đen cho Website code tay</h3>
<p>Tương tự như blogspot, bạn thêm đoạn css vào phía dưới thẻ &lt;head&gt; có thể dùng đoạn code mẫu dưới đây:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
&lt;head&gt;
    &lt;meta charset="UTF-8"&gt;
    &lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
    &lt;title&gt;My Website&lt;/title&gt;
    &lt;style&gt;
        html {
            filter: grayscale(100%);
        }
    &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;h1&gt;Welcome to AnonyViet&lt;/h1&gt;
    &lt;p&gt;Chuyển nền trắng đen cho website.&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>&nbsp;</p>
<p>Code chuyển giao diện website sang nền trắng đen là một cách đơn giản và hiệu quả để thể hiện sự tôn trọng và tưởng nhớ trong những thời điểm tang thương. Với những hướng dẫn chi tiết trong bài viết này, bạn có thể dễ dàng thực hiện điều này trên website của mình.</p>
<h2>Câu hỏi thường gặp</h2>
<h3>Làm thế nào để chuyển giao diện website sang chế độ trắng đen trên WordPress?</h3>
<p>Trên WordPress, bạn truy cập <strong>Menu -> Appearance -> Customize -> Custom CSS</strong> và thêm đoạn code <code>html { filter: grayscale(100%); }</code> vào. Lưu lại thay đổi để áp dụng.</p>
<h3>Tôi có thể áp dụng hiệu ứng trắng đen cho website Blogspot như thế nào?</h3>
<p>Với Blogspot, truy cập bảng điều khiển, chọn &#8220;Theme&#8221;, nhấp vào &#8220;Customize&#8221;, tìm &#8220;Edit HTML&#8221; và thêm <code>html { filter: grayscale(100%); }</code> phía dưới thẻ <code>&lt;head&gt;</code>. Lưu lại để hoàn tất.</p>
<h3>Nếu website của tôi được code tay, tôi cần làm gì để chuyển sang chế độ trắng đen?</h3>
<p>Thêm đoạn code <code>html { filter: grayscale(100%); }</code> vào phần <code>&lt;style&gt;</code> trong phần <code>&lt;head&gt;</code> của mã nguồn HTML website.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://anonyviet.com/code-chuyen-theme-website-sang-nen-trang-den/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Hướng dẫn Active Wordfence Security Premium miễn phí</title>
		<link>https://anonyviet.com/huong-dan-active-wordfence-security-premium-mien-phi/</link>
					<comments>https://anonyviet.com/huong-dan-active-wordfence-security-premium-mien-phi/#comments</comments>
		
		<dc:creator><![CDATA[AnonyViet]]></dc:creator>
		<pubDate>Fri, 07 Jun 2024 01:59:22 +0000</pubDate>
				<category><![CDATA[Code]]></category>
		<guid isPermaLink="false">https://anonyviet.com/?p=61111</guid>

					<description><![CDATA[Wordfence Security là một plugin bảo mật phổ biến cho WordPress. Nó cung cấp nhiều tính năng để bảo vệ trang web của bạn khỏi các mối nguy hiểm. Nếu bạn nâng cấp từ Wordfence Security Free lên Wordfence Premium thì sẽ có thêm các tính năng bảo mật nâng cao. Một số công dụng [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Wordfence Security là một plugin bảo mật phổ biến cho WordPress. Nó cung cấp nhiều tính năng để bảo vệ trang web của bạn khỏi các mối nguy hiểm. Nếu bạn nâng cấp từ Wordfence Security Free lên Wordfence Premium thì sẽ có thêm các tính năng bảo mật nâng cao. Một số công dụng của plugin Wordfence Security:</p>
<ul>
<li>Phát hiện và chặn phần mềm độc hại: Wordfence quét các tệp web của bạn để tìm phần mềm độc hại và chặn các cuộc tấn công độc hại trước khi chúng có thể gây hại.</li>
<li>Phòng chống brute force: Wordfence chặn các cuộc tấn công brute force nhằm mục đích đoán mật khẩu của người dùng.</li>
<li>Báo động và thông báo: Wordfence thông báo cho bạn về các hoạt động đáng ngờ trên trang web của bạn và cung cấp thông tin chi tiết về các cuộc tấn công.</li>
<li>Tường lửa mạng: Wordfence có một tường lửa mạng mạnh mẽ giúp chặn các cuộc tấn công từ mạng lưới.</li>
<li>Quét thời gian thực: Wordfence quét trang web của bạn theo thời gian thực để tìm các mối đe dọa tiềm ẩn.</li>
<li>Hỗ trợ nhiều ngôn ngữ: Wordfence hỗ trợ nhiều ngôn ngữ, bao gồm tiếng Việt.</li>
</ul>
<h2><strong>So sánh Wordfence Security bản miễn phí và Premium</strong></h2>
<table>
<tbody>
<tr>
<td><strong>Tính năng</strong></td>
<td><strong>Miễn phí</strong></td>
<td><strong>Premium</strong></td>
</tr>
<tr>
<td><strong>Quét bảo mật</strong></td>
<td>Quét cơ bản phần mềm độc hại, lỗ hổng và các mối đe dọa khác</td>
<td>Quét nâng cao phần mềm độc hại, lỗ hổng, zero-day attacks và các mối đe dọa khác</td>
</tr>
<tr>
<td><strong>Web Application Firewall (WAF)</strong></td>
<td>Chặn lưu lượng truy cập độc hại</td>
<td>Chặn lưu lượng truy cập độc hại, bot và các mối đe dọa nâng cao khác</td>
</tr>
<tr>
<td><strong>Bảo mật đăng nhập</strong></td>
<td>Xác thực hai yếu tố (2FA)</td>
<td>Xác thực hai yếu tố (2FA), CAPTCHA, chặn đăng nhập dựa trên mật khẩu bị rò rỉ</td>
</tr>
<tr>
<td><strong>Giám sát hoạt động</strong></td>
<td>Theo dõi hoạt động của trang web và nhận thông báo về các hoạt động đáng ngờ</td>
<td>Theo dõi hoạt động chi tiết của trang web, nhận thông báo về các hoạt động đáng ngờ và phân tích hành vi của người dùng</td>
</tr>
<tr>
<td><strong>Hỗ trợ</strong></td>
<td>Diễn đàn cộng đồng</td>
<td>Hỗ trợ qua email và vé ưu tiên</td>
</tr>
<tr>
<td><strong>Cập nhật</strong></td>
<td>Cập nhật bảo mật và tính năng miễn phí</td>
<td>Cập nhật bảo mật và tính năng cao cấp</td>
</tr>
</tbody>
</table>
<h2>Hướng dẫn Active Wordfence Security Premium miễn phí</h2>
<p>Bản free của Wordfence Security hầu như cũng đã đáp ứng đủ yêu cầu người dùng, tuy nhiên nếu bạn muốn nâng cấp lên bản Wordfence Security Premium, có 1 cách khá đơn giản là chỉnh lại Code active của plugin này. Cách này đảm bảo an toàn và không dùng ứng bên thứ 3 nên bạn có thể tự làm để kích hoạt được các tính năng của Wordfence Security Premium.</p>
<p>Sau khi cài đặt Plugin Wordfence Security xong hoặc <a href="https://wordpress.org/plugins/wordfence/" target="_blank" rel="noopener">tải Plugin Wordfence Security</a> từ trang chủ wordpress, bạn truy cập vào thư mục: <code>wp-content/plugins/wordfence/lib/</code></p>
<p>Tìm và mở file <code>wordfenceClass.php</code> bằng chương trình soạn thảo như notepad++, <a href="https://anonyviet.com/cach-active-key-sublime-text-4/">sublime text</a> hoặc notepad cũng được.</p>
<p>nhấn Ctrl + F tìm đoạn code sau:  <code>if (!WFWAF_SUBDIRECTORY_INSTALL &amp;&amp; $waf = wfWAF::getInstance()) {</code></p>
<p>Tùy mỗi phiên bản, nó sẽ ở nằm cách dòng khác nhau, như ở bản 7.11.6 thì nó sẽ nằm ở dòng 2145.</p>
<p><img decoding="async" class="aligncenter size-full " src="https://anonyviet.com/wp-content/uploads/2024/06/active-Wordfence-Security-Premium.jpg" alt="active Wordfence Security Premium" width="881" height="103" title="Hướng dẫn Active Wordfence Security Premium miễn phí 43"></p>
<p>Bạn sẽ thấy 3 đoạn code này sau khi tìm:</p>
<p><code> if (!WFWAF_SUBDIRECTORY_INSTALL &amp;&amp; $waf = wfWAF::getInstance()) {</code><br />
<code>$homeurl = wfUtils::wpHomeURL();</code><br />
<code>$siteurl = wfUtils::wpSiteURL();</code></p>
<p>Bây giờ thêm đoạn code này vào phía dưới của cụm code trên:</p>
<p><code> wfConfig::set('isPaid', 1);</code><br />
<code>wfConfig::set('keyType', wfLicense::KEY_TYPE_PAID_CURRENT);</code><br />
<code>wfConfig::set('premiumNextRenew', time()+31536000);</code></p>
<p><strong>Kết quả ta sẽ được như hình là ok:</strong></p>
<p><img decoding="async" class="aligncenter size-full " src="https://anonyviet.com/wp-content/uploads/2024/06/code-crack-Wordfence-Security-Premium.jpg" alt="code crack Wordfence Security Premium" width="908" height="193" title="Hướng dẫn Active Wordfence Security Premium miễn phí 44"></p>
<p>Bây giờ bạn Save lại và vào lại Plugin sẽ thấy active Active Wordfence Security Premium miễn phí. Thấy xuất hiện dòng: <strong>Premium License Expiring</strong> là thành công.</p>
<p><img decoding="async" class="aligncenter size-full " src="https://anonyviet.com/wp-content/uploads/2024/06/Wordfence-Security-Premium-crack-free.jpg" alt="Wordfence Security Premium crack free" width="1007" height="317" title="Hướng dẫn Active Wordfence Security Premium miễn phí 45"></p>
<p>Mỗi khi update plugin có thể cấu trúc code sẽ thay đổi, do đó bạn phải active Wordfence Security Premium miễn phílại từ đầu nhé.</p>
<h2>Câu hỏi thường gặp</h2>
<h3>Tôi có cần kiến thức lập trình để kích hoạt Wordfence Security Premium miễn phí không?</h3>
<p>Không cần kiến thức lập trình chuyên sâu. Bạn chỉ cần biết cách sử dụng trình soạn thảo văn bản như Notepad++ hoặc Sublime Text để chỉnh sửa file code và tìm kiếm đoạn code cần thiết.</p>
<h3>Nếu tôi cập nhật plugin Wordfence, việc kích hoạt Premium có bị ảnh hưởng không?</h3>
<p>Có thể. Cấu trúc code có thể thay đổi sau mỗi lần cập nhật. Bạn cần thực hiện lại các bước kích hoạt như hướng dẫn trong bài viết.</p>
<h3>Phương pháp này có an toàn cho website của tôi không?</h3>
<p>Phương pháp này tương đối an toàn vì chỉ chỉnh sửa file code trong plugin, không can thiệp vào các file cốt lõi của WordPress. Tuy nhiên, vẫn nên sao lưu website trước khi thực hiện.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://anonyviet.com/huong-dan-active-wordfence-security-premium-mien-phi/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Ronin Engineer Tích Hợp với VNPay Như Thế Nào?</title>
		<link>https://anonyviet.com/ronin-engineer-tich-hop-voi-vnpay-nhu-the-nao/</link>
					<comments>https://anonyviet.com/ronin-engineer-tich-hop-voi-vnpay-nhu-the-nao/#respond</comments>
		
		<dc:creator><![CDATA[AnonyViet]]></dc:creator>
		<pubDate>Thu, 02 May 2024 09:14:36 +0000</pubDate>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[qr]]></category>
		<category><![CDATA[thanh toán online]]></category>
		<category><![CDATA[VNPAY]]></category>
		<guid isPermaLink="false">https://anonyviet.com/?p=59490</guid>

					<description><![CDATA[Hello mọi người, mình là một Ronin Engineer. Hôm nay mình sẽ trình bày website roninhub.com bên mình tích hợp với VNPay như nào thế? Let’s go! 1. Yêu Cầu Đầu tiên, chúng ta sẽ bắt đầu bằng yêu cầu của nghiệp vụ. &#8211; (Automation) Một giải pháp thanh toán tự động: Nó không chỉ [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><span style="font-weight: 400;">Hello mọi người, mình là một Ronin Engineer. Hôm nay mình sẽ trình bày website </span><a href="https://roninhub.com" target="_blank" rel="noopener"><span style="font-weight: 400;">roninhub.com</span></a><span style="font-weight: 400;"> bên mình tích hợp với VNPay như nào thế?</span></p>
<p><span style="font-weight: 400;">Let’s go!</span></p>
<h2><span style="font-weight: 400;">1. Yêu Cầu</span></h2>
<p><span style="font-weight: 400;">Đầu tiên, chúng ta sẽ bắt đầu bằng yêu cầu của nghiệp vụ.</span></p>
<p><b>&#8211; (Automation) Một giải pháp thanh toán tự động</b><span style="font-weight: 400;">: Nó không chỉ tạo ra sự thuận tiện và tăng trải nghiệm của người dùng mà còn giảm chi phí vận hành “bằng cơm&#8221;.</span></p>
<p><b>&#8211; (Security) Tính bảo mật cao: </b><span style="font-weight: 400;">Liên quan tới tiền, tài chính thì yếu tố này đặc biệt quan trọng, nó có thể ảnh hưởng trực tiếp tới business. </span></p>
<p><span style="font-weight: 400;">&#8211; </span><b>(Pricing) Phí giao dịch thấp</b><span style="font-weight: 400;">: Khi số lượng giao dịch lớn hoặc tỷ suất lợi nhuận của bạn thấp, nếu phí trên mỗi giao dịch cao thì tổng phí giao dịch là một khoản đáng kể.</span></p>
<p><b>&#8211; (Scalability) Hỗ trợ nhiều phương thức thanh toán</b><span style="font-weight: 400;">: Do người dùng của hệ thống có thể là sinh viên, người đi làm hoặc người có thói quen sử dụng thẻ thanh toán quốc tế. Ngoài ra, về sau nghiệp vụ có thể mở rộng hỗ trợ cả thanh toán trả góp. Do đó, việc hỗ trợ nhiều phương thức thanh toán là cần thiết.</span></p>
<p><span style="font-weight: 400;">&#8211; Ngoài ra, chúng ta có thể đánh giá thêm các yếu tố như độ ổn định, hỗ trợ khách hàng, khuyến mãi, giao diện, độ khó tích hợp, quản lý và các tính năng khác, …</span></p>
<p><span style="font-weight: 400;">Như vậy, chúng ta sẽ cần tích hợp một cổng thanh toán để giải quyết yêu cầu trên của nghiệp vụ. Bên cạnh đó, cổng thanh toán cần đáp ứng được ít nhất là 4 yếu tố chính trên.</span></p>
<h2><span style="font-weight: 400;">2. Tại Sao là VNPay QR?</span></h2>
<p><span style="font-weight: 400;">Đầu tiên, tại sao lại là VNPay QR? Thứ nhất, bên mình </span><b>không quảng cáo cho VNPay</b><span style="font-weight: 400;">. Và bên mình cũng chưa trải nghiệm hết tất cả các bên cung cấp giải pháp thanh toán nên việc so sánh giữa các bên là không khách quan. </span><b>Mỗi bên đều có ưu nhược điểm, việc lựa chọn sẽ phụ thuộc vào yêu cầu cụ thể của bạn.</b></p>
<p><span style="font-weight: 400;">Dưới đây mình đưa một số thông tin để bạn tham khảo nhé.</span></p>
<h3><span style="font-weight: 400;">2.1. Bảo Mật</span></h3>
<p><span style="font-weight: 400;">Quan điểm của mình là nên chọn những nhà cung cấp lớn và uy tín thì khả năng có tính bảo mật cao. Tuy chưa có một thống kê cụ thể về thị phần nhưng theo mình có thể kể đến các ông lớn sau:</span></p>
<p><span style="font-weight: 400;">&#8211; Napas</span></p>
<p><span style="font-weight: 400;">&#8211; Momo</span></p>
<p><span style="font-weight: 400;">&#8211; VNPay</span></p>
<p><span style="font-weight: 400;">&#8211; Viettel Paygate</span></p>
<p><span style="font-weight: 400;">Mình đoán những năm gần đây VNPay đang dần vươn lên trong thị trường ví điện tử, giải pháp thanh toán. Chúng ta dễ dàng nhìn thấy nhiều chiến dịch marketing rầm rộ từ trên TV, biển quảng cáo trên những trục đường to, cho đến những quán cơm nhỏ có những chiếc loa nhỏ nhỏ xinh xinh thông báo biến động số dư. Kéo theo mảng về cổng thanh toán VNPay QR cũng phát triển.</span></p>
<p><span style="font-weight: 400;">Xét về thông số bảo mật, hầu hết các bên cung cấp đều tuân thủ tiêu chuẩn bảo mật PCI DSS. Nhưng ta cần đánh giá thêm về version và level của PCI DSS. Nôm na, version cao, level thấp là tốt. Ví dụ version 4.0, level 1 là “xịn&#8221;.</span></p>
<p><a href="https://drive.google.com/file/d/1iWbU9Y92nKvU4ILPrau6zPR80kjaB_PE/view?usp=sharing" target="_blank" rel="noopener"><span style="font-weight: 400;">Thông tin PCI DSS của một số cổng thanh toán</span></a></p>
<p><span style="font-weight: 400;">Theo thông tin trên, VNPay QR có độ bảo mật đứng thứ 2 và Momo có độ bảo mật cao nhất.</span></p>
<h3><span style="font-weight: 400;">2.2. Phí</span></h3>
<p><span style="font-weight: 400;">Dưới đây là bảng giá của một số cổng thanh toán với phương thức thanh toán là QR mobile banking (nội địa).</span></p>
<p><img decoding="async" class="aligncenter size-full " src="https://anonyviet.com/wp-content/uploads/2024/05/phi-qr.jpg" alt="phí qr" width="757" height="211" title="Ronin Engineer Tích Hợp với VNPay Như Thế Nào? 49"></p>
<p><span style="font-weight: 400;">Chúng ta có thể thấy VNPay QR có phí giao dịch không phải rẻ so với các bên khác.</span></p>
<h3><span style="font-weight: 400;">2.3. Yếu Tố Khác</span></h3>
<p><span style="font-weight: 400;">Bên cạnh đó, VNPay QR có:</span></p>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Tốc độ xử lý giao dịch nhanh và ổn định.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Sale và hỗ trợ kỹ thuật đều nhiệt tình hỗ trợ.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Giao diện không quá đẹp nhưng thân thiện.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Liên kết với nhiều ngân hàng.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Thỉnh thoảng có khuyến mãi hấp dẫn.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Tính năng quản lý đầy đủ.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Hỗ trợ phương thức trả góp, một tính năng hay và business sẽ sử dụng trong tương lai.</span></li>
</ul>
<p><span style="font-weight: 400;">Tuy có nhiều điểm mạnh nhưng VNPay QR cũng có những điểm cần cải thiện, mình sẽ đề cập ở các phần sau.</span></p>
<h2><span style="font-weight: 400;">3. Thiết Kế</span></h2>
<p><span style="font-weight: 400;">Về luồng tích hợp, mọi người có thể xem thêm tại trang docs của VNPay QR giúp mình nhé.</span></p>
<p><a href="https://sandbox.vnpayment.vn/apis/docs/thanh-toan-pay/pay.html" target="_blank" rel="noopener"><span style="font-weight: 400;">https://sandbox.vnpayment.vn/apis/docs/thanh-toan-pay/pay.html</span></a><span style="font-weight: 400;"> </span></p>
<p><span style="font-weight: 400;">Trong docs đang chỉ vẽ và mô tả luồng thanh toán bằng thẻ. Tuy nhiên phương thức thanh toán mà khách hàng hay sử dụng lại là QR mobile banking nên mình sẽ vẽ thêm cho luồng phương thức thanh toán QR theo kiểu khác. Ngoài ra, mình sẽ vẽ thêm luồng tiền để mọi người dễ hiểu và có bức tranh toàn cảnh hơn.</span></p>
<h3><span style="font-weight: 400;">3.1. Luồng Thanh Toán QR</span></h3>
<p><img decoding="async" class="aligncenter size-full " src="https://anonyviet.com/wp-content/uploads/2024/05/luong-thanh-toan-qr.png" alt="luong thanh toan qr" width="672" height="593" title="Ronin Engineer Tích Hợp với VNPay Như Thế Nào? 50"></p>
<p><span style="font-weight: 400;">Chú thích: </span></p>
<ul>
<li><span style="font-weight: 400;">Ronin FE: frontend của RoninHub</span></li>
<li><span style="font-weight: 400;">Ronin BE: backend của RoninHub</span></li>
<li><span style="font-weight: 400;">PGW FE: frontend của cổng thanh toán VNPay QR</span></li>
<li><span style="font-weight: 400;">PGW BE: backend của cổng thanh toán VNPay QR</span></li>
<li><span style="font-weight: 400;">Bank: ngân hàng mà khách hàng sử dụng, cũng là ngân hàng mà cổng thanh toán có kết nối.</span></li>
<li><span style="font-weight: 400;">Luồng trên là happy case.</span></li>
</ul>
<p><span style="font-weight: 400;">Luồng:</span></p>
<p>1. User thao tác tạo yêu cầu thanh toán trên Ronin FE.<br />
2. Ronin FE gửi yêu cầu thanh toán lên Ronin BE.<br />
3. Ronin BE xử lý yêu cầu thanh toán, tạo transaction lưu xuống DB<br />
4. Ronin BE tạo ra 1 URL thanh toán có dạng sau và gửi về cho Ronin FE. Trong URL thanh toán chứa thông tin thanh toán, Return URL (được sử dụng ở bước 9.2) và các thông tin khác. Payment URL Sample: https://codefile.io/f/czM3UMeADE<br />
5. Ronin FE (browser) sẽ điều hướng sang PGW FE theo URL thanh toán trên.<br />
6. Client chọn phương thức thanh toán QR. Mã QR sẽ hiện trên web của cổng. Client sử dụng app ngân hàng quét QR và thực hiện xác thực để thanh toán.<br />
7. Ứng dụng ngân hàng của Client sẽ gửi lệnh chuyển khoản lên Bank.<br />
8. Khi tài khoản của VNPay tại Bank có biến động số dư, Bank sẽ gửi thông báo giao dịch về cho VNPay.<br />
9. Sau khi VNPay xử lý giao dịch thành công, hệ thống sẽ thực hiện đồng thời 2 bước (9.1 và 9.2).<br />
9.1.1. VNPay gửi thông báo kết quả giao dịch về cho Ronin BE bằng cách gọi API IPN (Instant Payment Notification) của Ronin BE<br />
9.1.2. Ronin BE thực hiện cập nhận trạng thái giao dịch của hệ thống.<br />
9.2.1. VNPay BE gửi yêu cầu điều hướng tới VNPay FE.<br />
9.2.2. VNPay FE sẽ được điều hướng về lại Ronin FE theo Return URL được tạo ở bước 4.<br />
9.2.3. Ronin FE sẽ định kỳ kiểm tra trạng thái của giao dịch bằng cách gọi API của Ronin BE. Vì bước 9.1 và 9.2 được thực hiện đồng thời nên có thể 9.2 được thực hiện trước khi giao dịch được cập nhật trạng thái ở bước 9.1.</p>
<h3><span style="font-weight: 400;">3.2. Luồng Tiền</span></h3>
<p><span style="font-weight: 400;">Cổng thanh toán VNPay QR liên kết với nhiều ngân hàng, lúc đó ở mỗi ngân hàng sẽ tồn tại (ít nhất) 2 tài khoản của VNPay QR.</span></p>
<p><span style="font-weight: 400;">&#8211; 1 tài khoản </span><b>PGW Merchant Account</b><span style="font-weight: 400;"> dùng để tiếp nhận lệnh thanh toán từ phía tài khoản khách hàng Client Account.</span></p>
<p><span style="font-weight: 400;">&#8211; 1 tài khoản </span><b>PGW Settlement Account</b><span style="font-weight: 400;"> dùng để quyết toán (settlmentsettlement) cho tài khoản Merchant Account (tài khoản ngân hàng của Ronin Engineer)</span></p>
<p><span style="font-weight: 400;">&#8211; Đối với ngân hàng, VNPay là 1 merchant kết nối với ngân hàng. Còn đối với VNPay, Ronin Engineer là 1 merchant kết nối với cổng thanh toán.</span></p>
<p><span style="font-weight: 400;">Như vậy, mọi người có thể hình dung luồng tiền sẽ đi như sau:</span></p>
<p><img decoding="async" class="aligncenter size-full " src="https://anonyviet.com/wp-content/uploads/2024/05/02-05-2024-04-10-09.png" alt="Ronin Engineer Tích Hợp với VNPay Như Thế Nào? 8" width="1491" height="309" title="Ronin Engineer Tích Hợp với VNPay Như Thế Nào? 51"></p>
<ol>
<li><span style="font-weight: 400;"> Client thao tác thanh toán QR trên ứng dụng ngân hàng. </span></li>
<li><span style="font-weight: 400;"> Ví dụ ngân hàng khách hàng sử dụng là Techcombank. Sau khi xác thực thành công, </span><b>tài khoản khách hàng (Client Account) sẽ chuyển khoản tới PGW Merchant Account</b><span style="font-weight: 400;"> tại Techcombank.</span></li>
<li><span style="font-weight: 400;"> VNPay có kết nối với Techcombank nên khi tài khoản PGW Merchant Account có biến động số dư thì ngân hàng sẽ gửi thông báo, thông tin giao dịch về cho VNPay để VNPay xử lý.</span></li>
<li><span style="font-weight: 400;"> VNPay xử lý xong sẽ gửi thông báo về Ronin BE tại IPN API.</span></li>
<li><span style="font-weight: 400;"> Sau đó, VNPay gom các thanh toán vào ngày T và thực hiện quyết toán cho Merchant vào ngày T + 1. </span></li>
<li><span style="font-weight: 400;"> Ví dụ merchant Ronin sử dụng ngân hàng BIDV, VNPay sẽ gửi lệnh quyết toán tới </span><b>tài khoản PGW Settlement Account tại BIDV và chuyển khoản cho Merchant Account </b><span style="font-weight: 400;">(toàn khoản của Ronin).</span></li>
<li><span style="font-weight: 400;"> Định kỳ VNPay thực hiện đối soát với ngân hàng. Kiểm tra, so sánh giao dịch giữa cổng thanh toán và ngân hàng để đảm bảo tất cả giao dịch đã được ghi chép chính xác và đầy đủ.</span></li>
</ol>
<p><strong>Lưu ý:</strong></p>
<p><span style="font-weight: 400;">&#8211; Bước 2 và bước 6 là phản ánh luồng tiền.</span></p>
<p><span style="font-weight: 400;">&#8211; Từ bước 1 đến 4 sẽ được thực hiện tại thời điểm giao dịch và trong ngày T.</span></p>
<p><span style="font-weight: 400;">&#8211; Bước 5 và 6 thực hiện tại ngày T + 1.</span></p>
<p><span style="font-weight: 400;">&#8211; Cùng trong 1 thanh toán, nhưng 3 hệ thống khác nhau (bank, payment gateway, merchant), mỗi hệ thống sẽ ghi nhận 1 mã giao dịch khác nhau.</span></p>
<h2><span style="font-weight: 400;">4. Code Mẫu</span></h2>
<p><span style="font-weight: 400;">Đối với luồng thanh toán có 2 bước quan trọng đó là bước 4 (tạo giao dịch và URL thanh toán) và bước 9.1 (API IPN nhận thông báo kết quả giao dịch).</span></p>
<p><span style="font-weight: 400;">Mình sẽ cùng mọi người review code mẫu nodejs trên trang docs của VNPay nha.</span></p>
<p><span style="font-weight: 400;">Trước khi review, mọi người vui lòng đọc trước tài liệu kỹ thuật của VNPay để nắm được ý nghĩa của các tham số nhé.</span></p>
<p><a href="https://sandbox.vnpayment.vn/apis/docs/thanh-toan-pay/pay.html" target="_blank" rel="noopener"><span style="font-weight: 400;">https://sandbox.vnpayment.vn/apis/docs/thanh-toan-pay/pay.html</span></a><span style="font-weight: 400;"> </span></p>
<h3><span style="font-weight: 400;">4.1. API Tạo URL Thanh Toán</span></h3>
<p><span style="font-weight: 400;">Code mẫu tạo Payment URL: </span><a href="https://codefile.io/f/qAAxf2shgq" target="_blank" rel="noopener"><span style="font-weight: 400;">https://codefile.io/f/qAAxf2shgq</span></a><span style="font-weight: 400;"> </span></p>
<p><span style="font-weight: 400;">&#8211; Đầu tiên, chúng ta nên làm theo những hướng dẫn của VNPay. Cung cấp đầy đủ các tham số và </span><b>đúng định dạng</b><span style="font-weight: 400;">. Ví dụ một số tham số mọi người cần lưu ý sau.</span></p>
<p><span style="font-weight: 400;">&#8211; <code>vnp_Amount</code> số tiền thanh toán, không có dấu thập phân và phải nhân thêm 100 trước khi gửi sang VNPay.</span></p>
<p><span style="font-weight: 400;">&#8211; Những tham số dạng date có timezone là +7 và format là yyyyMMddHHmmss. Mình chưa hiểu lý do vì sao VNPay không để format ISO</span></p>
<p><span style="font-weight: 400;">&#8211; <code>vnp_IpAddr</code> là string. Nếu lấy IP address theo code mẫu thì giá trị có thể là nhiều địa chỉ IP nối nhau như này 13.160.92.202, 12.161.56.21. Như vậy, không đúng định dạng trong docs. Mọi người nên chỉ lấy 1 địa chỉ IP, có thể là IP đầu tiên hoặc IP cố định của server. Để tránh lỗi có thể xảy ra ở đầu VNPay.</span></p>
<p><span style="font-weight: 400;">&#8211; <code>vnp_ExpireDate</code> mọi người nên đặt thời gian hết hạn. Tham số này trong code mẫu khai báo. Mọi người không nên đặt thời gian quá dài, không nên quá 30p, mình đang để 15p.</span></p>
<p><span style="font-weight: 400;">&#8211; <code>vnp_Version</code> nên sử dụng version mới. Lý do tại sao mình sẽ đề cập tại ở phần bảo mật bên dưới.</span></p>
<p><span style="font-weight: 400;">&#8211; <code>vnp_TxnRef</code> là mã giao dịch tại Ronin BE. Mọi người lưu ý đối với trường hợp mua hàng trên web, lúc đó entity Order sẽ được sinh ra trước, entity Transaction sẽ được sinh ra sau. Ngoài ra, có trường hợp không order nhưng vẫn có transaction. Ví dụ như hoàn tiền (refund). Vậy nên, mọi người lưu ý cần tách biệt 2 entity này ra và </span><b><code>vnp_TxnRef</code> nên để là <code>transaction_id</code></b><span style="font-weight: 400;">.</span></p>
<p><span style="font-weight: 400;">&#8211; Để code clean hơn, mọi người có thể sắp xếp thứ tự tầm quan trọng của các tham số theo chiều giảm dần và nhóm các tham số có quan hệ với nhau thành một nhóm. Ví dụ như sau:</span></p>
<p><span style="font-weight: 400;">👉 Code mẫu thứ tự khởi tạo params: </span><a href="https://codefile.io/f/Q8qFW121nr" target="_blank" rel="noopener"><span style="font-weight: 400;">https://codefile.io/f/Q8qFW121nr</span></a><span style="font-weight: 400;"> </span></p>
<h3><span style="font-weight: 400;">4.2. API IPN</span></h3>
<p><span style="font-weight: 400;">👉 Code mẫu xử lý IPN: </span><a href="https://codefile.io/f/uIO3R2H1PZ" target="_blank" rel="noopener"><span style="font-weight: 400;">https://codefile.io/f/uIO3R2H1PZ</span></a><span style="font-weight: 400;"> </span></p>
<p><span style="font-weight: 400;">&#8211; Nhiệm vụ của API IPN này là nhận thông báo kết quả giao dịch và cập nhật lại trạng thái của transaction, order.</span></p>
<p><span style="font-weight: 400;">&#8211; Đầu tiên, chúng ta cần validate những tham số sau:</span></p>
<p><span style="font-weight: 400;">&#8211; <code>secureHash</code> mình sẽ nói sâu hơn ở phần sau. </span></p>
<p><span style="font-weight: 400;">&#8211; Kiểm tra order có tồn tại hay không</span></p>
<p><span style="font-weight: 400;">&#8211; Kiểm tra số tiền có bằng số tiền của order gốc không</span></p>
<p><span style="font-weight: 400;">&#8211; Kiểm tra trạng thái giao dịch và xử lý giao dịch theo từng trạng thái. </span></p>
<p><span style="font-weight: 400;">&#8211; Trong trường hợp, bạn để <code>vnp_TxnRef</code> là transaction id thì bạn cần kiểm tra cả transaction và order tương ứng với transaction. Sau đó, cập nhật trạng của cả transaction và order tương ứng.</span></p>
<p><span style="font-weight: 400;">&#8211; Trong code mẫu, sử dụng nested condition rất nhiều, như vậy code sẽ khó đọc. Trường hợp này, mình khuyến kích mọi người sử dụng Early Return pattern để code tường minh hơn. 🧼</span></p>
<p><a href="https://gomakethings.com/the-early-return-pattern-in-javascript/" target="_blank" rel="noopener"><span style="font-weight: 400;">https://gomakethings.com/the-early-return-pattern-in-javascript/</span></a><span style="font-weight: 400;"> </span></p>
<p><span style="font-weight: 400;">&#8211; Những biến như secretKey, querystring, crypto chúng ta có thể khởi tạo lúc start app, trước khi chạy function này.</span></p>
<p><span style="font-weight: 400;">&#8211; Mình không chuyên về javascript, nếu mọi người có thêm nhận xét thì comment ở dưới giúp mình nhé. 🙏</span></p>
<h2><span style="font-weight: 400;">5. Bảo Mật</span></h2>
<h3><span style="font-weight: 400;">5.1. Tính đúng đắn dữ liệu và Xác thực</span></h3>
<p><span style="font-weight: 400;">Trong luồng payment này, chúng ta cần giải quyết được 2 vấn đề bảo mật sau:</span></p>
<p><span style="font-weight: 400;">&#8211; </span><b>Data integrity</b><span style="font-weight: 400;">: Làm sao đảm bảo tính đúng đắn của dữ liệu? Do payment request được tạo ra ở BE và được gửi về cho FE để client thực hiện thanh toán. Tuy nhiên, phía client là phía dễ bị can thiệp nên chúng ta cần đảm bảo thông tin của payment request không bị sửa đổi trong quá trình vận chuyển từ BE → FE → VNPay.</span></p>
<p><span style="font-weight: 400;">&#8211; </span><b>Authentity</b><span style="font-weight: 400;">: Làm sao để xác thực rằng đầu tạo payment request là Ronin merchant và đầu gửi IPN là VNPay?</span></p>
<p><span style="font-weight: 400;">&#8211; Liệu có thể sử dụng 1 cơ chế để giải quyết được đồng thời 2 bài toán trên?</span></p>
<p><span style="font-weight: 400;">Đầu tiên, HTTPS không đáng tin cậy 100% do một số lỗ hổng của giao thức SSL/TLS và các version cũ. Ngoài ra, HTTPS chỉ mã hoá (che giấu) dữ liệu khi truyền tải (BE → FE), trong trường hợp này ta cần đảm bảo dữ liệu không bị sửa đổi ở đầu FE. Do đó, ta cần kết hợp thêm một cơ chế nữa để tăng cường bảo mật.</span></p>
<p><span style="font-weight: 400;">Một cơ chế mà giải quyết được đồng thời 2 bài toán trên thì chúng ta có thể nghĩ tới Message Authentication Code (key-based hash function) và chữ ký số (digital signature). Mỗi cơ chế đều có ưu nhược điểm. Thông thường, digital signature sử dùng asymmetric key, còn key-based hash sử dụng symmetric key. Key-based hash có hiệu suất tốt hơn nhưng độ bảo mật thường kém hơn so với digital signature. Trong trường hợp này, chúng ta cần đáng giá thêm yếu tố dễ dàng tích hợp. So với digital signature, key-based hash có ưu thế hơn ở điểm này. Do đó, VNPay sử dụng key-based hash, cụ thể là HMACSHA512.</span></p>
<p><span style="font-weight: 400;">Đầu merchant và đầu cổng thanh toán cần thống nhất với nhau một hash secret trước khi tích hợp. VNPay sẽ generate ra hash secret rồi gửi email cho merchant. Lúc này, mỗi khi tạo payment request, đầu merchant (Ronin BE) cần kết hợp thông tin thanh toán với secret, rồi hash (HMACSHA512) kết quả kết hợp. Cuối cùng, được giá trị vnp_SecureHash gửi về cho Ronin FE. Secure Hash đảm bảo nội dung của payment request không bị can thiệp, sửa đổi ở đầu FE. Khi gửi payment request lên VNPay, hệ thống sẽ sử dụng hash secret để xác thực chỉ có merchant Ronin mới có thể tạo ra payment request này.</span></p>
<h3><span style="font-weight: 400;">5.2. Cập Nhật Trạng Thái Thanh Toán</span></h3>
<p><span style="font-weight: 400;">Lưu ý, bước ReturnURL được thực hiện ở phía client mà phía client là phía dễ bị can thiệp hơn. Do đó, bước cập nhật trạng thái transaction/order phải được thực hiện ở bước IPN (bước 9.1), không được thực hiện ở bước ReturnURL (bước 9.2).</span></p>
<h3><span style="font-weight: 400;">5.3. Whitelist</span></h3>
<p><span style="font-weight: 400;">Để tăng cường bảo mật, chúng ta nên whitelist, chỉ cho phép một số địa chỉ IP có thể gọi vào API IPN. Đội kỹ thuật bên VNPay sẽ cung cấp danh sách địa chỉ IP này cho bạn.</span></p>
<h3><span style="font-weight: 400;">5.4. Version</span></h3>
<p><span style="font-weight: 400;">Best practice: nên sử dụng version mới nhất.</span></p>
<p><span style="font-weight: 400;">VNPay khuyến cáo sử dụng API version mới. Các thuật toán mã hóa phiên bản cũ đã kém an toàn và bảo mật. Merchant cần chuyển đổi sang phiên bản version 2.1.0 và thuật toán mã hóa HMACSHA512.</span></p>
<p><span style="font-weight: 400;">Nếu bạn có sử dụng các thư viện ngoài liên quan tới luồng payment thì nên kiểm tra lỗ hổng và update version của thư viện. Tránh sử dụng các method đã bị đánh deprecated.</span></p>
<p><span style="font-weight: 400;">Và sau khi update version thì nên test kỹ, ít nhất đảm bảo tất cả function đã chạy đúng.</span></p>
<h2><span style="font-weight: 400;">6. Xử Lý Lỗi</span></h2>
<p><span style="font-weight: 400;">Việc xử lý lỗi ở tất cả các bước đều quan trọng, nó giúp dễ debug và hạn chế được ảnh hưởng khi xảy ra lỗi. Và xử lý lỗi ở bước IPN đặc biệt quan trọng. Do đầu VNPay gọi vào API IPN, nếu ở đầu merchant xử lý lỗi tốt thì sẽ hạn chế ảnh hưởng tới đầu VNPay.</span></p>
<h3><span style="font-weight: 400;">6.1. Response Code</span></h3>
<p><span style="font-weight: 400;">Xử lý lỗi thế nào là tốt? Ít nhất chúng ta cần phải có try catch trong quá trình IPN. Ngoài ra, cần trả đúng mã lỗi theo hướng dẫn của VNPay.</span></p>
<p><span style="font-weight: 400;">Ví dụ:</span></p>
<p><span style="font-weight: 400;">&#8211;  Nếu xử lý giao dịch thành công thì trả về <code>RspCode: ‘00’</code></span></p>
<p><span style="font-weight: 400;">&#8211; Nếu không tìm được order thì trả về <code>RspCode: ‘01’</code></span></p>
<p><span style="font-weight: 400;">&#8211; &#8230;</span></p>
<p><span style="font-weight: 400;">Mọi người lưu ý: </span></p>
<p><span style="font-weight: 400;">&#8211; <code>vnp_ResponseCode</code> và <code>RspCode</code> là 2 mã khác nhau.</span></p>
<p><span style="font-weight: 400;">&#8211; <code>vnp_ResponseCode</code> (request: VNPay → Merchant): mô tả chuyện gì đã xảy ra bên VNPay.</span></p>
<p><span style="font-weight: 400;">&#8211; <code>RspCode</code> (response: Merchant → VNPay): mô tả chuyện gì đã xảy ra trong quá trình xử lý IPN.</span></p>
<p><span style="font-weight: 400;">Tuy nhiên, tài liệu của VNPay đoạn này không rõ ràng. Và bên mình phải làm theo test cases trong môi trường test sandbox. Hy vọng đội kỹ thuật VNPay cải thiện lại tài liệu.</span></p>
<h3><span style="font-weight: 400;">6.2. Retry</span></h3>
<p><span style="font-weight: 400;">Tại sao cần trả đúng mã lỗi theo hướng dẫn của VNPay? Như vậy thì đầu VNPay sẽ biết xử lý lỗi gọi IPN như nào. Ví dụ:</span></p>
<p><span style="font-weight: 400;">&#8211; Xử lý giao dịch thành công (<code>RspCode: ‘00’</code>), VNPay sẽ kết thúc luồng thanh toán đó.</span></p>
<p><span style="font-weight: 400;">&#8211; Mã secure hash không hợp lệ (<code>RspCode: ‘97’</code>), VNPay sẽ thực hiện retry, gọi lại IPN.</span></p>
<p><span style="font-weight: 400;">Trong trường hợp RspCode: 01, 04, 97, 99 hoặc IPN timeout là những lỗi có thể retry thì VNPAY sẽ bật cơ chế retry IPN. Thực hiện retry tối đa 10, trong vòng 5 phút.</span></p>
<p><span style="font-weight: 400;">Như vậy, việc giao tiếp giữa Merchant và VNPay sẽ đáng tin cậy hơn.</span></p>
<h3><span style="font-weight: 400;">6.3. Idempotent Handler</span></h3>
<p><span style="font-weight: 400;">Tuy nhiên, việc retry có thể dẫn đến vấn đề lặp (duplicate) message. Để giải pháp cho vấn đề này phụ thuộc vào logic của IPN handler. Chúng ta cần kiểm tra trạng thái giao dịch trước khi thực hiện câp nhật trạng thái. Ví dụ, nếu giao dịch ở trạng thái PROCESSING thì cho phép thực thi tiếp, còn ở trạng thái SUCCESSFUL, FAILED thì sẽ reject request.</span></p>
<h2><span style="font-weight: 400;">7. Tracing</span></h2>
<p><span style="font-weight: 400;">Trong giai đoạn đầu tích hợp, tỉ lệ xảy ra lỗi ở điểm tích hợp là khá cao. Do đó, chúng ta cần thu thập được nhiều thông tin để debug. Cụ thể, chúng ta nên đặt log ở đầu vào, đầu ra từng bước trong luồng thanh toán, cả case thành công, lẫn case thất bại, exception.</span></p>
<p><span style="font-weight: 400;">Mọi người lưu ý, cần đảm bảo có log ở bước 9.2.2 (Return URL). Bước này PGW FE sẽ redirect về Ronin FE để kiểm tra trạng thái giao dịch và hoàn tất luồng thanh toán. </span></p>
<p><span style="font-weight: 400;">👉 Nginx logs: </span><a href="https://codefile.io/f/FeFlPs7hj2" target="_blank" rel="noopener"><span style="font-weight: 400;">https://codefile.io/f/FeFlPs7hj2</span></a><span style="font-weight: 400;"> </span></p>
<p><span style="font-weight: 400;">Tại sao lại cần có log ở bước này? bên mình đã gặp trường hợp client chuyển khoản thành công, Ronin BE nhận được IPN và xử lý thành công nhưng màn hình thanh toán QR (PWG FE) vẫn đứng hình, không redirect về Ronin FE. Mình có báo đội kỹ thuật bên VNPay check nhưng họ check không ra và bảo lỗi bên mình. Mình phải show log ở đầu nginx (bước 9.2.2) là để chứng minh lỗi bên VNPay, PWG FE chưa redirect sang Ronin FE. Sau đó, 2 bên cũng chưa tìm ra nguyên nhân gốc. Tuy nhiên, mình chỉ gặp 2 case như này, còn lại đều ổn định.</span></p>
<p><span style="font-weight: 400;">Để dễ dàng cho việc search log, biết được 1 payment request diễn ra như nào thì ở tất cả log cần chứa thông tin của correlation id (có thể là transaction_id, order_id).</span></p>
<h2><span style="font-weight: 400;">8. Kiểm Thử</span></h2>
<p><span style="font-weight: 400;">VNPay cung cấp môi trường test sandbox và hoạt động ổn định. Đội kỹ thuật sẽ gửi cho bạn đường dẫn tới trang cấu hình môi trường sandbox để bạn chủ động test.</span></p>
<p><a href="https://drive.google.com/file/d/1piecIjBa0J0omyPSPeEBqJzR92L_avuh/view?usp=sharing" target="_blank" rel="noopener"><span style="font-weight: 400;">Ảnh test case trên môi trường sandbox của VNPay</span></a></p>
<p><span style="font-weight: 400;">Trang này cho phép mình cấu hình IPN URL. Trong trường hợp, bạn chưa có môi trường deploy (chưa có một public IPN URL) và muốn test ở local. Bạn có thể tham khảo giải pháp tạo static domain đơn giản, miễn phí của ngrok. </span></p>
<p><a href="https://ngrok.com/blog-post/free-static-domains-ngrok-users" target="_blank" rel="noopener"><span style="font-weight: 400;">https://ngrok.com/blog-post/free-static-domains-ngrok-users</span></a><span style="font-weight: 400;"> </span></p>
<p><code><span style="font-weight: 400;">ngrok http 8888 --domain=fox-funny-noticeably.ngrok-free.app</span></code></p>
<p><span style="font-weight: 400;">Sau khi test chức năng, tất cả test case thành công. Nếu bạn có yêu cầu tối thiểu về performance thì bạn có thể thực hiện theo bước load test. Tuy nhiên, do phụ thuộc vào môi trường sandbox của VNPay nên kết quả có thể không chính xác, không giống với môi trường production. Nhưng bạn nên thử load test qua để đảm bảo BE vẫn hoạt động tốt với lượng load lớn hơn.</span></p>
<h2><span style="font-weight: 400;">9. Bước Tiếp Theo</span></h2>
<p><span style="font-weight: 400;">Đối với phần thanh toán, team Ronin sẽ tiếp tục:</span></p>
<p><span style="font-weight: 400;">&#8211; Phát triển thêm các loại giao dịch khác.</span></p>
<p><span style="font-weight: 400;">&#8211; Hoàn thiện tài liệu.</span></p>
<p><span style="font-weight: 400;">&#8211; Truy vấn những giao dịch bị treo.</span></p>
<p><span style="font-weight: 400;">&#8211; Hoàn tiền (refund) tự động.</span></p>
<p><span style="font-weight: 400;">&#8211; Tích hợp phương thức trả góp.</span></p>
<h2><span style="font-weight: 400;">10. Tổng Kết</span></h2>
<p><span style="font-weight: 400;">Khi tích hợp với cổng thanh toán, chúng ta cần:</span></p>
<p><span style="font-weight: 400;">&#8211; Đánh giá nhiều yếu tố khi chọn giải pháp thanh toán như độ bảo mật, phí, độ ổn định, tính năng, tốc độ tích hợp, … VNPay có nhiều điểm đã làm tốt tuy nhiên phí giao dịch hơi cao và tài liệu chưa thực sự thân thiện.</span></p>
<p><span style="font-weight: 400;">&#8211; Nắm được cả về nghiệp vụ để hiểu rõ hơn về luồng thanh toán được xử lý như nào.</span></p>
<p><span style="font-weight: 400;">&#8211; Bảo mật là yếu tố quan trọng khi tích hợp và đặc biệt quan trọng đối với các hệ thống tài chính.</span></p>
<p><span style="font-weight: 400;">&#8211; Xử lý lỗi là việc làm cần thiết giúp cho hệ thống tin cậy (reliable) và khoẻ mạnh (robust) hơn.</span></p>
<p><span style="font-weight: 400;">Cám ơn mọi người đã đọc đến hết bài.</span></p>
<p><span style="font-weight: 400;">Nếu mọi người thấy bài viết hữu ích thì nhờ mọi người share để nội dung của Ronin được nhiều người biết hơn nữa. 🙏</span></p>
<p><span style="font-weight: 400;">Cám ơn mọi người, chúc mọi người nghỉ lễ vui vẻ.</span></p>
<p><span style="font-weight: 400;"> </span><span style="font-weight: 400;">#payment #integration #backend #software_engineering</span></p>
<p><span style="font-weight: 400;">&#8212;&#8212;&#8212;</span></p>
<p><span style="font-weight: 400;">🧑‍💻 90+ Ronin Engineers: </span><a href="https://roninhub.com/khoa-hoc/software-development-advanced" target="_blank" rel="noopener"><span style="font-weight: 400;">https://roninhub.com/khoa-hoc/software-development-advanced</span></a><span style="font-weight: 400;"> </span></p>
<p><span style="font-weight: 400;">📚️ System Design VN: </span><a href="https://fb.com/groups/systemdesign.vn" target="_blank" rel="noopener"><span style="font-weight: 400;">https://fb.com/groups/systemdesign.vn</span></a><span style="font-weight: 400;"> </span></p>
<h2>Câu hỏi thường gặp</h2>
<h3>VNPay QR có bảo mật không?</h3>
<p>VNPay là một trong những nhà cung cấp giải pháp thanh toán lớn và uy tín tại Việt Nam, tuân thủ tiêu chuẩn bảo mật PCI DSS.  Mức độ bảo mật cụ thể phụ thuộc vào phiên bản và cấp độ PCI DSS của họ.</p>
<h3>Phí giao dịch của VNPay QR như thế nào?</h3>
<p>Phí giao dịch của VNPay QR có thể cao hơn so với một số nhà cung cấp khác.  Tuy nhiên,  chi phí cụ thể phụ thuộc vào nhiều yếu tố và nên tham khảo bảng giá mới nhất từ VNPay.</p>
<h3>RoninHub tích hợp VNPay QR như thế nào?</h3>
<p>RoninHub tích hợp VNPay QR thông qua API của VNPay.  Luồng thanh toán bao gồm các bước: người dùng tạo yêu cầu trên Ronin FE, Ronin BE gửi yêu cầu đến VNPay, VNPay xử lý và trả kết quả về Ronin BE, cuối cùng Ronin FE hiển thị kết quả cho người dùng.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://anonyviet.com/ronin-engineer-tich-hop-voi-vnpay-nhu-the-nao/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
