[原創] ASP.NET WEBAPI 接入微信公衆平臺 總結,Token驗證失敗解決辦法

首先,請容許我說一句:shit!html

由於這個問題不難,可是網上有關 ASP.NET WEBAPI的資料太少。都是PHP等等的。bootstrap

我也是在看了某位大神的博客後有啓發,一點點研究出來的。微信

來看正題!app

 

1.微信公衆平臺的接入方法,無非4個參數(signature, timestamp, nonce, echostr)加1個Token(兩邊對應)微信公衆平臺

2.Token, timestamp, nonce字典排序後,按照字符串「SHA1」加密。得出一串字符串 tmpStr(轉化爲小寫)工具

3.而後比對 tmpStr 是否等於 signature,若是相等,則表示這次請求是來自於微信。測試

4.肯定請求來自於微信,則已經完成一大步了。剩下一個,將echostr參數傳出給微信公衆平臺的工做了。(也正是這一步,耗費了三、4個小時)網站

 

PHP的代碼就不說了,有例子,網上資料也不少。值得一提的是 ASP.NET MVC的操做,給個連接本身去看:Senparc.Weixin.MP SDK 微信公衆平臺開發教程 索引加密

下面結合代碼來詳細解釋個人 ASP.NET WebAPI 對微信公衆平臺接入的操做。url

1.獲取四個參數,此處能夠看Log可否輸出獲取到的4個參數

        ///聲明Log全局變量
     private
static log4net.ILog Log = LogManager.GetLogger("WeChatConnect");
     ///聲明Token
public readonly string Token = "weixin";//與微信公衆帳號後臺的Token設置保持一致,區分大小寫。 ///申請消息 [HttpGet] public HttpResponseMessage ConnWeChat(string signature, string timestamp, string nonce, string echostr) { try { Log.Debug("測試輸出: echostr = " + echostr); Log.Debug("測試輸出: nonce = " + nonce); Log.Debug("測試輸出: timestamp = " + timestamp); Log.Debug("測試輸出: signature = " + signature); string EchoStr = Valid(signature, timestamp, nonce, echostr); if (!string.IsNullOrEmpty(EchoStr)) { Log.Debug("驗證成功!"); return JsonTools.ToHttpMsgForWeChat(echostr); } else { Log.Debug("驗證失敗!"); return JsonTools.ToHttpMsgForWeChat("驗證失敗!"); } } catch (Exception ex) { Log.Error("Log 測試輸出:異常!", ex); return JsonTools.ToHttpMsgForWeChat(ex.ToString()); } }

2. Token, timestamp, nonce字典排序後,按照字符串「SHA1」加密。得出一串字符串 tmpStr(轉化爲小寫),

    比對 tmpStr 是否等於 signature,若是相等,則表示這次請求是來自於微信。

        private string Valid(string signature, string timestamp, string nonce, string echostr)
        {
            if (CheckSignature(signature,timestamp,nonce))
            {
                if (!string.IsNullOrEmpty(echostr))
                {
                    return echostr;
                }
            }

            return "";
        }

        /// <summary>
        /// 驗證微信簽名
        /// </summary>
        /// * 將token、timestamp、nonce三個參數進行字典序排序
        /// * 將三個參數字符串拼接成一個字符串進行sha1加密
        /// * 開發者得到加密後的字符串可與signature對比,標識該請求來源於微信。
        /// <returns></returns>
        private bool CheckSignature(string signature,string timestamp,string 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;
            }
        }

3.肯定請求來自於微信,則只剩下將echostr參數傳出給微信公衆平臺了。

//來看看我上面代碼中的輸出方式:HttpResponseMessage
        public HttpResponseMessage ConnWeChat(string signature, string timestamp, string nonce, string echostr)
        
        //輸出語句
        return JsonTools.ToHttpMsgForWeChat(echostr);


        //返回字符串調用方法: 
 public static HttpResponseMessage ToHttpMsgForWeChat(string strMsg) { HttpResponseMessage result = new HttpResponseMessage { Content = new StringContent(strMsg, Encoding.GetEncoding("UTF-8"), "application/x-www-form-urlencoded") }; return result; }
此處要強調一下,參照PHP的 echo $echoStr , WebFrom 的 Response.Write(echoStr)等。
一次次的調試判斷出微信的接受方式,只會以 "application/x-www-form-urlencoded" 來接受,因此我用HttpResponseMessage來指定其輸出方式。最後測試成功!



  網上各位大神給出的接入方法足以研究出接入規則,我經過某大神給的工具:Ngrok工具,成功部署本機80端口開放給外網,更加便於調試。感謝!

 

  博客開了3年,第一次規規矩矩的寫一次技術博文。不足的地方,望你們多多諒解。

  專一於研究ASP.NET技術,最近迷上ASP.NET WebAPI。

  我的網站正在搭建中:http://Amoysec.com,準備使用bootstrap + knockoutjs + MVC +WebAPI + EF6.0來作,其中對knockoutjs也算有很多的瞭解了,雖然比不上博客園的湯姆大叔,但也全憑本身對一份chm文檔摸索出了很多。歡迎一塊兒探討!

 轉載請註明出處,謝謝:http://www.cnblogs.com/mose/p/4136417.html

相關文章
相關標籤/搜索