市面上常見的微信「框架」動輒定義數十個實體類對應 XML/JSON,導致專案膨脹且難以維護。本 SDK 確立兩大核心目標:
Dynamic 特性,動態解析 XML/JSON。基於 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 */ }
}
採用 JsonReaderWriterFactory 將 JSON 序列化為 XML 中繼表示,再包裝為動態物件,支援雙向轉換、陣列/物件操作、序列化與反序列化:
public class DynamicJson : DynamicObject
{
public static dynamic Parse(string json) { /* 解析 JSON 字串 */ }
public static string Serialize(object obj) { /* 物件序列化為 JSON */ }
// 索引器、成員存取、刪除、轉型、列舉等完整實作
}
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 上傳 */ }
}
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 */ }
}
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 };
}
}
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。適合追求輕量、快速迭代的專案導入。