微信開發從未如此簡單-飯前甜點之公眾號的“你問我答”
世間萬物,紛繁複雜。如何在一個紛繁複雜的世界中,找到問題最簡單的解決方案,往往是人們追求的目標。然而,總是會有一些遊戲規則的掌控者將簡單的問題複雜化。比如,“偉大”而又“令人抓狂”的微信,微信的偉大是不可否認的,它改變了絕大多數人生活方式,工作方式。而之所以說微信令人抓狂,是因為凡是看過微信文件的開發者普遍存在的心聲。
有將簡單問題複雜化的,那就有將複雜問題簡單化的,比如說,眾多微信開發者,精確的說應該是眾多不遺餘力的利用自己的經驗,開源微信平臺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,獲取下載連結。