Senparc.Weixin微信開發(1) 開發驗證

weixin_34119545發表於2018-10-18

官方系列教程
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請求攜帶引數如下表所示:

196558-20181018153535577-162785237.png

開發者通過檢驗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可以填入微信後臺。";
            }
        }

相關文章