這篇文章將為大家詳細(xì)講解有關(guān)asp.net微信開發(fā)消息應(yīng)答方法的示例,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
創(chuàng)新互聯(lián)的客戶來自各行各業(yè),為了共同目標(biāo),我們在工作上密切配合,從創(chuàng)業(yè)型小企業(yè)到企事業(yè)單位,感謝他們對我們的要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會用頭腦與智慧不斷的給客戶帶來驚喜。專業(yè)領(lǐng)域包括網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、電商網(wǎng)站開發(fā)、微信營銷、系統(tǒng)平臺開發(fā)。
當(dāng)普通微信用戶向公眾賬號發(fā)消息時(shí),微信服務(wù)器將POST消息的XML數(shù)據(jù)包到開發(fā)者填寫的URL上。
請注意:
1、關(guān)于重試的消息排重,推薦使用msgid排重。 2、微信服務(wù)器在五秒內(nèi)收不到響應(yīng)會斷掉連接,并且重新發(fā)起請求,總共重試三次。假如服務(wù)器無法保證在五秒內(nèi)處理并回復(fù),可以直接回復(fù)空串,微信服務(wù)器不會對此作任何處理,并且不會發(fā)起重試。詳情請見“發(fā)送消息-被動(dòng)回復(fù)消息”。 3、為了保證更高的安全保障,開發(fā)者可以在公眾平臺官網(wǎng)的開發(fā)者中心處設(shè)置消息加密。開啟加密后,用戶發(fā)來的消息會被加密,公眾號被動(dòng)回復(fù)用戶的消息也需要加密(但開發(fā)者通過客服接口等API調(diào)用形式向用戶發(fā)送消息,則不受影響)。關(guān)于消息加解密的詳細(xì)說明,請見“消息加解密說明”。
各消息類型的推送XML數(shù)據(jù)包結(jié)構(gòu)如下:
1348831860 1234567890123456
參數(shù) | 描述 |
---|---|
ToUserName | 開發(fā)者微信號 |
FromUserName | 發(fā)送方帳號(一個(gè)OpenID) |
CreateTime | 消息創(chuàng)建時(shí)間 (整型) |
MsgType | text |
Content | 文本消息內(nèi)容 |
MsgId | 消息id,64位整型 |
1348831860 1234567890123456
參數(shù) | 描述 |
---|---|
ToUserName | 開發(fā)者微信號 |
FromUserName | 發(fā)送方帳號(一個(gè)OpenID) |
CreateTime | 消息創(chuàng)建時(shí)間 (整型) |
MsgType | image |
PicUrl | 圖片鏈接 |
MediaId | 圖片消息媒體id,可以調(diào)用多媒體文件下載接口拉取數(shù)據(jù)。 |
MsgId | 消息id,64位整型 |
1357290913 1234567890123456
參數(shù) | 描述 |
---|---|
ToUserName | 開發(fā)者微信號 |
FromUserName | 發(fā)送方帳號(一個(gè)OpenID) |
CreateTime | 消息創(chuàng)建時(shí)間 (整型) |
MsgType | 語音為voice |
MediaId | 語音消息媒體id,可以調(diào)用多媒體文件下載接口拉取數(shù)據(jù)。 |
Format | 語音格式,如amr,speex等 |
MsgID | 消息id,64位整型 |
請注意,開通語音識別后,用戶每次發(fā)送語音給公眾號時(shí),微信會在推送的語音消息XML數(shù)據(jù)包中,增加一個(gè)Recongnition字段 (注:由于客戶端緩存,開發(fā)者開啟或者關(guān)閉語音識別功能,對新關(guān)注者立刻生效,對已關(guān)注用戶需要24小時(shí)生效。開發(fā)者可以重新關(guān)注此帳號進(jìn)行測試)。開啟 語音識別后的語音XML數(shù)據(jù)包如下:
1357290913 1234567890123456
多出的字段中,F(xiàn)ormat為語音格式,一般為amr,Recognition為語音識別結(jié)果,使用UTF8編碼。
1357290913 1234567890123456
參數(shù) | 描述 |
---|---|
ToUserName | 開發(fā)者微信號 |
FromUserName | 發(fā)送方帳號(一個(gè)OpenID) |
CreateTime | 消息創(chuàng)建時(shí)間 (整型) |
MsgType | 視頻為video |
MediaId | 視頻消息媒體id,可以調(diào)用多媒體文件下載接口拉取數(shù)據(jù)。 |
ThumbMediaId | 視頻消息縮略圖的媒體id,可以調(diào)用多媒體文件下載接口拉取數(shù)據(jù)。 |
MsgId | 消息id,64位整型 |
1357290913 1234567890123456
參數(shù) | 描述 |
---|---|
ToUserName | 開發(fā)者微信號 |
FromUserName | 發(fā)送方帳號(一個(gè)OpenID) |
CreateTime | 消息創(chuàng)建時(shí)間 (整型) |
MsgType | 小視頻為shortvideo |
MediaId | 視頻消息媒體id,可以調(diào)用多媒體文件下載接口拉取數(shù)據(jù)。 |
ThumbMediaId | 視頻消息縮略圖的媒體id,可以調(diào)用多媒體文件下載接口拉取數(shù)據(jù)。 |
MsgId | 消息id,64位整型 |
1351776360 23.134521 113.358803 20 1234567890123456
參數(shù) | 描述 |
---|---|
ToUserName | 開發(fā)者微信號 |
FromUserName | 發(fā)送方帳號(一個(gè)OpenID) |
CreateTime | 消息創(chuàng)建時(shí)間 (整型) |
MsgType | location |
Location_X | 地理位置維度 |
Location_Y | 地理位置經(jīng)度 |
Scale | 地圖縮放大小 |
Label | 地理位置信息 |
MsgId | 消息id,64位整型 |
1351776360 1234567890123456
參數(shù) | 描述 |
---|---|
ToUserName | 接收方微信號 |
FromUserName | 發(fā)送方微信號,若為普通用戶,則是一個(gè)OpenID |
CreateTime | 消息創(chuàng)建時(shí)間 |
MsgType | 消息類型,link |
Title | 消息標(biāo)題 |
Description | 消息描述 |
Url | 消息鏈接 |
MsgId | 消息id,64位整型 |
接上篇,看ResponseXML(postString);方法如下
///
/// 獲取用戶發(fā)送的消息
///
///
private void ResponseXML(string postString)
{
//使用XMLDocument加載信息結(jié)構(gòu)
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(postString);
XmlElement rootElement = xmlDoc.DocumentElement;//獲取文檔的根
XmlNode MsgType = rootElement.SelectSingleNode("MsgType"); //獲取消息的文本類型
RequestXML requestXML = new RequestXML();//聲明實(shí)例,獲取各個(gè)屬性并賦值
requestXML.ToUserName = rootElement.SelectSingleNode("ToUserName").InnerText;//公眾號
requestXML.FromUserName = rootElement.SelectSingleNode("FromUserName").InnerText;//用戶
requestXML.CreateTime = rootElement.SelectSingleNode("CreateTime").InnerText;//創(chuàng)建時(shí)間
requestXML.MsgType = MsgType.InnerText;//消息類型
///對消息的不同類型進(jìn)行賦值
if (requestXML.MsgType == "text")
{
//賦值文本信息內(nèi)容
requestXML.Content = rootElement.SelectSingleNode("Content").InnerText;
}
if (requestXML.MsgType.Trim() == "location")
{
///賦值地理位置緯度,經(jīng)度,地圖縮放比例,地理位置說明
requestXML.Location_X = rootElement.SelectSingleNode("Location_X").InnerText;
requestXML.Location_Y = rootElement.SelectSingleNode("Location_Y").InnerText;
requestXML.Scale = rootElement.SelectSingleNode("Scale").InnerText;
requestXML.Label = rootElement.SelectSingleNode("Label").InnerText;
}
if (requestXML.MsgType.Trim().ToLower() == "event")
{
///賦值事件名稱和事件key值
requestXML.EventName = rootElement.SelectSingleNode("Event").InnerText;
requestXML.EventKey = rootElement.SelectSingleNode("EventKey").InnerText;
}
if (requestXML.MsgType.Trim().ToLower() == "voice")
{
///賦值語音識別結(jié)果,賦值之前一定要記得在開發(fā)者模式下,把語音識別功能開啟,否則獲取不到
requestXML.Recognition = rootElement.SelectSingleNode("Recognition").InnerText;
}
ResponseMsg(requestXML);
}
語音識別功能開啟如下:
requestXML是我單獨(dú)創(chuàng)建的一個(gè)類,該類聲明了消息中常用的屬性字段,如下:
///
/// 接收消息的實(shí)體類
///
public class RequestXML
{
private String toUserName = String.Empty;
///
/// 本公眾號
///
public String ToUserName{get;set;}
///
/// 用戶微信號
///
public String FromUserName{get;set;}
///
/// 創(chuàng)建時(shí)間
///
public String CreateTime{get;set;}
///
/// 信息類型
///
public String MsgType{get;set;}
///
/// 信息內(nèi)容
///
public String Content{get;set;}
/*以下為事件類型的消息特有的屬性*/
///
/// 事件名稱
///
public String EventName{get;set;}
///
/// 事件值
///
public string EventKey { get; set; }
/*以下為圖文類型的消息特有的屬性*/
///
/// 圖文消息的個(gè)數(shù)
///
public int ArticleCount { get; set; }
///
/// 圖文消息的標(biāo)題
///
public string Title { get; set; }
///
/// 圖文消息的簡介
///
public string Description { get; set; }
///
/// 圖文消息圖片的鏈接地址
///
public string PicUrl { get; set; }
///
/// 圖文消息詳情鏈接地址
///
public string Url { get; set; }
///
/// 圖文消息集合
///
public List
/*以下為地理位置類型的消息特有的屬性*/
///
/// 地理位置緯度
///
public String Location_X { get; set; }
///
/// 地理位置經(jīng)度
///
public String Location_Y { get; set; }
///
/// 地圖縮放比例
///
public String Scale { get; set; }
///
/// 地圖位置說明
///
public String Label { get; set; }
///
/// 語音消息特有字段
///
public String Recognition { get; set; }
}
繼續(xù)關(guān)注 ResponseMsg(requestXML);方法如下,
private void ResponseMsg(RequestXML requestXML)
{
string MsgType = requestXML.MsgType;
try
{
//根據(jù)消息類型判斷發(fā)送何種類型消息
switch (MsgType)
{
case "text":
SendTextCase(requestXML);//發(fā)送文本消息
break;
case "event"://發(fā)送事件消息
if (!string.IsNullOrWhiteSpace(requestXML.EventName) && requestXML.EventName.ToString().Trim().Equals("subscribe"))
{
SendWelComeMsg(requestXML);//關(guān)注時(shí)返回的圖文消息
}
else if (!string.IsNullOrWhiteSpace(requestXML.EventName) && requestXML.EventName.ToString().Trim().Equals("CLICK"))
{
SendEventMsg(requestXML);//發(fā)送事件消息
}
break;
case "voice":
SendVoiceMsg(requestXML);//發(fā)送語音消息
break;
case "location"://發(fā)送位置消息
SendMapMsg(requestXML);
break;
default:
break;
}
}
catch (Exception ex)
{
HttpContext.Current.Response.Write(ex.ToString());
}
}
先來關(guān)注發(fā)送文本消息,SendTextCase(requestXML);//發(fā)送文本消息
///
/// 發(fā)送文本
///
///
private void SendTextCase(RequestXML requestXML)
{
string responseContent = FormatTextXML(requestXML.FromUserName, requestXML.ToUserName, requestXML.Content);
HttpContext.Current.Response.ContentType = "text/xml";
HttpContext.Current.Response.ContentEncoding = Encoding.UTF8;
HttpContext.Current.Response.Write(responseContent);
HttpContext.Current.Response.End();
}
FormatTextXML方法制定格式
///
/// 返回格式化的Xml格式內(nèi)容
///
/// 公眾號
/// 用戶號
/// 回復(fù)內(nèi)容
///
private string FormatTextXML(string p1, string p2, string p3)
{
return "
}
這樣就能實(shí)現(xiàn)消息的應(yīng)答,如果用戶點(diǎn)擊的按鈕,如下代碼:
case "event"://發(fā)送事件消息
if
(!string.IsNullOrWhiteSpace(requestXML.EventName) &&
requestXML.EventName.ToString().Trim().Equals("subscribe"))
{
SendWelComeMsg(requestXML);//關(guān)注時(shí)返回的圖文消息
}
else if (!string.IsNullOrWhiteSpace(requestXML.EventName) &&
requestXML.EventName.ToString().Trim().Equals("CLICK"))
{
SendEventMsg(requestXML);//發(fā)送事件消息
}
break;
///
/// 發(fā)送響應(yīng)事件消息
///
///
private void SendEventMsg(RequestXML requestXML)
{
string keyStr = requestXML.EventKey.ToString();
switch (keyStr)
{
case "mypay":
SendPayDetails(requestXML);//發(fā)送薪資賬單
break;
case "tianqiyubao":
SendWeaterMessage(requestXML);//發(fā)送天氣預(yù)報(bào)
break;
case "kaixinyixiao":
SendKaiXinMessage(requestXML);//發(fā)送開心一笑結(jié)果集
break;
case "updateMessage":
SendUpdateMessage(requestXML);//發(fā)送修改信息鏈接
break;
case "yuangonghuodong":
SendYuanGongHuoDong(requestXML);//發(fā)送學(xué)生活動(dòng)
break;
case "yuangongtongzhi":
SendYuanGongTongZhi(requestXML);//發(fā)送員工通知
break;
case "youwenbida":
SendWenti(requestXML);//發(fā)送員工提交問題鏈接
break;
case "mywen":
SendWentiList(requestXML);//發(fā)送問題列表鏈接
break;
case "PhoneSerices":
SendKeFuMessage(requestXML);//接入客服
break;
default:
String responseContent = String.Empty;
responseContent = FormatTextXML(requestXML.FromUserName, requestXML.ToUserName,"此功能暫未開放!敬請期待!");
HttpContext.Current.Response.ContentType = "text/xml";
HttpContext.Current.Response.ContentEncoding = Encoding.UTF8;
HttpContext.Current.Response.Write(responseContent);
HttpContext.Current.Response.End();
break;
}
}
SendWelComeMsg(requestXML);//關(guān)注時(shí)返回的圖文消息
///
/// 發(fā)送關(guān)注時(shí)的圖文消息
///
///
private void SendWelComeMsg(RequestXML requestXML)
{
String responseContent = String.Empty;
string newdate = DateTime.Now.Subtract(new DateTime(1970, 1, 1, 8, 0, 0)).TotalSeconds.ToString();
string PUrlfileName = "http://www.deqiaohr.com.cn/weixin/welcome.jpg";
responseContent = string.Format(Message_News_Main, requestXML.FromUserName, requestXML.ToUserName, newdate, "1",
string.Format(Message_News_Item, "歡迎關(guān)注德橋員工服務(wù)中心", "蘇州德橋人力資源創(chuàng)立于2002年...", PUrlfileName, "http://www.deqiaohr.com.cn/weixin/WxGsjianjie.aspx"));
HttpContext.Current.Response.ContentType = "text/xml";
HttpContext.Current.Response.ContentEncoding = Encoding.UTF8;
HttpContext.Current.Response.Write(responseContent);
HttpContext.Current.Response.End();
}
Message_News_Main 和Message_News_Item是圖文消息格式化
///
/// 返回圖文消息主體
///
public static string Message_News_Main
{
get
{
return @"
{4}
}
}
///
/// 返回圖文消息項(xiàng)
///
public static string Message_News_Item
{
get
{
return @"
}
}
///
/// 發(fā)送響應(yīng)語音識別結(jié)果
///
///
private void SendVoiceMsg(RequestXML requestXML)
{
string responseContent = FormatTextXML(requestXML.FromUserName, requestXML.ToUserName, "您剛才說的語音消息識別結(jié)果為:" + requestXML.Recognition.ToString());
HttpContext.Current.Response.ContentType = "text/xml";
HttpContext.Current.Response.ContentEncoding = Encoding.UTF8;
HttpContext.Current.Response.Write(responseContent);
HttpContext.Current.Response.End();
}
點(diǎn)擊查看全文,直接跳轉(zhuǎn)至自己寫的網(wǎng)頁,關(guān)于網(wǎng)頁圖片自適應(yīng)的問題,把圖片的寬度設(shè)置為100%,即可,如果讓網(wǎng)頁在屏幕中自適應(yīng),記得在網(wǎng)頁中一定要添加
關(guān)于“asp.net微信開發(fā)消息應(yīng)答方法的示例”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯(cuò),請把它分享出去讓更多的人看到。