首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

輕量級 .NET 微信 SDK 實作:摒棄實體類,擁抱 Dynamic 與 JSON/XML 雙轉

     編輯:關於.NET

設計初衷:拒絕臃腫,追求極簡

市面上常見的微信「框架」動輒定義數十個實體類對應 XML/JSON,導致專案膨脹且難以維護。本 SDK 確立兩大核心目標:

  1. 輕量級:摒棄大量實體類,善用 .NET 4.0 Dynamic 特性,動態解析 XML/JSON。
  2. 介面清晰:類別劃分對齊官方 API 分類(基礎支援、發送訊息等),閱讀即懂。

核心技術棧

1. DynamicXml.cs:XML 轉動態物件

基於 Kevin Hazzard 的 Fluent XML Parsing 實作,利用 DynamicObject 攔截成員存取,支援屬性、巢狀元素、索引器與列舉:

public class DynamicXml : DynamicObject, IEnumerable
{
    private readonly List<XElement> _elements;
    public DynamicXml(string text) { /* 解析 XML 至 XElement 列表 */ }
    public override bool TryGetMember(GetMemberBinder binder, out object result) { /* 處理 Value、Count、屬性、子元素 */ }
    public override bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result) { /* 索引器存取 */ }
    public IEnumerator GetEnumerator() { /* 實作 IEnumerable 以支援 foreach */ }
}

2. DynamicJson.cs:JSON 轉動態物件

採用 JsonReaderWriterFactory 將 JSON 序列化為 XML 中繼表示,再包裝為動態物件,支援雙向轉換、陣列/物件操作、序列化與反序列化:

public class DynamicJson : DynamicObject
{
    public static dynamic Parse(string json) { /* 解析 JSON 字串 */ }
    public static string Serialize(object obj) { /* 物件序列化為 JSON */ }
    // 索引器、成員存取、刪除、轉型、列舉等完整實作
}

API 封裝層設計

BasicAPI.cs:基礎支援介面

public class BasicAPI
{
    // 簽名驗證
    public static bool CheckSignature(string signature, string timestamp, string nonce, string token, out string ent) { /* SHA1 驗證 */ }
    // 取得 AccessToken
    public static dynamic GetAccessToken(string appid, string secrect) { /* HttpClient 呼叫 API */ }
    // 上傳多媒體檔案
    public static string UploadMedia(string token, string type, string file) { /* Multipart 上傳 */ }
}

SendMessageAPI.cs:訊息發送介面

public class SendMessageAPI
{
    // 被動回覆
    public static string Relay(WeixinMessage message, IWeixinExecutor executor) { return executor.Execute(message); }
    // 主動發送客服訊息
    public static bool Send(string token, string msg) { /* HttpClient POST JSON */ }
}

控制器與執行器實作

WeixinController.cs (ASP.NET MVC)

public class WeixinController : Controller
{
    [HttpGet, ActionName("Index")]
    public ActionResult Get(string signature, string timestamp, string nonce, string echostr)
    {
        var token = new SettingsService().Get().Token;
        string ent;
        if (!BasicAPI.CheckSignature(signature, timestamp, nonce, token, out ent))
            return Content("參數錯誤!");
        return Content(echostr); // 驗證通過
    }

    [HttpPost, ActionName("Index")]
    public ActionResult Post(string signature, string timestamp, string nonce, string echostr)
    {
        WeixinMessage message;
        using (var sr = new StreamReader(Request.InputStream))
            message = AcceptMessageAPI.Parse(sr.ReadToEnd());
        var response = new WeixinExecutor().Execute(message);
        return new ContentResult { Content = response, ContentType = "text/xml", ContentEncoding = Encoding.UTF8 };
    }
}

WeixinExecutor.cs:業務邏輯處理器

public class WeixinExecutor : IWeixinExecutor
{
    public string Execute(WeixinMessage message)
    {
        string openId = message.Body.FromUserName.Value;
        string myUserName = message.Body.ToUserName.Value;
        switch (message.Type)
        {
            case WeixinMessageType.Text:
                return RepayText(openId, myUserName, "歡迎使用");
            case WeixinMessageType.Event:
                switch (message.Body.Event.Value.ToLower())
                {
                    case "subscribe": return RepayText(openId, myUserName, "歡迎訂閱");
                    case "click":
                        switch (message.Body.EventKey.Value)
                        {
                            case "myaccount": return RepayText(openId, myUserName, "我的帳戶");
                        }
                        break;
                }
                break;
        }
        return RepayText(openId, myUserName, "未處理訊息類型");
    }
    // RepayText/RepayNews 組裝 XML 回覆
}

專案結構與下載

完整原始碼包含 Deepleo.Weixin.SDK 核心庫、DynamicXml/Json 解析器、MVC 控制器範例與菜單配置。採用 .NET 4.0 編譯,零第三方依賴(除系統組件外)。

原始碼下載: WeixinSDK.rar

總結

透過 Dynamic 特性消除實體類樣板碼,配合官方 API 分層封裝,打造出不足 200 KB、極易擴充的微信開發 SDK。適合追求輕量、快速迭代的專案導入。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved