官方系列教程
http://www.cnblogs.com/szw/archive/2013/05/20/3089479.html
登入微信公眾平臺後-左側找到開發--啟用伺服器配置
這樣,我們才可以將微信公眾平臺的功能整合到我們自己的網站上面
啟用並設定伺服器配置後,使用者發給公眾號的訊息以及開發者需要的事件推送,將被微信轉發到該URL中
需要填寫
- 伺服器地址(URL)
- 令牌(Token)
- 訊息加解密金鑰(EncodingAESKey)
- 訊息加解密方式
注意 要想進行微信開發 包括測試階段,開發階段,都需要有一個80埠的域名才行,比如我們這裡使用weixin.bamn.cn這個域名,各位讀者也可以自己找一個自己的域名,可以是二級域名
配置一個地址,這個地址是專門用來和微信公眾平臺進行互動的介面
CheckSignature.Check()
CheckSignature.Check()方法是Senparc.Weixin.MP SDK中一個驗證請求的方法,已經做了封裝。這裡直接使用是為了簡化程式碼突出重點,感興趣的朋友可以直接看原始碼。
用以上MVC和Web Forms兩種方法的任意一種,已經可以讓後臺驗證通過。但是注意,光有Get的方法,尚不能與微信使用者發來的資訊通訊,因為通過前面的教程我們知道,
微信後臺的Url是通過Get方式請求,而微信客戶端的請求是由Post方式請求的。
為什麼要握手呢?握手的意思就是,進行一個地址的驗證,這樣微信伺服器才能知道是“你”。
我們建立一個mvc的專案。
我們要下載senparc的元件,我們可以到官網去下載。
https://github.com/JeffreySu/WeiXinMPSDK
關於這個驗證方法,同學們可以自己看微信官網提供的文件
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421135319
我們的這個senparc也是使用這個介面而已,只是對他進行二次封裝。也可以直接看我們的北盟網校微信開發的課程。
我們要想測試這個介面,則需要我們先準備好一個域名和伺服器,而且是在80埠的域名,所以我們這裡就使用weixin.bamn.cn,你不能使用其他埠的域名,比如www.bamn.cn:81 這樣是不行的,如果你沒有域名,那麼可以自己安裝這個花生殼。它可以讓我們的本機變成這個公網伺服器。
驗證訊息的確來自微信伺服器
開發者提交資訊後,微信伺服器將傳送GET請求到填寫的伺服器地址URL上,GET請求攜帶引數如下表所示:
開發者通過檢驗signature對請求進行校驗(下面有校驗方式)。若確認此次GET請求來自微信伺服器,請原樣返回echostr引數內容,則接入生效,成為開發者成功,否則接入失敗。加密/校驗流程如下:
1)將token、timestamp、nonce三個引數進行字典序排序
2)將三個引數字串拼接成一個字串進行sha1加密
3)開發者獲得加密後的字串可與signature對比,標識該請求來源於微信
以上 這些都是微信公眾平臺提供的介面,我們的這個senparc已經幫我們封裝好了這個驗證方法我們可以直接使用
CheckSignature.Check(signature, timestamp, nonce, Token)
PostModel 封裝
// 摘要:
// 微信公眾伺服器Post過來的加密引數集合(不包括PostData)
public class PostModel : EncryptPostModel
{
public PostModel();
public string AppId { get; set; }
public void SetSecretInfo(string token, string encodingAESKey, string appId);
}
用senparc提供的封裝方法驗證
/// <summary>
/// 驗證訊息的確來自微信伺服器
/// </summary>
/// <param name="pModel">封裝post傳過來的加密引數
/// @param signature:微信加密簽名,signature結合了開發者填寫的token引數和請求中的timestamp引數、nonce引數。
/// @param timestamp:時間戳
/// @param nonce:隨機數
/// </param>
/// <param name="echostr">隨機字串</param>
public static string CheckToken(PostModel pModel, string echostr)
{
if (CheckSignature.Check(pModel.Signature, pModel.Timestamp, pModel.Nonce, Token))
{
return echostr; //返回隨機字串則表示驗證通過
}
else
{
return "failed:" + pModel.Signature + "," +
CheckSignature.GetSignature(pModel.Timestamp, pModel.Nonce, Token) +
"。如果您在瀏覽器中看到這條資訊,表明此Url可以填入微信後臺。";
}
}