Senparc.Weixin.MP SDK 已經涵蓋了微信 6.x 的幾乎所有公共 API。
整個項目的源代碼以都可以在這個項目中獲取到:https://github.com/JeffreySu/WeiXinMPSDK
PS:由於微信 API 以及 Senparc.Weixin SDK一直在不斷升級更新,最新的代碼及 Demo 以上面的 GitHub 中的源代碼為准。
我們現在從無到有建立一個ASP.NET MVC 項目,來看一下如何與微信進行對接(Webforms 原理也都是一樣,只不過把 Controller 中的 Action 換成 .aspx 頁面就可以了,可參考 Demo)。
將要演示的項目源代碼也可以在開源項目中找到。因為源代碼中要兼顧多個不同 .net 版本的項目,因此有一個公用項目(CommonService),所以與下面展示的結構略有不同,不過邏輯完全一致:
MVC:https://github.com/JeffreySu/WeiXinMPSDK/tree/master/Senparc.Weixin.MP.Sample
WebForms:https://github.com/JeffreySu/WeiXinMPSDK/tree/master/Senparc.Weixin.MP.Sample.WebForms
現在就開始吧!
第一步:建立一個空的 ASP.NET MVC 項目(截圖以 ASP.NET MVC 4.0 為例,.net core 也是類似的),項目名稱如Senparc.Weixin.MP.Sample

第二步:引入Senparc.Weixin.MP.dll
引入相關dll的方式有兩種:
- 一種是復制 dll 到項目某文件夾中,然后直接在項目中添加 Senparc.Weixin.MP.dll 、依賴dll 及 Senparc.Weixin.MP.MvcExtension.dll 的引用(Senparc.Weixin.MP.MvcExtension.dll 只有 MVC 項目需要,WebForms 項目可以忽略);
- 第二種方式我們可以使用 Nuget 直接安裝到項目中。
Nuget項目地址:https://www.nuget.org/packages/Senparc.Weixin.MP/
第一種方式已經足夠簡單(但是不建議,除非你需要修改 SDK 中的內容,使用自己編譯的 dll)。
下面介紹第二種:打開菜單【工具】> 【庫程序包管理器】 > 【程序包管理器控制台】,如下圖:

點擊后將會出現程序包管理器控制台:

如果是第一次安裝Senparc.Weixin.MP庫,則在PM>后面輸入命令:
Install-Package Senparc.Weixin.MP
回車,Senparc.Weixin.MP.dll將會被自動引入到項目中。
如果以后需要更新到最新版本,只需要使用Update-Package命令,將會自動在線更新:
Update-Package Senparc.Weixin.MP
以上操作對MVC和WebForms項目都有效。
如果是MVC項目,為了獲得更多針對MVC的擴展功能,我們可以繼續引入Senparc.Weixin.MP.MvcExtension.dll:
Install-Package Senparc.Weixin.MP.MVC
命令窗口輸出結果如下,表示已經安裝成功:

我們觀察一下項目引用的程序集,這兩個dll已經被引用進來了(同時還會自動引入依賴的dll,如 Senparc.CO2NET):

除了使用命令行的方式,也可以在【解決方案管理器】中的項目節點點擊右鍵,選擇【管理 Nuget 程序包 ...】,在【瀏覽】標簽下輸入關鍵字“Senparc.Weixin.MP”,選中最新的版本,點擊右側的【安裝】按鈕:

第三步:在全局中進行設置
.net framework 項目:
1、打開global.asax.cs文件
2、在 Application_Start() 方法中加入如下代碼(可參考 Demo):
/* CO2NET 全局注冊開始 * 建議按照以下順序進行注冊 */ //設置全局 Debug 狀態 var isGLobalDebug = true; var senparcSetting = SenparcSetting.BuildFromWebConfig(isGLobalDebug); //CO2NET 全局注冊,必須!! IRegisterService register = RegisterService.Start(senparcSetting) .UseSenparcGlobal(false, null); /* 微信配置開始 * 建議按照以下順序進行注冊 */ //設置微信 Debug 狀態 var isWeixinDebug = true; var senparcWeixinSetting = SenparcWeixinSetting.BuildFromWebConfig(isWeixinDebug); //微信全局注冊,必須!! register.UseSenparcWeixin(senparcWeixinSetting, senparcSetting);
3、參考 Web.Config 的<appSetting>節點下加入參數設置(可參考 Demo):
<!-- 以下信息會被自動識別,如無特殊說明,不用的參數可以刪除,但修改 key 后將會無法自動識別! --> <!-- 自動識別參數開始 --> <!-- 以下為 CO2NET 的 SenparcSetting 全局配置,請勿修改 key,勿刪除任何項 --> <!-- 默認緩存命名空間配置 --> <add key="DefaultCacheNamespace" value="DefaultCache" /> <!-- Cache.Redis連接配置 --> <add key="Cache_Redis_Configuration" value="Redis配置" /> <!--<add key="Cache_Redis_Configuration" value="localhost:6379" />--> <!-- Cache.Memcached連接配置 --> <add key="Cache_Memcached_Configuration" value="Memcached配置" /> <add key="SenparcUnionAgentKey" value="SenparcUnionAgentKey" /> <!-- 以下為 Senparc.Weixin 的 SenparcWeixinSetting 微信配置,不使用的參數可以刪除 --> <!-- 微信公眾號URL對接信息 --> <add key="WeixinToken" value="應用服務器(開發者服務器)URL對應的Token" /> <add key="WeixinEncodingAESKey" value="應用服務器(開發者服務器)URL對應的消息加解密密鑰" /> <!-- 高級接口信息 --> <add key="WeixinAppId" value="微信AppId" /> <add key="WeixinAppSecret" value="微信AppSecret" /> <!-- SDK提供的代理功能設置 --> <add key="WeixinAgentUrl" value="外部代理Url" /> <add key="WeixinAgentToken" value="外部代理Token" /> <add key="SenparcAgentKey" value="盛派代理系統通用Key" /> <add key="WeixinAgentWeiweihiKey" value="外部代理WeiWeiHiKey" /> <!-- 微信支付相關參數 --> <!-- 微信支付V2 --> <add key="WeixinPay_Tenpay" value="WeixinPay_Tenpay" /> <add key="WeixinPay_PartnerId" value="WeixinPay_PartnerId" /> <add key="WeixinPay_Key" value="WeixinPay_Key" /> <add key="WeixinPay_AppId" value="WeixinPay_AppId" /> <add key="WeixinPay_AppKey" value="WeixinPay_AppKey" /> <add key="WeixinPay_TenpayNotify" value="WeixinPay_TenpayNotify" /> <!-- 微信支付V3 --> <add key="TenPayV3_MchId" value="TenPayV3_MchId" /> <add key="TenPayV3_Key" value="TenPayV3_Key" /> <add key="TenPayV3_AppId" value="TenPayV3_AppId" /> <add key="TenPayV3_AppSecret" value="TenPayV3_AppSecret" /> <add key="TenPayV3_TenpayNotify" value="http://YourDomainName/TenpayV3/PayNotifyUrl" /> <!-- 開放平台 --> <add key="Component_Appid" value="Component_Appid" /> <add key="Component_Secret" value="Component_Secret" /> <add key="Component_Token" value="Component_Token" /> <add key="Component_EncodingAESKey" value="Component_EncodingAESKey" /> <!-- 微信企業號 --> <add key="WeixinCorpId" value="WeixinCorpId" /> <add key="WeixinCorpSecret" value="WeixinCorpSecret" /> <!-- 小程序 --> <!-- 小程序消息URL對接信息 --> <add key="WxOpenToken" value="小程序消息URL對應的Token" /> <add key="WxOpenEncodingAESKey" value="小程序消息URL對應的消息加解密密鑰" /> <!-- 小程序秘鑰信息 --> <add key="WxOpenAppId" value="微信小程序AppId" /> <add key="WxOpenAppSecret" value="微信小程序AppSecret" /> <!-- 自動識別參數結束 -->
.net core 項目:
1、打開 Startup.cs 文件(可參考 Demo)
2、在 ConfigureServices() 方法中加入:
public void ConfigureServices(IServiceCollection services) { //... services.AddSenparcGlobalServices(Configuration)//Senparc.CO2NET 全局注冊 .AddSenparcWeixinServices(Configuration);//Senparc.Weixin 注冊 }
3、修改 Configure() 方法傳入參數,並添加代碼:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, IOptions<SenparcSetting> senparcSetting, IOptions<SenparcWeixinSetting> senparcWeixinSetting) { //app.UseMvc()等設置... // 啟動 CO2NET 全局注冊,必須! IRegisterService register = RegisterService.Start(env, senparcSetting.Value) .UseSenparcGlobal(false, null); //開始注冊微信信息,必須! register.UseSenparcWeixin(senparcWeixinSetting.Value, senparcSetting.Value)
}
4、在 appsetting.json 文件下插入以下設置(可參考 Demo):
//以下信息會被自動識別,如無特殊說明,不用的參數可以刪除,但修改 key 后將會無法自動識別! //CO2NET 設置 "SenparcSetting": { //以下為 CO2NET 的 SenparcSetting 全局配置,請勿修改 key,勿刪除任何項 "IsDebug": true, "DefaultCacheNamespace": "DefaultCache", //分布式緩存 "Cache_Redis_Configuration": "Redis配置", //"Cache_Redis_Configuration": "localhost:6379", "Cache_Memcached_Configuration": "Memcached配置", "SenparcUnionAgentKey": "SenparcUnionAgentKey" }, //Senparc.Weixin SDK 設置 "SenparcWeixinSetting": { //以下為 Senparc.Weixin 的 SenparcWeixinSetting 微信配置 //微信全局 "IsDebug": true, //以下不使用的參數可以刪除,key 修改后將會失效 //公眾號 "Token": "weixin", "EncodingAESKey": "", "WeixinAppId": "WeixinAppId", "WeixinAppSecret": "WeixinAppSecret", //小程序 "WxOpenAppId": "WxOpenAppId", "WxOpenAppSecret": "WxOpenAppSecret", "WxOpenToken": "WxOpenToken", "WxOpenEncodingAESKey": "WxOpenEncodingAESKey", //企業微信 "WeixinCorpId": "WeixinCorpId", "WeixinCorpSecret": "WeixinCorpSecret", //微信支付 //微信支付V2(舊版) "WeixinPay_PartnerId": "WeixinPay_PartnerId", "WeixinPay_Key": "WeixinPay_Key", "WeixinPay_AppId": "WeixinPay_AppId", "WeixinPay_AppKey": "WeixinPay_AppKey", "WeixinPay_TenpayNotify": "WeixinPay_TenpayNotify", //微信支付V3(新版) "TenPayV3_MchId": "TenPayV3_MchId", "TenPayV3_Key": "TenPayV3_Key", "TenPayV3_AppId": "TenPayV3_AppId", "TenPayV3_AppSecret": "TenPayV3_AppId", "TenPayV3_TenpayNotify": "TenPayV3_TenpayNotify", //開放平台 "Component_Appid": "Component_Appid", "Component_Secret": "Component_Secret", "Component_Token": "Component_Token", "Component_EncodingAESKey": "Component_EncodingAESKey", //擴展及代理參數 "AgentUrl": "AgentUrl", "AgentToken": "AgentToken", "SenparcWechatAgentKey": "SenparcWechatAgentKey" }
第四步:建立一個Controller,如WeixinController.cs

第四步:修改WeixinController.cs
我們將下列代碼加入WeixinController.cs:
1 using System; 2 using System.IO; 3 using System.Web.Configuration; 4 using System.Web.Mvc; 5 using Senparc.Weixin.MP.Entities.Request; 6 7 namespace Senparc.Weixin.MP.Sample.Controllers 8 { 9 using Senparc.Weixin.MP.MvcExtension; 10 using Senparc.Weixin.MP.Sample.CommonService.CustomMessageHandler; 11 12 public partial class WeixinController : Controller 13 { 14 public static readonly string Token = Config.SenparcWeixinSetting.Token;//與微信公眾賬號后台的Token設置保持一致,區分大小寫。 15 public static readonly string EncodingAESKey = Config.SenparcWeixinSetting.EncodingAESKey;//與微信公眾賬號后台的EncodingAESKey設置保持一致,區分大小寫。 16 public static readonly string AppId = Config.SenparcWeixinSetting.WeixinAppId;//與微信公眾賬號后台的AppId設置保持一致,區分大小寫。 17 18 /// <summary> 19 /// 微信后台驗證地址(使用Get),微信后台的“接口配置信息”的Url填寫如:http://weixin.senparc.com/weixin 20 /// </summary> 21 [HttpGet] 22 [ActionName("Index")] 23 public ActionResult Get(PostModel postModel, string echostr) 24 { 25 if (CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token)) 26 { 27 return Content(echostr); //返回隨機字符串則表示驗證通過 28 } 29 else 30 { 31 return Content("failed:" + postModel.Signature + "," + MP.CheckSignature.GetSignature(postModel.Timestamp, postModel.Nonce, Token) + "。" + 32 "如果你在瀏覽器中看到這句話,說明此地址可以被作為微信公眾賬號后台的Url,請注意保持Token一致。"); 33 } 34 } 35 36 /// <summary> 37 /// 用戶發送消息后,微信平台自動Post一個請求到這里,並等待響應XML。 38 /// PS:此方法為簡化方法,效果與OldPost一致。 39 /// v0.8之后的版本可以結合Senparc.Weixin.MP.MvcExtension擴展包,使用WeixinResult,見MiniPost方法。 40 /// </summary> 41 [HttpPost] 42 [ActionName("Index")] 43 public ActionResult Post(PostModel postModel) 44 { 45 if (!CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token)) 46 { 47 return Content("參數錯誤!"); 48 } 49 50 postModel.Token = Token;//根據自己后台的設置保持一致 51 postModel.EncodingAESKey = EncodingAESKey;//根據自己后台的設置保持一致 52 postModel.AppId = AppId;//根據自己后台的設置保持一致 53 54 //自定義MessageHandler,對微信請求的詳細判斷操作都在這里面。 55 var messageHandler = new CustomMessageHandler(Request.InputStream, postModel);//接收消息 56 57 messageHandler.Execute();//執行微信處理過程 58 59 return new FixWeixinBugWeixinResult(messageHandler);//返回結果 60 61 } 62 } 63 }
第一個 Get() 對應微信后台設置 URL 時候的請求(只在驗證的時候用到),第二個 Post() 用於接收微信服務器轉發過來的客戶請求。
其中 CustomMessageHandler 是我們自己創建的一個類,用於實現 MessageHandler(有關MessageHandler的詳細介紹可以看《Senparc.Weixin.MP SDK 微信公眾平台開發教程(六):了解MessageHandler》,也可以看這里),所有處理微信消息的核心邏輯都被包含到 CustomMessageHandler 中執行。除了承擔處理微信響應的任務,MessageHandler 還實現了處理單個用戶對話上下文等功能,非常方便。
至此,整個Senparc.Weixin.MP SDK已經基本開發完畢,可以直接發布,並在微信后台使用“高級功能”對接了。
在微信后台設置中,Url 填寫 http://xxx/Weixin,Token 填寫 Web.config 中的“WeixinToken ” 或 appsetting.json 中的“Token”所設置的值。
(如何在微信后台設置請看:Senparc.Weixin.MP SDK 微信公眾平台開發教程(三):微信公眾平台開發驗證)
接下去我們會介紹如何在MessageHandler中處理具體的微信請求(文字、圖片、位置、語音等等)。
系列教程索引
地址:http://www.cnblogs.com/szw/archive/2013/05/14/weixin-course-index.html
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(一):微信公眾平台注冊
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(二):成為開發者
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(三):微信公眾平台開發驗證
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(四):Hello World
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(五):使用Senparc.Weixin.MP SDK
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(六):了解MessageHandler
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(七):解決用戶上下文(Session)問題
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(八):通用接口說明
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(九):自定義菜單接口說明
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(十):多客服接口說明
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(十一):高級接口說明
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(十二):OAuth2.0說明
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(十三):地圖相關接口說明
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(十四):請求消息去重
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(十五):消息加密
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(十六):AccessToken自動管理機制
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(十七):個性化菜單接口說明
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(十八):Web代理功能
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(十九):MessageHandler 的未知類型消息處理
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(二十):使用菜單消息功能
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(二十一):在小程序中使用 WebSocket (.NET Core)
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(二十二):如何安裝 Nuget(dll) 后使用項目源代碼調試
