1. 程式人生 > >微信公眾平臺教程之C#開發例項

微信公眾平臺教程之C#開發例項


點選左上角的高階功能

進入開發模式

首先你得成為開發者,成為開發者你要填寫一個URL和TOKEN,TOKEN可以隨便填寫。。

因為本篇講的是C#例項,所以新建一個defaut.aspx ,然後在PAGE_Load裡填寫方法,注意頁面埠只能是80

騰訊給了一個PHP例子,方便給PHP開發使用,我把他給翻譯成了C#

PHP例子:

<?php
/**
  * wechat php test
  */

//define your token
define("TOKEN", "momancamerarps");
$wechatObj = new wechatCallbackapiTest();
$wechatObj->valid();

class wechatCallbackapiTest
{
	public function valid()
    {
        $echoStr = $_GET["echostr"];

        //valid signature , option
        if($this->checkSignature()){
        	echo $echoStr;
        	exit;
        }
    }

    public function responseMsg()
    {
		//get post data, May be due to the different environments
		$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

      	//extract post data
		if (!empty($postStr)){
                
              	$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
                $fromUsername = $postObj->FromUserName;
                $toUsername = $postObj->ToUserName;
                $keyword = trim($postObj->Content);
                $time = time();
                $textTpl = "<xml>
							<ToUserName><![CDATA[%s]]></ToUserName>
							<FromUserName><![CDATA[%s]]></FromUserName>
							<CreateTime>%s</CreateTime>
							<MsgType><![CDATA[%s]]></MsgType>
							<Content><![CDATA[%s]]></Content>
							<FuncFlag>0</FuncFlag>
							</xml>";             
				if(!empty( $keyword ))
                {
              		$msgType = "text";
                	$contentStr = "Welcome to wechat world!";
                	$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                	echo $resultStr;
                }else{
                	echo "Input something...";
                }

        }else {
        	echo "";
        	exit;
        }
    }
		
	private function checkSignature()
	{
        $signature = $_GET["signature"];
        $timestamp = $_GET["timestamp"];
        $nonce = $_GET["nonce"];	
        		
		$token = TOKEN;
		$tmpArr = array($token, $timestamp, $nonce);
		sort($tmpArr);
		$tmpStr = implode( $tmpArr );
		$tmpStr = sha1( $tmpStr );
		
		if( $tmpStr == $signature ){
			return true;
		}else{
			return false;
		}
	}
}

?>

上面這個例子就是驗證一下你填寫的URL是不是存在,騰訊會給你填寫的URL POST過來一個叫echostr的隨機數,然後你頁面如果返回寫入echostr就證明你此頁面存在。

你URL就能通過了

下面是C#

private const string TOKEN = "你頁面填寫的TOKEN";
protected void Page_Load(object sender, EventArgs e)
        {
            try
            {

                string echoStr = HttpContext.Current.Request["echostr"];
                if (echoStr != "")
                {
                    if (checkSignature())
                    {
                        HttpContext.Current.Response.ContentType = "text/plain";
                        HttpContext.Current.Response.Write(echoStr);
                    }
                }
            }
            catch (Exception ex)
            {
                string wrongText = string.Empty;
                wrongText = ex.Message;
                File.WriteAllText(Server.MapPath("~/") + @"\test.txt", wrongText);

            }
            finally
            {
                HttpContext.Current.Response.End();
            }
        }
#region 檢測Signature
        private bool checkSignature()
        {
            string signature = HttpContext.Current.Request["signature"];
            string timestamp = HttpContext.Current.Request["timestamp"];
            string nonce = HttpContext.Current.Request["nonce"];
            List<string> tmpArr = new List<string>();
            tmpArr.Add(TOKEN);
            tmpArr.Add(timestamp);
            tmpArr.Add(nonce);
            tmpArr.Sort();
            string a = string.Join("", tmpArr);
            SHA1 hash = SHA1CryptoServiceProvider.Create();
            byte[] plainTextBytes = Encoding.ASCII.GetBytes(a);
            byte[] hashBytes = hash.ComputeHash(plainTextBytes);
            string localChecksum = BitConverter.ToString(hashBytes).Replace("-", "").ToLowerInvariant();
            if (signature == localChecksum)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        #endregion

上面的程式碼,如果你的URL已經通過的話,就可以把Page_Load裡的程式碼註釋掉了,他只在你填寫URL時使用到,一旦你的URL通過的話,上面的程式碼就沒用了

再次你就成功成為開發者了。。

現在你如果給你的微信服務號傳送訊息的話,就給你填寫的URL POST資料了

因為上面的PAGE_LOAD裡的程式碼已經註釋沒用了,現在PAGE_LOAD裡的資料就是要獲取騰訊POST過來的資料了

 protected void Page_Load(object sender, EventArgs e){
            XmlNode RequestXML = null; 
            string Content = "";
            int index = 0;
            try
            {
                byte[] data = Request.BinaryRead(Request.TotalBytes);//獲取騰訊傳過來的資料,他POST過來的是一個XML
                String xmlData = Encoding.UTF8.GetString(data);//轉換成STRING
                XmlDocument requestXml = Converter.StringToXmlDocument(xmlData);//把String轉成XML,這個大家百度搜一下方法,我就不發了
                XmlNode rootNode = requestXml.SelectSingleNode("xml");//獲取根節點
                XmlNode FromUserNameNode = rootNode.SelectSingleNode("FromUserName");
                XmlNode ToUserNameNode = rootNode.SelectSingleNode("ToUserName");
                XmlNode ContentNode = rootNode.SelectSingleNode("Content");
                XmlNode MsgIdNode = rootNode.SelectSingleNode("MsgId");
                string ToUserName = ToUserNameNode == null ? "" : ToUserNameNode.InnerText;
                string FromUserName = FromUserNameNode == null ? "" : FromUserNameNode.InnerText;
                Content = ContentNode == null ? "" : ContentNode.InnerText;
                string MsgId = MsgIdNode == null ? "" : MsgIdNode.InnerText;
                long ticks = DateTime.Now.Ticks;
                string time = ticks.ToString();
                DateTime dt = new DateTime(ticks);
                string AddToDBxml = string.Format(@"<xml>
							<ToUserName>{0}</ToUserName>
							<FromUserName>{1}</FromUserName>
							<CreateTime>{2}</CreateTime>
							<MsgType>text</MsgType>
							<Content>{3}</Content>
                            <FuncFlag>0</FuncFlag>
							</xml>", ToUserName, FromUserName, time, Content);//上面的XML是使用者傳送訊息後,你獲取到的,你可以根據使用者發過來的內容做判斷,比如上面的Content如果是1,就代表使用者發過來的是1,你就可以返回對應的內容了,下面是你要返給使用者的XML
             string xml = string.Format(@"<xml>
							<ToUserName>{0}</ToUserName>
							<FromUserName>{1}</FromUserName>
							<CreateTime>{2}</CreateTime>
							<MsgType>text</MsgType>
							<Content>{3}</Content>
                            <FuncFlag>0</FuncFlag>
							</xml>", FromUserName, ToUserName, time, ResponseContentNode.InnerText);
                //把資料重新返回給客戶端
                try
                {
                    HttpContext.Current.Response.ContentType = "text/xml";
                    HttpContext.Current.Response.Write(xml);
                    HttpContext.Current.ApplicationInstance.CompleteRequest();
                }
                catch
                {

                }


好了,自動回覆的例項就是這些了。。下面是自定義選單的實現程式碼


      private string GetToken()
        {
            string url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + AppID + "&secret=" + AppSecret + "";//你成為開發者後會有一個appID和appSecret
            string response = HttpGet(url);
            JavaScriptSerializer json = new JavaScriptSerializer();   //例項化一個能夠序列化資料的類
            ToJson list = json.Deserialize<ToJson>(response);    //將json資料轉化為物件型別並賦值給list
            access_token = list.access_token;      //獲取JSON裡access_token值
            return access_token;
        }
        #region Get
        /// <summary>
        /// HTTP GET方式請求資料.
        /// </summary>
        /// <param name="url">URL.</param>
        /// <returns></returns>
        public string HttpGet(string url)
        {
            HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
            request.Method = "GET";
            request.Accept = "*/*";
            request.Timeout = 15000;
            request.AllowAutoRedirect = false;

            WebResponse response = null;
            string responseStr = null;

            try
            {
                response = request.GetResponse();

                if (response != null)
                {
                    StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
                    responseStr = reader.ReadToEnd();
                    reader.Close();
                }
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                request = null;
                response = null;
            }

            return responseStr;
        }
        #endregion
        #region POST
        /// <summary>
        /// HTTP POST方式請求資料
        /// </summary>
        /// <param name="url">URL.</param>
        /// <param name="param">POST的資料</param>
        /// <returns></returns>
        public string HttpPost(string url, string param)
        {
            HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
            request.Method = "POST";
            request.ContentType = "application/x-www-form-urlencoded";
            request.Accept = "*/*";
            request.Timeout = 15000;
            request.AllowAutoRedirect = false;

            StreamWriter requestStream = null;
            WebResponse response = null;
            string responseStr = null;

            try
            {
                requestStream = new StreamWriter(request.GetRequestStream());
                requestStream.Write(param);
                requestStream.Close();

                response = request.GetResponse();
                if (response != null)
                {
                    StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
                    responseStr = reader.ReadToEnd();
                    File.WriteAllText(Server.MapPath("~/") + @"\test.txt", responseStr);
                    reader.Close();
                }
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                request = null;
                requestStream = null;
                response = null;
            }

            return responseStr;
        }
        #endregion
        #region 中轉物件
        public struct ToJson
        {
            public string access_token { get; set; }  //屬性的名字,必須與json格式字串中的"key"值一樣。
            public string expires { get; set; }
        }
        #endregion
//比如我要呼叫自定義選單 

  
 string CreateMenu = " https://api.weixin.qq.com/cgi-bin/menu/create?access_token=";
 jsonstr.Append("{\"button\":[{").Append("\"type\":\"").Append("click").Append("\",\"name\":\"").Append("test").Append("\",\"key\":").Append("\"V1001_TODAY_MUSIC\"").Append("},{").Append("\"type\":\"").Append("click").Append("\",\"name\":\"").Append("moman").Append("\",\"key\":").Append("\"V1001_TODAY_MUSIC\"").Append("},").Append("{\"name\":\"").Append("選單").Append("\",\"sub_button\":[").Append("{\"type\":\"").Append("view").Append("\",\"name\":\"").Append("搜尋").Append("\",\"url\":\"").Append("http://www.soso.com\"}]").Append("}]").Append("},");
                    string jsonStr = jsonstr.ToString();
                    if (jsonStr.LastIndexOf(',') > 0)
                        jsonStr = jsonStr.Substring(0, jsonStr.LastIndexOf(','));
                    jsonStr = jsonStr.Replace(@"\", "/");
                    string url = CreateMenu + GetToken();
                    string returnData = HttpPost(url, jsonStr); //returnData 返回的是 {"errcode":0,"errmsg":"ok"} 此時,你取消服務號關注,在新增關注,選單就生成了