Part1前言
最近想寫一點基于.Net Core微信公眾號開發的文章
Part2測試公眾號申請
測試公眾號申請地址:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
微信公眾號開發文檔:https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Overview.html
通過微信掃一掃授權就能進入到測試號管理頁面。
測試賬號擁有幾乎所有的公眾號接口,而個人只能申請訂閱號,幾乎沒有接口可用,并且消息推送還會受到次數限制。如果只是做開發測試的話,那么測試帳號比較好用
進行接口配置信息
需要一臺服務器進行到微信授權回調到線上的域名。但是對于沒有服務器,或者初次接觸微信公眾號開發的同學們就有點不太友好,不方便本地調試。
于是就嘗試通過內網穿透的方法調試本地代碼,常見的工具有ngrok,FastTunnel,花生殼,natapp等等
Part3開發
新建.Net Core webapi項目,將本地服務映射到外網
筆者在這里使用的是natapp
驗證消息的確來自微信服務器
我們可根據微信開發文檔輕松的寫出 微信后臺的“接口配置信息”,一共有四個參數
[HttpGet]
[ActionName("")]
public?string?Get(string?signature,?string?timestamp,?string?nonce,?string?echostr)
{}
有潔癖的同學可能覺得有四個參數,再在controller層一個一個地接收就會顯得特別的笨重了。那我們也可以使用實體類來接受參數
[HttpGet]
[ActionName("")]
public?string?Get([FromUri]?VxModel?vxModel)
{}
[FromUri]屬性處理查詢參數,即"?"之后的鍵值對在URI中。
加密/校驗
流程如下:
將token、timestamp、nonce三個參數進行字典序排序 2)將三個參數字符串拼接成一個字符串進行sha1加密 3)開發者獲得加密后的字符串可與 signature 對比,標識該請求來源于微信.若確認此次 GET 請求來自微信服務器,請原樣返回 echostr 參數內容。
將微信公眾號設置好的token,定義成一個常量,用來校驗
public?const?string?Token?=?"weixin";
然后根據流程進行簽名校驗
public?static?bool?Check(string?signature,?string?timestamp,?string?nonce){string[]?value?=?new?string[3]{WeixinSetting.Token,timestamp,nonce}.OrderBy(o=>o).ToArray();string?s?=?string.Join("",?value);byte[]?array?=?SHA1.Create().ComputeHash(Encoding.UTF8.GetBytes(s));StringBuilder?stringBuilder?=?new?StringBuilder();byte[]?array2?=?array;foreach?(byte?b?in?array2){stringBuilder.AppendFormat("{0:x2}",?b);}return?signature==stringBuilder.ToString();}
完整接口如下:
[HttpGet]
[ActionName("")]
public?string?Get(string?signature,?string?timestamp,?string?nonce,?string?echostr){if?(CheckSignatureHelper.Check(signature,?timestamp,?nonce)){return?echostr;}else{return?"校驗失敗";}}
這樣就校驗成功了。