微信API開發引擎|微信API|ASP.NET微信接口

李朝強 10年前發布 | 51K 次閱讀 微信API .NET開發 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);
        }
    }
}

實體關系圖


模擬微信服務器請求:

 本文由用戶 李朝強 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!