一、通訊機制
二、注冊微信平台公眾帳號
https://mp.weixin.qq.com/
注冊完后,需要等待審核,官方說需要7天,快的話1-2天就可以了,未審核的帳號可以通過上面的網址登陸,但是會缺少部分功能(比如高級功能、服務等)。
三、微信公眾平台開發者官方文檔
http://mp.weixin.qq.com/wiki/index.php?title=%E9%A6%96%E9%A1%B5
等待審核的時候,務必先閱讀此文檔。
四、配置接口信息
審核通過后,https://mp.weixin.qq.com/登陸帳號。申請成為開發者。
填寫URL和Token,其中URL是開發者用來接收微信服務器數據的接口URL。Token可由開發者任意填寫,用作生成簽名(該Token會和接口URL中包含的Token進行比對,從而驗證安全性)。
注:本例中已經存在一個服務器,域名為www.XXX.cn/XXX/WechatIndex.aspx
五、驗證URL
微信公眾平台提供了一個php的示例代碼:http://mp.weixin.qq.com/mpres/htmledition/res/wx_sample.zip
我把它轉換為了C#代碼(WechatIndex.aspx.cs): 此代碼僅僅用於“成為開發者”的驗證URL
1 public partial class WechatIndex : System.Web.UI.Page 2 { 3 //TOKEN是用來進行交互安全認證的,這里定義的變量要與接口配置信息中填寫的Token一致 4 const string Token = "tuanfubao"; 5 6 protected void Page_Load(object sender, EventArgs e) 7 { 8 //校驗簽名,當填入的信息提交之后頁面有提示“你已成功成為公眾平台開發者, 9 //可以使用公眾平台的開發功能”這個的時候,接下來你就需要注釋掉這個校驗的方法,使得后面的消息回復得以正常運作 10 Valid(); 11 } 12 13 private void Valid() //用於申請“成為開發者”時向微信發送驗證信息。 14 { 15 string echoStr = Request.QueryString["echoStr"].ToString(); 16 if (CheckSignature()) 17 { 18 if (!string.IsNullOrEmpty(echoStr)) 19 { 20 Response.Write(echoStr); 21 Response.End(); 22 } 23 } 24 } 25 26 /// <summary> 27 /// 驗證微信簽名 28 /// </summary> 29 /// <returns></returns> 30 private bool CheckSignature() 31 { 32 string signature = Request.QueryString["signature"].ToString(); 33 string timestamp = Request.QueryString["timestamp"].ToString(); 34 string nonce = Request.QueryString["nonce"].ToString(); 35 string[] ArrTmp = { Token, timestamp, nonce }; 36 Array.Sort(ArrTmp);//字典排序 37 string tmpStr = string.Join("", ArrTmp); 38 tmpStr = FormsAuthentication.HashPasswordForStoringInConfigFile(tmpStr, "SHA1");//對該字符串進行sha1加密 39 tmpStr = tmpStr.ToLower(); 40 41 //開發者獲得加密后的字符串可與signature對比,標識該請求來源於微信。 42 //開發者通過檢驗signature對請求進行校驗,若確認此次GET請求來自微信服務器,請原樣返回echostr參數內容,則接入生效,否則接入失敗 43 if (tmpStr == signature) 44 { 45 return true; 46 } 47 else 48 { 49 return false; 50 } 51 } 52 }
開發者提交信息后,微信服務器將發送GET請求到填寫的URL上,GET請求攜帶四個參數:
參數 | 描述 |
signature | 微信加密簽名,signature結合了開發者填寫的token參數和請求中的timestamp參數、nonce參數。 |
timestamp | 時間戳 |
nonce | 隨機數 |
echostr | 隨機字符串 |
開發者通過檢驗signature對請求進行校驗(下面有校驗方式)。若確認此次GET請求來自微信服務器,請原樣返回echostr參數內容,則接入生效,成為開發者成功,否則接入失敗。
加密/校驗流程如下:
1. 將token、timestamp、nonce三個參數進行字典序排序
2. 將三個參數字符串拼接成一個字符串進行sha1加密
3. 開發者獲得加密后的字符串可與signature對比,標識該請求來源於微信
六、成為開發者
提交后,驗證URL有效性成功后即接入生效,成為開發者。隨后要記得先關閉編輯模式然后開啟開發模式。
此后用戶每次向公眾號發送消息、或者產生自定義菜單點擊事件時,響應URL將得到推送。
用戶向公眾號發送消息時,公眾號方收到的消息發送者是一個OpenID,是使用用戶微信號加密后的結果,每個用戶對每個公眾號有一個唯一的OpenID。