微信公眾平臺教程之C#開發例項
阿新 • • 發佈:2018-12-30
點選左上角的高階功能
進入開發模式
首先你得成為開發者,成為開發者你要填寫一個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"} 此時,你取消服務號關注,在新增關注,選單就生成了