最近作對接微信閃開發票-微信發票名片,裏面有個接收用戶提交擡頭接口是微信推送事件到公衆號後臺,該事件將發送至開發者填寫的URL(登陸公衆平臺進入【開發者中心設置】)。 開發者可經過事件推送完成數據統計、用戶身份識別等操做。服務器
微信服務器在五秒內收不到響應會斷掉鏈接,而且從新發起請求,總共重試三次。關於重試的消息排重,推薦使用FromUserName + CreateTime 排重。假如服務器沒法保證在五秒內處理並回復,能夠直接回復空串,微信服務器不會對此做任何處理,而且不會發起重試。微信
做爲一名微信公衆號開發者,別人進入你的微信公衆號,確定會看見某些網頁,或者給你發某些信息,你須要實時自動回覆,因此你須要一個24小時爲用戶服務的服務器。咱們所要填寫的url就是你提供的服務器的地址,前提是這個服務器的地址你要可以訪問,且可以控制。而token是用來驗證的。加密
/// <summary> /// 微信用戶提交發票擡頭-事件推送頁面 /// </summary> public class WechartTitleController : Controller { // GET: WechartTitle public void Index() { #region 驗證token string echoString = Request.QueryString["echoStr"]; string signature = Request.QueryString["signature"]; string timestamp = Request.QueryString["timestamp"]; string nonce = Request.QueryString["nonce"]; if (CheckSignature()) { if (!string.IsNullOrEmpty(echoString)) { Response.Write(echoString); } } #endregion } private bool CheckSignature() { string Token = "12345678"; string signature = Request.QueryString["signature"]; string timestamp = Request.QueryString["timestamp"]; string nonce = Request.QueryString["nonce"]; string[] ArrTmp = { Token, timestamp, nonce }; Array.Sort(ArrTmp); //字典排序 string tmpStr = string.Join("", ArrTmp); tmpStr = FormsAuthentication.HashPasswordForStoringInConfigFile(tmpStr, "SHA1"); tmpStr = tmpStr.ToLower(); if (tmpStr == signature) { return true; } else { return false; } } }
checkSignature是驗證簽名的,當開發者在公衆平臺提交URL和token時,微信服務器將發送GET請求到填寫的URL上,而且帶上四個參數:url
參數描述 signature 微信加密簽名 timestamp 時間戳 nonce 隨機數 echostr 隨機字符串
開發者在本身的網頁內請公衆平臺的請求作簽名驗證,經過以後輸出echostr字段便可。至於具體的驗籤規則,能夠看checkSignature的實現,這裏再也不贅述。spa