世間萬物,紛繁復雜。如何在一個紛繁復雜的世界中,找到問題最簡單的解決方案,往往是人們追求的目標。然而,總是會有一些游戲規則的掌控者將簡單的問題復雜化。比如,“偉大”而又“令人抓狂”的微信,微信的偉大是不可否認的,它改變了絕大多數人生活方式,工作方式。而之所以說微信令人抓狂,是因為凡是看過微信文檔的開發者普遍存在的心聲。
有將簡單問題復雜化的,那就有將復雜問題簡單化的,比如說,眾多微信開發者,精確的說應該是眾多不遺余力的利用自己的經驗,開源微信平台sdk的開發者。而我很榮幸能成為其中名不見經傳的一員。
微信公眾平台令人抓狂的是晦澀難懂的文檔,以及簡陋的sdk,這也成了很多微信開發者入門時最大的門檻。而作為其中一員的我,也深有體會,從2013年第一次接觸微信公眾平台開發至今,微信的文檔我翻了無數次,也正是因為如此,2015年時,很榮幸能將自己踩的微信的坑分享給大家(我的第一本書出版),不過,由於才疏學淺,能力有限,並沒有很好的成為將復雜問題簡單化的簡單方案。時過境遷,而今開源社區中出現多了眾多開發者,也不乏一些優秀的sdk,不過,並沒有出現一款可以讓用戶脫離官方文檔、簡單上手的sdk,所以這也就成為了我的一個目標,希望能做出一款簡單方便、穩定快捷的微信sdk,WeShare.Weixin。
廢話講完,下面就來看看干貨吧。看一下內容之前,需要一個前提,那就是你需要具有C#開發基礎,因為筆者不才,入行以來,除C#之外,並沒有深入研究第二種后端開發語言。至於是否看過微信文檔、是否擁有微信開發者經驗,這都不重要。
工欲善其事必先利其器。做微信公眾平台開發,沒有微信公眾號是萬萬不能的。所以開發之前,你可以使用官方提供的微信測試號https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login)進行開發測試,或自行申請個公眾號(具體申請流程見微信官網)。后面的內容我會同時使用測試號和微信服務號進行演示。另外,你可能還需要一個域名映射的工具,比如花生殼,或ngrok,用於在開發測試時,將微信服務器的請求映射到開發環境,方便調試。
其實,微信公眾平台最讓人不好理解的就是微信的消息機制,在這里,我不講什么原理,我之前的文章中也講過原理,不過部分人並不在乎原理,他們在意的是快速實現我需要的功能。所以,本次的內容就是給大家提供一個幾行代碼就能實現公眾號消息處理機制的功能。下面的代碼示例中,我將分別使用.net4的webform、.net4.5的mvc和.net core2+進行演示,這是目前我所能想到,並且能做到的.netweb開發的框架選型。
首先,新建解決方案。分別在解決方案中創建以上三種框架的web項目。如下圖所示:
使用nuget給每個項目都安裝WeShare.WeiXin.Mp
我們先從WebMvc開始演示。 我的WebMvc項目我選擇的是webapi模板,創建完成后,需要更改默認的路由模板為如下方式:
config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{action}/{id}", defaults: new { id = RouteParameter.Optional } );
然后新建控制器。名字隨便取。我命名為WxController,然后再控制器中添加action,命名為MessageHandler。
再然后新建類,命名為MsgHandler,並繼承BaseMsgHandler抽象類。然后在MessageHandler方法中添加注冊公眾平台消息handler的方法,如下所示:
[HttpGet, HttpPost] public HttpResponseMessage MessageHandler() { var result = HttpContext.Current.Register<MsgHandler>(new EnterParamConfig { appid = "", EncodingAESKey = "", token = "" }); return new HttpResponseMessage { Content = new StringContent(result) }; }
其中,需要將上述代碼中的appid,EncodingAESKey(如果不啟動安全模式,此參數可以不配置。),token(token為接入服務器的口令,此參數可隨便填寫,但進行接口配置時需要填入這里填的token,注意此參數的保密。)替換成你自己公眾號的對應信息。
至此代碼部分已經完成,下面將演示微信公眾平台后台的配置。若想微信平台接入上面寫的代碼,那就需要提供一個公網可以訪問的地址。下面就先演示下怎樣使用花生殼訪問本地的web服務。首先打開項目的目錄。
打開iis,添加網站,物理路徑就填入項目的更目錄路徑。端口號可以隨便填,ip地址設置為127.0.0.1,只要沒有被其他應用占用。如下圖所示:
然后配置花生殼的映射服務。
點擊內網穿透,添加內網映射,如下圖所示:
其中,內網主機和內網端口填寫在iis中創建網站時填寫的內容。確定后,可看到外網的地址。
此時,通過外網訪問你的接口,http://ypyle.xicp.net/api/wx/MessageHandler,如果響應的是"簽名驗證失敗",則表示配置成功。
然后登陸微信平台,我先使用微信測試號測試。如下圖:
填好url和token后,點擊提交按鈕,如果提示“配置成功”,則表示微信公眾平台接入已經配置成功了。
現在微信用戶發送給公眾號的信息將被轉發到接口配置里填寫的url。下面咱們通過簡單配置實現消息的接收與回復。
在MsgHandler類中,重寫TextHandler,用於接收微信用戶發送的文本類型的消息。然后調用ResponseTxt方法,回復文本消息給用戶。代碼如下:
public override string TextHandler(TextMsg msg) { return msg.ResponseTxt($"你發送的內容是:{msg.Content},當前時間:{DateTime.Now}"); }
然后你就可以試着給你的公眾號發送消息啦。
下面再簡單給大家演示下webform框架的接入以及.net core中的接入。
先說webfrom,webform中,咱們使用ashx處理請求。在項目中,新建wx.ashx文件。和上面說的mvc方式一樣,先創建MsgHandler類,並繼承BaseMsgHandler基類,然后在wx.ashx添加如下代碼:
public void ProcessRequest(HttpContext context) { var result = HttpContext.Current.Register<MsgHandler>(new EnterParamConfig { appid = "wxd7008116979a800d", EncodingAESKey = "", token = "weixintoken" }); context.Response.Write(result); }
這樣就完成了代碼階段,測試的方式和上面提到的mvc方式一樣,在此就不在贅余。
然后就是.net core中的配置,和mvc的方式也很相似。代碼階段就不贅余呢,需要的朋友可以關注公眾號獲取此次示例的代碼下載鏈接。
這里我只簡單說下花生殼域名映射的配置。.net core中的web項目就簡單多了,只需編輯launchSettings.json文件中的iisExpress節點即可。如下所示:本博文到此就結束了,由於sdk還有部分接口沒有完成,文章中使用nuget導入的開發包將在一周內進行開源,請關注微信公眾號獲此本次博文的示例代碼。
本博文到此就結束了,由於sdk還有部分接口沒有完成,文章中使用nuget導入的開發包將在一周內進行開源,請關注微信公眾號獲此本次博文的示例代碼。回復doc1,獲取下載鏈接。