.net開發微信公眾平台執行個體教程_實用技巧

來源:互聯網
上載者:User

本文執行個體講述了.net開發微信公眾平台的方法。分享給大家供大家參考。具體實現方法如下:

一、說明:

公眾平台資訊介面為開發人員提供了一種新的訊息處理方式,只有申請成為開發人員後,你才能使用公眾平台的開發功能,在這裡你需要填寫一個URL和一個Token,這兩項資訊也需要你擁有自己的伺服器(外網伺服器)資源,其中的Token可由開發人員任意填寫,URL即是介面配置資訊的連結地址,在本文中我採用的是建立一個簡易網站的方式,在其中的一個頁面的背景程式中配置相關的介面資訊,然後發布到外網伺服器上,最後可以訪問到這個頁面的連結地址即是這裡應該填寫的URL。

二、介面配置過程:

1.網址接入-校正簽名:

複製代碼 代碼如下:
const string Token = "aka";//定義一個局部變數不可以被修改,這裡定義的變數要與介面配置資訊中填寫的Token一致
protected void Page_Load(object sender, EventArgs e)
{
        string postStr = "";
        Valid();//校正簽名,當填入的資訊提交之後頁面有提示“你已成功成為公眾平台開發人員,可以使用公眾平台的開發功能”這個的時候,接下來你就需要注釋掉這個校正的方法,使得後面的訊息回複得以正常運作
        if (Request.HttpMethod.ToLower() == "post")//當普通微信使用者向公眾帳號發訊息時,微信伺服器將POST該訊息到填寫的URL上
        {
            postStr = PostInput();
            if (string.IsNullOrEmpty(postStr) == false)
            {
                //WriteLog(postStr,Server);//計入日記
                ResponseMsg(postStr);
            }
        }
}
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();//對字串中的字母部分進行小寫轉換,非字母字元不作處理
        //WriteLog(tmpStr, Server);//計入日誌
        if (tmpStr == signature)//開發人員獲得加密後的字串可與signature對比,標識該請求來源於微信。開發人員通過檢驗signature對請求進行校正,若確認此次GET請求來自微信伺服器,請原樣返回echostr參數內容,則接入生效,否則接入失敗
        {
            return true;
        }
        else
            return false;
}

/// <summary>
/// 擷取post返回來的資料
/// </summary>
/// <returns></returns>
private string PostInput()
{
        Stream s = System.Web.HttpContext.Current.Request.InputStream;
        byte[] b = new byte[s.Length];
        s.Read(b, 0, (int)s.Length);
        return Encoding.UTF8.GetString(b);
}

/// <summary>
///返回微信資訊結果
/// </summary>
/// <param name="weixinXML"></param>
private void ResponseMsg(string weixinXML)
{
        try
        {
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(weixinXML);//讀取XML字串
            XmlElement rootElement = doc.DocumentElement;

            XmlNode MsgType = rootElement.SelectSingleNode("MsgType");//擷取字串中的訊息類型

            string resxml = "";
            if (MsgType.InnerText == "text")//如果訊息類型為簡訊
            {
                var model = new
                {
                    ToUserName = rootElement.SelectSingleNode("ToUserName").InnerText,
                    FromUserName = rootElement.SelectSingleNode("FromUserName").InnerText,
                    CreateTime = rootElement.SelectSingleNode("CreateTime").InnerText,
                    MsgType = MsgType.InnerText,
                    Content = rootElement.SelectSingleNode("Content").InnerText,
                    MsgId = rootElement.SelectSingleNode("MsgId").InnerText
                };
                resxml += "<xml><ToUserName><![CDATA[" + model.FromUserName + "]]></ToUserName><FromUserName><![CDATA[" + model.ToUserName + "]]></FromUserName><CreateTime>" + ConvertDateTimeInt(DateTime.Now) + "</CreateTime>";
                if (!string.IsNullOrEmpty(model.Content))//如果接收到訊息
                {
                    if (model.Content.Contains(" 你好") || model.Content.Contains(" 好") || model.Content.Contains("hi") || model.Content.Contains("hello"))// 你好
                    {
                        resxml += "<MsgType><![CDATA[text]]></MsgType><Content><![CDATA[你好,有事請留言,偶會及時回複你的。]]></Content><FuncFlag>0</FuncFlag></xml>";
                    }

                 }

                 else//沒有接收到訊息
                {
                    resxml += "<MsgType><![CDATA[text]]></MsgType><Content><![CDATA[親,感謝您對我的關注清單,有事請留言。]]></Content><FuncFlag>0</FuncFlag></xml>";
                }

                Response.Write(resxml);
            }
            if (MsgType.InnerText == "image")//如果訊息類型為圖片訊息
            {
                var model = new
                {
                    ToUserName = rootElement.SelectSingleNode("ToUserName").InnerText,
                    FromUserName = rootElement.SelectSingleNode("FromUserName").InnerText,
                    CreateTime = rootElement.SelectSingleNode("CreateTime").InnerText,
                    MsgType = MsgType.InnerText,
                    PicUrl = rootElement.SelectSingleNode("PicUrl").InnerText,
                    MsgId = rootElement.SelectSingleNode("MsgId").InnerText
                };
                resxml += "<xml><ToUserName><![CDATA[" + model.FromUserName + "]]></ToUserName><FromUserName><![CDATA[" + model.ToUserName + "]]></FromUserName><CreateTime>" + ConvertDateTimeInt(DateTime.Now) + "</CreateTime><MsgType><![CDATA[news]]></MsgType><ArticleCount>1</ArticleCount><Articles><item><Title><![CDATA[歡迎您的光臨!]]></Title><Description><![CDATA[非常感謝您的關注!]]></Description><PicUrl><![CDATA[http://...jpg]]></PicUrl><Url><![CDATA[http://www.baidu.com/]]></Url></item></Articles><FuncFlag>0</FuncFlag></xml>";
                Response.Write(resxml);
            }
            else//如果是其餘的訊息類型
            {
                var model = new
                {
                    ToUserName = rootElement.SelectSingleNode("ToUserName").InnerText,
                    FromUserName = rootElement.SelectSingleNode("FromUserName").InnerText,
                    CreateTime = rootElement.SelectSingleNode("CreateTime").InnerText,
                };
                resxml += "<xml><ToUserName><![CDATA[" + model.FromUserName + "]]></ToUserName><FromUserName><![CDATA[" + model.ToUserName + "]]></FromUserName><CreateTime>" + ConvertDateTimeInt(DateTime.Now) + "</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[親,感謝您對我的關注清單,有事請留言,我會及時回複你的哦。]]></Content><FuncFlag>0</FuncFlag></xml>";
                Response.Write(resxml);
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
        Response.End();

}
/// <summary>
/// datetime轉換成unixtime
/// </summary>
/// <param name="time"></param>
/// <returns></returns>
private int ConvertDateTimeInt(System.DateTime time)
{
        System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1));
        return (int)(time - startTime).TotalSeconds;
}
/// <summary>
/// 寫日誌(用於跟蹤),可以將想列印出的內容計入一個文字檔裡面,便於測試
/// </summary>
public static void WriteLog(string strMemo, HttpServerUtility server)
{
        string filename = server.MapPath("/logs/log.txt");//在網站項目中建立一個檔案夾命名logs(然後在檔案夾中隨便建立一個web分頁檔,避免網站在發布到伺服器之後看不到預定檔案)
        if (!Directory.Exists(server.MapPath("//logs//")))
            Directory.CreateDirectory("//logs//");
        StreamWriter sr = null;
        try
        {
            if (!File.Exists(filename))
            {
                sr = File.CreateText(filename);
            }
            else
            {
                sr = File.AppendText(filename);
            }
            sr.WriteLine(strMemo);
        }
        catch
        {
        }
        finally
        {
            if (sr != null)
                sr.Close();
        }
}

希望本文所述對大家的.net程式設計有所協助。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.