微信API開發引擎|微信API|ASP.NET微信接口
采用C#語言開發的微信API引擎,內部,有基于事件驅動的微信接收回復處理模塊。為C#開發微信接口,提供一種簡單的引擎。功能還在進一步完善中,歡迎大家多多提供寶貴意見,另外也可以在此基礎上進行開發。
接收微信消息處理程序
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using WeiNet.API.Event;
using WeiNet.API.entity;
/=============================================================
版 本:WeiNet V1.0
作 者:李朝強
說 明:接收消息的一般處理程序基類,完全基于事件驅動
時 間:2014/05/11
===========================================================/
namespace WeiNet.API.driver
{
/// <summary>
///
/// </summary>
public class RecieveBase : IHttpHandler
{
#region 日志
/// <summary>
///日志
/// </summary>
protected readonly log4net.ILog logger = log4net.LogManager.GetLogger(typeof(RecieveBase));
#endregion
#region 事件
/// <summary>
/// 當接收到文字信息時
/// </summary>
protected event OnRecieveEventHandler OnRecieveText;
/// <summary>
/// 接收圖片事件
/// </summary>
protected event OnRecieveEventHandler OnReciveImage;
/// <summary>
/// 接收音頻
/// </summary>
protected event OnRecieveEventHandler OnReciveVoice;
/// <summary>
/// 接收視頻
/// </summary>
protected event OnRecieveEventHandler OnRecieveVideo;
/// <summary>
///地理位置消息
/// </summary>
protected event OnRecieveEventHandler OnRecieveLocation;
/// <summary>
/// 鏈接消息
/// </summary>
protected event OnRecieveEventHandler OnRecieveLink;
/// <summary>
/// 事件消息
/// </summary>
protected event OnRecieveEventHandler OnRecieveEvent;
/// <summary>
/// 激活微信公眾賬號,驗證簽名
/// </summary>
protected event OnActiveEventHandler OnActive;
/// <summary>
/// 關注事件
/// </summary>
protected event OnCustomEvent OnSubscribe;
/// <summary>
/// 取消訂閱
/// </summary>
protected event OnCustomEvent OnUnsubscribe;
/// <summary>
/// 用戶已關注時的事件推送
/// </summary>
protected event OnCustomEvent OnScanSubscribe;
/// <summary>
/// 上報地理位置事件
/// </summary>
protected event OnCustomEvent OnLocation;
/// <summary>
///點擊菜單跳轉鏈接時的事件推送
/// </summary>
protected event OnCustomEvent OnCustomViewEvent;
/// <summary>
///點擊菜單拉取消息時的事件推送
/// </summary>
protected event OnCustomEvent OnCustomClickEvent;
#endregion
#region 構造器
/// <summary>
/// 構造器
/// </summary>
public RecieveBase()
{
}
#endregion
#region 是否可以重用
/// <summary>
/// 是否可以重用
/// </summary>
public bool IsReusable
{
get { return false; }
}
#endregion
#region 處理請求
/// <summary>
/// 處理請求
/// </summary>
/// <param name="context"></param>
public void ProcessRequest(HttpContext context)
{
//1>授權
if (context.Request.HttpMethod.ToUpper() == "GET"
&& !string.IsNullOrEmpty(context.Request["echostr"]))
{
WeiActiveEventArgs eActiveArgs = new WeiActiveEventArgs();
eActiveArgs.Context = context;
On_ActiveEvent(eActiveArgs);
}
//2>處理POST請求
if (context.Request.HttpMethod.ToUpper() == "POST")
{
//事件參數
WeiEventArgs e = new WeiEventArgs(context);
On_RecieveEvent(e);
On_RecieveImage(e);
On_RecieveLink(e);
On_RecieveLocation(e);
On_RecieveVideo(e);
On_RecieveVoice(e);
On_RecieveText(e);
}
}
#endregion
/**事件***/
#region 事件調用
/// <summary>
/// 當接收到文字信息時觸發事件
/// </summary>
/// <param name="e"></param>
protected virtual void On_RecieveText(WeiEventArgs e)
{
//接收信息處理句柄
if (OnRecieveText != null
&& e.MsgType == "text")
{
e.message = new textMessage(e.xml);
OnRecieveText(this, e);
}
}
/// <summary>
/// 當接收到圖片信息時觸發事件
/// </summary>
/// <param name="e"></param>
protected virtual void On_RecieveImage(WeiEventArgs e)
{
//接收信息處理句柄
if (OnReciveImage != null
&& e.MsgType == "image")
{
e.message = new imageMessage(e.xml);
OnReciveImage(this, e);
}
}
/// <summary>
/// 當接收音頻消息時觸發事件
/// </summary>
/// <param name="e"></param>
protected virtual void On_RecieveVoice(WeiEventArgs e)
{
if (OnReciveVoice != null
&& e.MsgType == "voice")
{
e.message = new voiceMessage(e.xml);
OnReciveVoice(this, e);
}
}
/// <summary>
/// 當接收視頻消息時觸發事件
/// </summary>
/// <param name="e"></param>
protected virtual void On_RecieveVideo(WeiEventArgs e)
{
if (OnRecieveVideo != null
&& e.MsgType == "video")
{
e.message = new videoMessage(e.xml);
OnRecieveVideo(this, e);
}
}
/// <summary>
/// 接收地理位置消息
/// </summary>
/// <param name="e"></param>
protected virtual void On_RecieveLocation(WeiEventArgs e)
{
if (OnRecieveLocation != null
&& e.MsgType == "location")
{
e.message = new locationMessage(e.xml);
OnRecieveLocation(this, e);
}
}
/// <summary>
/// 接收鏈接消息
/// </summary>
/// <param name="e"></param>
protected virtual void On_RecieveLink(WeiEventArgs e)
{
if (OnRecieveLink != null
&& e.MsgType == "link")
{
e.message = new linkMessage(e.xml);
OnRecieveLink(this, e);
}
}
/// <summary>
/// 事件消息
/// </summary>
/// <param name="e"></param>
protected virtual void On_RecieveEvent(WeiEventArgs e)
{
if (OnRecieveEvent != null
&& e.MsgType == "event")
{
//1、事件消息參數
WeiEventMsgArgs eventArgs = new WeiEventMsgArgs(e.xml);
On_ScanSubscribe(eventArgs);
On_Subscribe(eventArgs);
On_Unsubscribe(eventArgs);
On_Location(eventArgs);
On_CustomClickEvent(eventArgs);
On_CustomViewEvent(eventArgs);
//2、處理事件
e.message = e.message ?? new messageBase(e.xml);
OnRecieveEvent(this, e);
}
}
/// <summary>
/// 驗證微信平臺簽名事件
/// </summary>
/// <param name="e"></param>
protected virtual void On_ActiveEvent(WeiActiveEventArgs e)
{
if (OnActive != null)
{
OnActive(this, e);
}
}
/// <summary>
/// 關注事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected virtual void On_Subscribe(WeiEventMsgArgs e)
{
if (null != OnSubscribe
&& e.Event == "subscribe")
{
e.message = new entity.Event.subscribe(e.xml);
OnSubscribe(this, e);
}
}
/// <summary>
/// 取消訂閱
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected virtual void On_Unsubscribe(WeiEventMsgArgs e)
{
if (null != OnUnsubscribe
&& e.Event == "unsubscribe")
{
e.message = new entity.Event.subscribe(e.xml);
OnUnsubscribe(this, e);
}
}
/// <summary>
/// 用戶已關注時的事件推送
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected virtual void On_ScanSubscribe(WeiEventMsgArgs e)
{
if (null != OnScanSubscribe
&& e.Event == "SCAN")
{
e.message = new entity.Event.subscribe(e.xml);
OnScanSubscribe(this, e);
}
}
/// <summary>
/// 上報地理位置事件
/// 說明:用戶同意上報地理位置后,每次進入公眾號會話時,都會在進入時上報地理位置,或在進入會話后每5秒上報一次地理位置,
/// 公眾號可以在公眾平臺網站中修改以上設置。上報地理位置時,微信會將上報地理位置事件推送到開發者填寫的URL。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected virtual void On_Location(WeiEventMsgArgs e)
{
if (null != OnLocation
&& e.Event == "LOCATION")
{
e.message = new entity.Event.location(e.xml);
OnLocation(this, e);
}
}
/// <summary>
/// 點擊菜單拉取消息時的事件推送
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected virtual void On_CustomClickEvent(WeiEventMsgArgs e)
{
if (null != OnCustomClickEvent
&& e.Event == "CLICK")
{
e.message = new entity.Event.click(e.xml);
OnCustomClickEvent(this, e);
}
}
/// <summary>
/// 點擊菜單跳轉鏈接時的事件推送
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected virtual void On_CustomViewEvent(WeiEventMsgArgs e)
{
if (null != OnCustomViewEvent
&& e.Event == "VIEW")
{
e.message = new entity.Event.view(e.xml);
OnCustomViewEvent(this, e);
}
}
#endregion
}
}
[C#]實例:
using System;using System.Collections.Generic;
using System.Linq;
using System.Web;
using WeiNet.API.entity;
using WeiNet.API.Event;
namespace WeiNet.api
{
/// <summary>
/// WeiRecieve 的摘要說明
/// </summary>
public class WeiRecieve : WeiNet.API.driver.RecieveBase
{
#region 構造器
/// <summary>
/// 構造器
/// </summary>
public WeiRecieve()
{
//綁定事件
OnActive += new API.Event.OnActiveEventHandler(WeiOnActiveEvent);
OnRecieveEvent += new API.Event.OnRecieveEventHandler(WeiOnRecieveEvent);
OnRecieveLink += new API.Event.OnRecieveEventHandler(WeiOnRecieveLink);
OnRecieveLocation += new API.Event.OnRecieveEventHandler(WeiOnRecieveLink);
OnRecieveText += new API.Event.OnRecieveEventHandler(WeiOnRecieveText);
OnRecieveVideo += new API.Event.OnRecieveEventHandler(WeiOnRecieveVideo);
OnReciveImage += new API.Event.OnRecieveEventHandler(WeiOnRecieveImage);
OnReciveVoice += new API.Event.OnRecieveEventHandler(WeiOnRecieveVoice);
//事件消息
OnScanSubscribe += new API.Event.OnCustomEvent(WeiOnScanSubscribe);
OnSubscribe += new API.Event.OnCustomEvent(WeiOnSubscribe);
OnUnsubscribe += new API.Event.OnCustomEvent(WeiOnUnsubscribe);
OnCustomClickEvent += new API.Event.OnCustomEvent(WeiOnCustomClickEvent);
OnCustomViewEvent += new API.Event.OnCustomEvent(WeiOnCustomViewEvent);
}
#endregion
/// <summary>
///驗證簽名,綁定公眾賬號
/// </summary>
/// <param name="e"></param>
protected void WeiOnActiveEvent(object sender, API.Event.WeiActiveEventArgs e)
{
HttpContext context = e.Context;
//1. 將token、timestamp、nonce三個參數進行字典序排序
//2. 將三個參數字符串拼接成一個字符串進行sha1加密
//3. 開發者獲得加密后的字符串可與signature對比,標識該請求來源于微信
Dictionary<string, string> dictQuery = new Dictionary<string, string>();
dictQuery["token"] = WeiNet.API.consts.CONSTS.TOKEN;
dictQuery["timestamp"] = context.Request["timestamp"];
dictQuery["nonce"] = context.Request["nonce"];
dictQuery.Reverse();
string strEchostr = context.Request["echostr"];
logger.Info("請求Url:" + context.Request.Url.ToString());
//驗證簽名
if (!WeiNet.API.auth.authUtil.CheckSignature(dictQuery, context.Request["signature"]))
{
logger.Info(strEchostr + "驗證失敗");
//驗證失敗
context.Response.Write("error:600002");
return;
}
else
{
logger.Info("請求echostr:" + strEchostr);
context.Response.Write(strEchostr);
}
}
/// <summary>
///接收到文字信息
/// </summary>
/// <param name="e"></param>
protected void WeiOnRecieveText(object sender, API.Event.WeiEventArgs e)
{
Reply(e);
}
/// <summary>
/// 接收圖片信息
/// </summary>
/// <param name="e"></param>
protected void WeiOnRecieveImage(object sender, API.Event.WeiEventArgs e)
{
Reply(e);
}
/// <summary>
/// 接收鏈接消息
/// </summary>
/// <param name="e"></param>
protected void WeiOnRecieveLink(object sender, API.Event.WeiEventArgs e)
{
Reply(e);
}
/// <summary>
/// 接收音頻消息
/// </summary>
/// <param name="e"></param>
protected void WeiOnRecieveVoice(object sender, API.Event.WeiEventArgs e)
{
Reply(e);
}
/// <summary>
/// 接收視頻消息
/// </summary>
/// <param name="e"></param>
protected void WeiOnRecieveVideo(object sender, API.Event.WeiEventArgs e)
{
Reply(e);
}
/// <summary>
/// 接收事件消息
/// </summary>
/// <param name="e"></param>
protected void WeiOnRecieveEvent(object sender, API.Event.WeiEventArgs e)
{
if DEBUG
logger.Info(string.Format("事件:接收事件消息,用戶OpenID:{0},公眾微信號:{1}", e.message.FromUserName, e.message.ToUserName));
endif
//假如服務器無法保證在五秒內處理并回復,可以直接回復空串,微信服務器不會對此作任何處理,并且不會發起重試。
HttpContext.Current.Response.Write("");
}
/// <summary>
/// 接收地理位置信息
/// </summary>
/// <param name="e"></param>
protected void WeiOnRecieveLocation(object sender, API.Event.WeiEventArgs e)
{
if DEBUG
logger.Info("接收地理位置信息");
endif
}
/// <summary>
/// 關注事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void WeiOnSubscribe(object sender, API.Event.WeiEventMsgArgs e)
{
if DEBUG
logger.Info(string.Format("事件:關注事件,用戶OpenID:{0},公眾微信號:{1}", e.message.FromUserName, e.message.ToUserName));
endif
//假如服務器無法保證在五秒內處理并回復,可以直接回復空串,微信服務器不會對此作任何處理,并且不會發起重試。
//HttpContext.Current.Response.Write("");
//Reply(e);
ReplyArticle(e);
}
/// <summary>
/// 取消訂閱事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void WeiOnUnsubscribe(object sender, API.Event.WeiEventMsgArgs e)
{
if DEBUG
logger.Info(string.Format("事件:取消訂閱事件,用戶OpenID:{0},公眾微信號:{1}", e.message.FromUserName, e.message.ToUserName));
endif
//假如服務器無法保證在五秒內處理并回復,可以直接回復空串,微信服務器不會對此作任何處理,并且不會發起重試。
//HttpContext.Current.Response.Write("");
Reply(e);
}
/// <summary>
/// 掃描:用戶已關注時的事件推送
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void WeiOnScanSubscribe(object sender, API.Event.WeiEventMsgArgs e)
{
if DEBUG
logger.Info(string.Format("事件:用戶已關注時的事件推送,用戶OpenID:{0},公眾微信號:{1}", e.message.FromUserName, e.message.ToUserName));
endif
//假如服務器無法保證在五秒內處理并回復,可以直接回復空串,微信服務器不會對此作任何處理,并且不會發起重試。
HttpContext.Current.Response.Write("");
}
/// <summary>
/// 上報地理位置事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void WeiOnLocation(object sender, API.Event.WeiEventMsgArgs e)
{
if DEBUG
logger.Info(string.Format("事件:上報地理位置事件,用戶OpenID:{0},公眾微信號:{1}", e.message.FromUserName, e.message.ToUserName));
endif
//假如服務器無法保證在五秒內處理并回復,可以直接回復空串,微信服務器不會對此作任何處理,并且不會發起重試。
HttpContext.Current.Response.Write("");
}
/// <summary>
/// 自定義事件:點擊菜單拉取消息時的事件推送
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void WeiOnCustomClickEvent(object sender, API.Event.WeiEventMsgArgs e)
{
if DEBUG
logger.Info(string.Format("事件:點擊菜單拉取消息時的事件推送,用戶OpenID:{0},公眾微信號:{1}", e.message.FromUserName, e.message.ToUserName));
endif
//假如服務器無法保證在五秒內處理并回復,可以直接回復空串,微信服務器不會對此作任何處理,并且不會發起重試。
HttpContext.Current.Response.Write("");
}
/// <summary>
/// 自定義事件:點擊菜單跳轉鏈接時的事件推送
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void WeiOnCustomViewEvent(object sender, API.Event.WeiEventMsgArgs e)
{
if DEBUG
logger.Info(string.Format("事件:點擊菜單跳轉鏈接時的事件推送,用戶OpenID:{0},公眾微信號:{1}", e.message.FromUserName, e.message.ToUserName));
endif
//假如服務器無法保證在五秒內處理并回復,可以直接回復空串,微信服務器不會對此作任何處理,并且不會發起重試。
HttpContext.Current.Response.Write("");
}
/// <summary>
/// 測試:回復文本
/// </summary>
/// <param name="e"></param>
private static void Reply(WeiEventArgs e)
{
//實例化一個文本消息實體
textMessage message = new textMessage();
message.FromUserName = e.message.ToUserName;//開發者微信號
message.ToUserName = e.message.FromUserName;//接收方帳號(收到的OpenID)
message.Content = "鄭州眾遠信息科技有限公司,歡迎你!!!";
//回復文本消息
WeiNet.API.message.Reply.WeiReply(message);
}
/// <summary>
/// 測試:回復圖文列表
/// </summary>
/// <param name="e"></param>
private static void ReplyArticle(WeiEventArgs e)
{
List<WeiNet.API.entity.article> list = new List<article>();
//聲明文章列表
WeiNet.API.entity.article article = new article();
article.Title = "鄭州眾遠信息技術有限公司";
article.Description = "鄭州眾遠信息技術有限公司";
article.PicUrl = string.Empty;
article.Url = "
list.Add(article);
WeiNet.API.entity.article article2 = new article();
article2.Title = "關于我們團隊";
article2.Description = "關于我們團隊";
article2.PicUrl = string.Empty;
article2.Url = "
list.Add(article2);
WeiNet.API.entity.article article3 = new article();
article3.Title = "精彩案例";
article3.Description = "精彩案例";
article3.PicUrl = string.Empty;
article3.Url = "
list.Add(article3);
WeiNet.API.entity.article article4 = new article();
article4.Title = "服務內容";
article4.Description = "服務內容";
article4.PicUrl = string.Empty;
article4.Url = "
list.Add(article4);
WeiNet.API.entity.article article5 = new article();
article5.Title = "最新動態";
article5.Description = "最新動態";
article5.PicUrl = string.Empty;
article5.Url = "
list.Add(article5);
WeiNet.API.message.Reply.WeiReply(e.message.FromUserName,
e.message.ToUserName,
list);
}
}
}
實體關系圖