1. 程式人生 > >ASP.NET微信公眾號開發實記之一 接入配置

ASP.NET微信公眾號開發實記之一 接入配置

第一步:填寫伺服器配置

登入微信公眾平臺官網後,在公眾平臺後臺管理頁面 - 開發者中心頁,點選“修改配置”按鈕,填寫伺服器地址(URL)、Token和EncodingAESKey,其中URL是開發者用來接收微信訊息和事件的介面URL。Token可由開發者可以任意填寫,用作生成簽名(該Token會和介面URL中包含的Token進行比對,從而驗證安全性)。EncodingAESKey由開發者手動填寫或隨機生成,將用作訊息體加解密金鑰。

同時,開發者可選擇訊息加解密方式:明文模式、相容模式和安全模式。模式的選擇與伺服器配置在提交後都會立即生效,請開發者謹慎填寫及選擇。加解密方式的預設狀態為明文模式,選擇相容模式和安全模式需要提前配置好相關加解密程式碼,詳情請參考訊息體簽名及加解密部分的文件。 

注:需配合服務端設定再提交,具體配置請看第二步


第二步:驗證伺服器地址的有效性

開發者提交資訊後,微信伺服器將傳送GET請求到填寫的伺服器地址URL上,GET請求攜帶四個引數:

開發者通過檢驗signature對請求進行校驗(下面有校驗方式)。若確認此次GET請求來自微信伺服器,請原樣返回echostr引數內容,則接入生效,成為開發者成功,否則接入失敗。

加密/校驗流程如下:
1. 將token、timestamp、nonce三個引數進行字典序排序
2. 將三個引數字串拼接成一個字串進行sha1加密
3. 開發者獲得加密後的字串可與signature對比,標識該請求來源於微信

Demo:

建立一個頁面如

WeiXinVerify<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">.aspx,在</span><span style="font-family: Arial, Helvetica, sans-serif;">WeiXinVerify</span><span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">.aspx.cs中配置如下程式碼</span>
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Xml;

namespace Wodeyun.Project.Www
{
    public partial class WeiXinVerify : System.Web.UI.Page
    {
        const string Token = "abcdefg";//定義一個區域性變數不可以被修改,這裡定義的變數要與介面配置資訊中填寫的Token一致
        protected void Page_Load(object sender, EventArgs e)
        {
            Valid();//校驗簽名
        }

        private void Valid()
        {
            string echoStr = Request.QueryString["echoStr"].ToString();
            if (CheckSignature())
            {
                if (!string.IsNullOrEmpty(echoStr))
                {
                    Response.Write(echoStr);
                    Response.End();
                }
            }
        }

        /// <summary>
        /// 驗證微信簽名
        /// </summary>
        /// <returns></returns>
        private bool CheckSignature()
        {
            string signature = Request.QueryString["signature"].ToString();
            string timestamp = Request.QueryString["timestamp"].ToString();
            string nonce = Request.QueryString["nonce"].ToString();
            string[] ArrTmp = { Token, timestamp, nonce };
            Array.Sort(ArrTmp);//字典排序
            string tmpStr = string.Join("", ArrTmp);
            tmpStr = FormsAuthentication.HashPasswordForStoringInConfigFile(tmpStr, "SHA1");//對該字串進行sha1加密
            tmpStr = tmpStr.ToLower();//對字串中的字母部分進行小寫轉換,非字母字元不作處理
            if (tmpStr == signature)//開發者獲得加密後的字串可與signature對比,標識該請求來源於微信。開發者通過檢驗signature對請求進行校驗,若確認此次GET請求來自微信伺服器,請原樣返回echostr引數內容,則接入生效,否則接入失敗
            {
                return true;
            }
            else
                return false;
        }        
    }
}

第三步:依據介面文件實現業務邏輯

驗證URL有效性成功後即接入生效,成為開發者。如果公眾號型別為服務號(訂閱號只能使用普通訊息介面),可以在公眾平臺網站中申請認證,認證成功的服務號將獲得眾多介面許可權,以滿足開發者需求。

此後使用者每次向公眾號傳送訊息、或者產生自定義選單點選事件時,開發者填寫的伺服器配置URL將得到微信伺服器推送過來的訊息和事件,然後開發者可以依據自身業務邏輯進行響應,例如回覆訊息等。

公眾號呼叫各介面時,一般會獲得正確的結果,具體結果可見對應介面的說明。返回錯誤時,可根據返回碼來查詢錯誤原因。全域性返回碼說明

使用者向公眾號傳送訊息時,公眾號方收到的訊息傳送者是一個OpenID,是使用使用者微訊號加密後的結果,每個使用者對每個公眾號有一個唯一的OpenID。

此外,由於開發者經常有需在多個平臺(移動應用、網站、公眾帳號)之間共通使用者帳號,統一帳號體系的需求,微信開放平臺(open.weixin.qq.com)提供了UnionID機制。開發者可通過OpenID來獲取使用者基本資訊,而如果開發者擁有多個應用(移動應用、網站應用和公眾帳號,公眾帳號只有在被繫結到微信開放平臺帳號下後,才會獲取UnionID),可通過獲取使用者基本資訊中的UnionID來區分使用者的唯一性,因為只要是同一個微信開放平臺帳號下的移動應用、網站應用和公眾帳號,使用者的UnionID是唯一的。換句話說,同一使用者,對同一個微信開放平臺帳號下的不同應用,UnionID是相同的。詳情請在微信開放平臺的資源中心-移動應用開發-微信登入-授權關係介面呼叫指引-獲取使用者個人資訊(UnionID機制)中檢視。

另請注意,微信公眾號介面只支援80介面。