Tích hợp thanh toán vào website: Cách tự động hoá qua VietQR
Mình làm biên tập viên mảng giải pháp số ở một toà soạn tại quận 3. Sáng qua, một chị độc giả nhắn hỏi cách tích hợp thanh toán vào website bán tài liệu trực tuyến sao cho phí duy trì nằm trong mức chấp nhận được. Chị than phiền trang web hiện tại phải đối chiếu thủ công giao dịch từ ngân hàng mất nhiều công sức, mỗi lần tốn đến 20 phút lướt điện thoại. Tra lại tài liệu kỹ thuật, mình nhận ra gọi webhook ngân hàng đang giải quyết đúng chỗ kẹt này, nhanh gọn hơn hẳn cách rà tay cũ. Đỡ hẳn một khâu. So với cổng thanh toán nước ngoài, cách làm nội địa giúp giảm bớt khâu dò sổ thủ công.

Chỗ nghẽn khi chưa tích hợp thanh toán vào website
Nhiều anh chị làm web bán khoá học hay tài liệu trả phí vẫn quen với quy trình cũ kỹ. Học viên chọn mua, thấy số tài khoản hiện lên thì loay hoay quét mã hoặc nhập tay số tiền. Khách chuyển tiền xong phải chụp màn hình giao dịch rồi nhắn tin báo cho bộ phận hỗ trợ. Người quản trị đang làm việc phải ngừng tay, mở app ngân hàng dò lại lịch sử xem tiền đã nổi chưa, trước khi vào hệ thống mở quyền truy cập. Mất cả buổi sáng.
Việc chốt đơn ban đêm thường gặp tình trạng khách chuyển khoản lúc 22 giờ nhưng phải chờ 8 tiếng đến sáng hôm sau mới có khoá học để xem, trải nghiệm thực sự tệ. Dùng PayPal nhận tiền đô la Mỹ thì chi phí mỗi giao dịch cao, kế toán lại khó hạch toán sổ sách vì hoá đơn thiếu mã số thuế Việt Nam.
Hệ thống phụ thuộc vào sức người rà soát tin nhắn báo có. Rất dễ xảy ra tình trạng ba giao dịch 1.990.000 đồng chuyển cùng lúc trong 10 phút, nội dung cộc lốc “ck”, “chuyen tien” làm người quản trị rối trí. Khớp nhầm là mở nhầm quyền học, gây khiếu nại, sai sót tiền nong làm mất khách, khách rất bực mình.
Khác biệt giữa dịch vụ nước ngoài và giải pháp nội địa
Thay vì dùng nhân sự dò lịch sử giao dịch mỗi ngày, bạn có thể thiết lập hệ thống tự nhận tín hiệu từ API ngân hàng nội địa. Mô hình này phù hợp trang web đặt cọc tour du lịch, bán vé sự kiện hoặc form thu phí hội viên định kỳ hàng tháng. Không cần code phức tạp. Khi khách điền xong thông tin, hệ thống sinh ra một mã VietQR điền sẵn số tiền chuẩn xác 1.990.000 đồng và gắn kèm luôn mã đơn cọc duy nhất vào nội dung chuyển khoản để tự động nhận dạng qua 36 ngân hàng thương mại tại Việt Nam, giảm hẳn kiểu gõ tay hay lộn số.
Khách chuyển tiền xong, hệ thống cổng thanh toán cho website lập tức nhận lệnh báo có thông qua webhook rồi khớp đúng tài khoản người trả. Tiền đi thẳng vào tài khoản ACB của chủ web kinh doanh, không bị giữ ở ví trung gian nào, thao tác tự động giúp tiết kiệm công việc đối chiếu sổ sách cuối ngày cho phòng kế toán doanh nghiệp nhỏ.
Cơ chế hoạt động của cổng thanh toán cho website
Để hiểu rõ nguyên lý, mình vừa tạo thử luồng API kết nối thanh toán mẫu trên môi trường giả lập. Trang thông tin đơn hàng hiện mã QR tĩnh chứa sẵn thông tin định danh. Nếu muốn khách hàng thoải mái khỏi gõ gì cả, hệ thống sẽ cấp mỗi người dùng một số tài khoản ảo riêng biệt do ngân hàng ACB cấp từ đầu số của bạn quản lý. Khách hàng mở app ngân hàng quét mã một phát là xong thủ tục, mọi việc diễn ra khép kín từ đầu đến cuối. Chưa đầy 10 giây.
Sau đó, máy chủ của MONA Pay đóng gói thông tin, gửi gói tin JSON gồm 7 trường dữ liệu kèm theo chữ ký HMAC-SHA256 và mốc thời gian về địa chỉ webhook do website cung cấp. Website của bạn vừa nhận gói tin này sẽ lập tức chạy hàm kiểm tra chữ ký bảo mật. Bước kiểm tra nghiêm ngặt này đảm bảo gói tin nhận được do chính máy chủ đối tác phát ra, đồng thời từ chối thẳng thừng gói tin lệch giờ quá 5 phút so với đồng hồ hệ thống. Website xử lý xong và trả về mã 200 trong vòng 10 giây.

Đoạn mã kiểm tra webhook an toàn trên máy chủ
Đối với người mới tìm hiểu cách tích hợp thanh toán vào website, làm việc với dòng tiền tự động cần cẩn thận từng dòng lệnh vì lỗi nhỏ sinh hoạ lớn. Đoạn mã xử lý bằng PHP trên hệ thống WordPress cần thiết lập bắt đủ lỗi cơ bản thông qua địa chỉ /wp-json/monapay/v1/webhook. Khi gói tin thông báo tiền vào vừa đến, mã lệnh trích xuất lấy mốc thời gian gói tin. Nó đem so sánh với đồng hồ máy chủ. Hành động này giúp chặn những gói dữ liệu giả mạo gửi muộn có chủ đích, nếu thời gian lệch quá 300 giây thì chặn ngay lập tức.
Hệ thống sử dụng một chuỗi khoá bí mật thoả thuận trước để tự tính toán lại mã băm HMAC-SHA256. Nếu kết quả phép tính toán học thực hiện trên máy chủ trùng khớp hoàn toàn với chuỗi chữ ký bảo mật được gửi kèm trong gói tin ban đầu thì hệ thống mới chính thức xác nhận tính hợp lệ của giao dịch, còn nếu phát hiện sai chữ ký thì đoạn mã lập tức báo lỗi 401. Một giao dịch báo có duy nhất không bao giờ bị tính thành hai lần. Chặn được trùng đơn. Cuối cùng web trả về mã 200 xác nhận an toàn.
Mình thử gọi giả lập gói tin JSON báo có khoản tiền 1.990.000 đồng vào hệ thống bằng lệnh curl. Lần gọi thứ nhất thành công, hệ thống mở khoá quyền truy cập cho người học viên có mã ID 88. Chạy lần gọi thứ hai với dữ liệu y hệt bản trước, hệ thống trả về thông báo mã này đã xử lý rồi, kiên quyết không mở thêm lần hai.
Vài điểm chưa ổn khi áp dụng tự động hoá
Bất cứ giải pháp nào cũng bộc lộ khuyết điểm riêng khi vận hành thực tế tại doanh nghiệp. Điểm hạn chế dễ thấy đầu tiên là giới hạn của gói phần mềm miễn phí do MONA Pay cung cấp chỉ cho phép xử lý ở mức tối đa 500 giao dịch mỗi tháng. Một shop kinh doanh bán lẻ có lượng đơn hàng ổn định thì mức này phù hợp, nhưng tung đợt giảm giá đẩy lượng đơn mua sắm tăng vọt thì rất nhanh vượt qua mức trần thiết lập sẵn này. 500 hết veo trong vài ngày. Lúc đó, người quản lý phải nâng cấp lên gói dịch vụ trả phí bắt đầu từ mức 99.000 đồng mỗi tháng, khoản này mình phải nhắc chị độc giả nhớ trước.
Chỗ bất tiện tiếp theo nằm ở phần kiến trúc quản lý tài khoản trên tổng thể hệ sinh thái phần mềm. Mình phát hiện ra chức năng MONA Pay và chức năng xuất hoá đơn MONA eInvoice hiện vẫn còn đang yêu cầu người dùng phải đăng nhập bằng hai loại tài khoản quản trị hoàn toàn riêng biệt. Người quản trị hệ thống sẽ tốn thêm thao tác lưu trữ thông tin mật khẩu rời rạc, đồng thời phải mất công đổi qua đổi lại giữa hai thẻ tab trên trình duyệt web khi cần rà soát đồng thời biên lai 1.990.000 đồng và xuất hoá đơn cuối tháng, khá là mệt mỏi mỗi lần làm sổ.
Cách xử lý sự kiện sau khi nhận thông báo có tiền
Khi quá trình webhook ngân hàng đã hoàn tất việc xác thực thông tin, hệ thống tự động phát ra một sự kiện nội bộ mang tên là monapay_tien_vao để các phần mềm thành phần khác bắt lấy luồng dữ liệu. Đoạn mã đơn hàng nằm trong nội dung chuyển khoản được tách ra chuẩn xác bằng thuật toán biểu thức chính quy. Lấy ví dụ thực tế khách hàng chuyển 1.990.000 đồng kèm theo nội dung mô tả là “HV88”, hệ thống tiến hành đọc chuỗi ký tự, nhận diện định dạng chữ và số, qua đó biết ngay đó là phiên giao dịch thuộc về học viên mã ID 88, khách chờ chưa đầy 1 phút là có ngay.
Lúc này, cơ sở dữ liệu trên máy chủ lưu trữ sẽ thực thi câu lệnh update_user_meta để đổi ngay lập tức trạng thái của tài khoản sang đã thanh toán thành công, rồi tiếp tục dùng hàm wp_mail tạo và gửi một email thông báo mở khoá học. Bạn cài thêm phần mềm AI để hệ thống tự động viết nội dung thư trả lời tự nhiên hơn. Quá trình tích hợp thanh toán vào website giúp chủ cửa hàng thoát khỏi cảnh canh tin nhắn chuyển khoản tới tận đêm khuya, nhàn hẳn so với hồi trước. Mọi khâu vận hành từ lúc người dùng quét mã VietQR trên màn hình cho đến lúc nhận email thông báo đơn hàng đều diễn ra tự động hoàn toàn.
Việc ứng dụng công nghệ thanh toán mang lại lợi ích đo đếm được về bài toán kiểm soát dòng tiền nội bộ. Chiều muộn ngày hôm nay, mình sẽ ngồi viết thêm đoạn mã lập trình kết nối sự kiện hoàn tất giao dịch này với công cụ webhook của hệ thống nhắc lịch để đo độ trễ thông báo thực tế xem mất bao nhiêu giây.