Giải pháp đặt món qua WeChat

Sau thời gian phát triển và kiểm thử, ứng dụng đặt món qua WeChat đã hoàn tất. Bài viết chia sẻ kiến trúc cơ bản và đoạn mã xử lý tin nhắn. Nếu bạn có góp ý cải tiến, rất mong trao đổi thêm!

Mô hình hoạt động: Người dùng gửi tin nhắn đến fanpage WeChat, hệ thống nhận dữ liệu XML từ server WeChat (địa chỉ được đăng ký khi tạo tài khoản), phân tích nội dung và trả về phản hồi phù hợp. Các yêu cầu đặt món sẽ được chuyển hướng đến website HTML5 để xử lý chi tiết. Giao diện quản lý fanpage tại: mp.weixin.qq.com

[Hình 1 - Mô hình kiến trúc tổng thể]

Quy trình xử lý tin nhắn gồm các bước chính:

  1. Nhận XML từ server WeChat
  2. Phân tích loại tin nhắn (text/event/location)
  3. Tạo đối tượng xử lý tương ứng
  4. Trả về phản hồi XML theo định dạng

Dưới đây là đoạn mã xử lý tin nhắn văn bản:

/// <summary>
/// Lớp xử lý tin nhắn văn bản
/// </summary>
public class TextMessage : BaseMessage
{
    public override BaseMessage LoadXml(string xmlData)
    {
        XmlDocument doc = new XmlDocument();
        doc.LoadXml(xmlData);
        
        this.RecipientID = doc.SelectSingleNode("//ToUserName").InnerText;
        this.SenderID = doc.SelectSingleNode("//FromUserName").InnerText;
        this.MessageType = doc.SelectSingleNode("//MsgType").InnerText;
        this.TextContent = doc.SelectSingleNode("//Content").InnerText;
        
        return this;
    }

    public string TextContent { get; set; }
}

Lớp xử lý yêu cầu đặt món:

public class OrderHandler : BaseHandler
{
    public override string Process()
    {
        TextMessage msg = (TextMessage)base.CurrentMessage;
        StringBuilder response = new StringBuilder();
        
        if (msg.TextContent.ToLower().Contains("order") || msg.TextContent == "d")
        {
            var orders = OrderRepository.GetTodayOrders(msg.RecipientID);
            response.Append($"Danh sách đơn hàng:\n");
            
            foreach(var order in orders)
            {
                response.Append($"Mã: {order.OrderCode}\n");
                response.Append($"Thời gian: {order.CreatedAt}\n");
                response.Append($"Trạng thái: {order.Status}\n");
                response.Append($"Chi tiết món ăn:\n");
                
                foreach(var item in order.Items)
                {
                    response.Append($"{item.Name} x{item.Quantity} - {item.Price:C}\n");
                }
                
                response.Append("=".Repeat(20) + "\n");
            }
        }
        else
        {
            response.Append("Vui lòng gửi 'd' hoặc 'order' để xem lịch sử đặt món");
        }
        
        return BuildXmlResponse(response.ToString());
    }
}

Cơ chế phân luồng xử lý:

public class MessageRouter
{
    public static BaseHandler GetHandler(string xml)
    {
        XmlDocument doc = new XmlDocument();
        doc.LoadXml(xml);
        string msgType = doc.SelectSingleNode("//MsgType").InnerText;
        
        switch(msgType)
        {
            case "text": return new TextHandler(ParseXml(xml));
            case "location": return new LocationHandler(ParseXml(xml));
            case "event": return new EventHandler(ParseXml(xml));
            default: return new DefaultHandler(ParseXml(xml));
        }
    }
}

Điểm cần lưu ý:

  1. Sử dụng reflection để khởi tạo các handler
  2. Áp dụng mẫu thiết kế Factory Method
  3. Bảo vệ tính mở rộng bằng cách tách logic xử lý theo loại tin nhắn
  4. Website HTML5 được gọi thông qua URL trong phản hồi XML

[Hình 2 - Giao diện đặt món trên di động]

Thẻ: WeChat API C# HTML5 XML XSD

Đăng vào ngày 24 tháng 6 lúc 22:01