微信公众平台-接收消息与发送被动消息

接收消息代码如下(包含回复消息调用):

    /// <summary>
    /// 接收用户消息
    /// iftrue
    /// 2014-07-08
    /// </summary>
    public class Receive
    {
        public delegate Models.Send_Msg delegate_SendMsg(string msgType);
        public delegate void delegate_RececiveHandler(Models.Receive_Msg model,ref string msg);

        /// <summary>
        /// 获取消息对象并且回复消息(需要根据MsgType强制转换成需要的实体类)
        /// </summary>
        /// <param name="context">上下文</param>
        /// <param name="getSendMsg">获取回复消息的方法</param>   
        /// <param name="receiveHandler">处理接收消息的方法(如:持久化数据库)</param>
        /// <param name="msg">错误信息</param>
        /// <returns></returns>
        public Models.Receive_Msg GetReceiveMsgAndReply(HttpContext context, delegate_SendMsg getSendMsg,delegate_RececiveHandler receiveHandler, ref string msg)
        {
            if (context == null)
                return null;
            try
            {
                string _xml = new HttpHelper().PostInput(context.Request);
                if (string.IsNullOrEmpty(_xml))
                    return null;
                XmlDocument doc = new XmlDocument();
                doc.LoadXml(_xml);
                XmlElement element = doc.DocumentElement;
                Models.Receive_Msg model = GetReceiveModel(element);
                //发送被动响应消息
                Models.Send_Msg sendModel = getSendMsg(model.MsgType);
                if (sendModel != null)
                {
                    sendModel.ToUserName = model.FromUserName;
                    sendModel.FromUserName = model.ToUserName;
                    Send send = new Send();
                    string strSend = send.Send_Msg<Models.Send_Msg>(sendModel, ref msg);
                    if (!string.IsNullOrEmpty(strSend))
                    {
                        context.Response.Output.Write(strSend);
                    }
                }
                //调用消息处理方法
                try
                {
                    receiveHandler(model, ref msg);
                }
                catch (Exception ex)
                {
                    msg = "receiveHandler异常:" + ex.Message;
                }
                return model;
            }
            catch (Exception ex)
            {
                msg = ex.Message;
                return null;
            }
        }

        /// <summary>
        /// 获取消息对象直接回复空串(需要根据MsgType强制转换成需要的实体类)
        /// </summary>
        /// <param name="context">上下文</param>
        /// <param name="getSendMsg">获取回复消息的方法</param>   
        /// <param name="receiveHandler">处理接收消息的方法(如:持久化数据库)</param>
        /// <param name="msg">错误信息</param>
        /// <returns></returns>
        public Models.Receive_Msg GetReceiveMsg(HttpContext context, delegate_RececiveHandler receiveHandler, ref string msg)
        {
            if (context == null)
                return null;
            try
            {
                //直接回复空串,避免腾讯重复发送
                context.Response.Output.Write("");
                string _xml = new HttpHelper().PostInput(context.Request);
                if (string.IsNullOrEmpty(_xml))
                    return null;
                XmlDocument doc = new XmlDocument();
                doc.LoadXml(_xml);
                XmlElement element = doc.DocumentElement;
                Models.Receive_Msg model = GetReceiveModel(element);

                //调用消息处理方法
                try
                {
                    receiveHandler(model, ref msg);
                }
                catch (Exception ex)
                {
                    msg = "receiveHandler异常:" + ex.Message;
                }
                return model;
            }
            catch (Exception ex)
            {
                msg = ex.Message;
                return null;
            }
        }

        /// <summary>
        /// 解析XML,转换为实体
        /// </summary>
        /// <param name="element"></param>
        /// <returns></returns>
        private Models.Receive_Msg GetReceiveModel(XmlElement element)
        {
            Models.Receive_Msg model = null;
            string msgType = element.SelectSingleNode("MsgType").InnerText;
            switch (msgType)
            {
                case MsgType.text: model = new Models.Receive_Text(); break;
                case MsgType.image: model = new Models.Receive_Image(); break;
                case MsgType.voice: model = new Models.Receive_Voice(); break;
                case MsgType.video: model = new Models.Receive_Video(); break;
                case MsgType.location: model = new Models.Receive_Location(); break;
                case MsgType.link: model = new Models.Receive_Link(); break;
                case MsgType.events: model = GetEventModel(element.SelectSingleNode("Event").InnerText, element.SelectSingleNode("EventKey") == null ? "" : element.SelectSingleNode("EventKey").InnerText); break;
            }
            try
            {
                foreach (System.Reflection.PropertyInfo p in model.GetType().GetProperties())
                {
                    if (p.Name != "Xml")
                    {
                        p.SetValue(model, element.SelectSingleNode(p.Name).InnerText, null);
                    }
                    else
                    {
                        p.SetValue(model, element.OuterXml, null);
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return model;
        }

        /// <summary>
        /// 获取事件对象
        /// </summary>
        /// <param name="evt">事件类型</param>
        /// <param name="eventKey">事件KEY值</param>
        /// <returns></returns>
        private Models.Receive_Msg GetEventModel(string evt, string eventKey)
        {
            Models.Receive_Msg model = null;
            switch (evt)
            {
                case Event.subscribe:
                    if (string.IsNullOrEmpty(eventKey))
                    {
                        model = new Models.Receive_Event();
                    }
                    else
                    {
                        model = new Models.Receive_Event_Scan();
                    }
                    break;
                case Event.unsubscribe:
                    model = new Models.Receive_Event();
                    break;
                case Event.scan:
                    model = new Models.Receive_Event_Scan();
                    break;
                case Event.location:
                    model = new Models.Receive_Event_Location();
                    break;
                case Event.click:
                    model = new Models.Receive_Event_Click();
                    break;
                case Event.view:
                    model = new Models.Receive_Event_View();
                    break;
            }
            return model;
        }
    }

发送消息代码:

 
    /// <summary>
    /// 发送微信
    /// 2014-07-15
    /// iftrue
    /// </summary>
    public class Send
    {
        public string Send_Msg<T>(T t, ref string msg)
        {
            if (t == null)
                return "";
            StringBuilder strB = new StringBuilder();
            strB.Append("<xml>");
            foreach (System.Reflection.PropertyInfo p in t.GetType().GetProperties())
            {
                strB.Append(string.Format("<{0}>{1}</{0}>", p.Name, p.GetValue(t, null).ToString()));
            }
            strB.Append("</xml>");
            return strB.ToString();
        }
    }

初始化参数代码:

/// <summary>
    /// 初始化参数
    /// 2014-07-03
    /// iftrue
    /// </summary>
    public class Init
    {
        /// <summary>
        /// 微信公众平台-开发者中心-服务器配置 中的Token
        /// </summary>
        public static string Token;

        /// <summary>
        /// 静态构造
        /// </summary>
        static Init()
        {
            string _token = ConfigurationManager.AppSettings["weixin_token"];
            if (!string.IsNullOrEmpty(_token))
                Token = _token;
        }
    }

    /// <summary>
    /// 消息类型
    /// </summary>
    public class MsgType
    {
       public const string text="text";
       public const string image = "image";
       public const string voice = "voice";
       public const string video = "video";
       public const string location = "location";
       public const string link = "link";
       public const string events = "event";
    }

    /// <summary>
    /// 事件类型
    /// </summary>
    public class Event
    {
        public const string subscribe = "subscribe";
        public const string unsubscribe = "unsubscribe";
        public const string scan = "SCAN";
        public const string location = "LOCATION";
        public const string click = "CLICK";
        public const string view = "VIEW";

    }

代码中还使用到实体类,为方便修改,使用了T4模板。

原码下载:微信公众平台接收(回复)消息C#版

### 使用 EasyWeChat 实现微信公众号消息发送接收 #### 安装 EasyWeChat 库 为了使用 EasyWeChat 进行开发,首先需要通过 Composer 来安装该库。 ```bash composer require overtrue/wechat ``` 这一步骤确保了项目中有必要的依赖项来操作微信公众平台 API[^2]。 #### 配置公众号信息 在项目的配置文件中加入微信公众平台的相关参数设置: ```php return [ 'app_id' => env('WECHAT_APP_ID', ''), 'secret' => env('WECHAT_SECRET', ''), 'token' => env('WECHAT_TOKEN', ''), ]; ``` 这些配置项通常是从环境变量读取而来,以便于管理和安全考虑[^3]。 #### 初始化 EasyWeChat 对象 创建一个新的服务提供者或者直接在控制器里初始化 `Application` 类实例: ```php use EasyWeChat\Factory; $app = Factory::officialAccount(config('wechat')); $server = $app->server; ``` 这段代码片段展示了如何利用 Laravel 的配置管理器加载微信账号的信息,并构建了一个用于处理请求的服务端对象。 #### 处理接收到的消息 定义一个方法用来监听来自用户的输入并作出响应。可以采用闭包函数的形式快速实现简单的回复逻辑: ```php $response = $server->setMessageHandler(function($message){ switch ($message['MsgType']) { case 'event': if ($message['Event'] === 'subscribe') { // 用户订阅事件 return "欢迎关注我们的公众号!"; } break; default: return "感谢您的留言,我们会尽快回复您."; } }); ``` 此部分实现了对接收到的不同类型消息(如订阅事件)做出不同回应的功能[^1]。 #### 发送主动消息给用户 除了被动等待用户发起对话外,还可以根据特定条件向已授权的联系人发送通知或其他形式的内容。下面是一个例子说明怎样调用 API 向某个 OpenID 所代表的人发送一条文本信息: ```php $app->customer_service->message('您好!')->to('OPENID')->send(); ``` 这里假设已经获取到了目标用户的唯一标识符 OPENID 并且具有相应的权限去执行此类动作。 #### 错误处理机制 考虑到网络波动等因素可能导致的操作失败,在实际部署前应当增加异常捕获措施以增强系统的健壮性: ```php try { // 尝试发送消息... } catch (\Exception $e) { Log::error("Failed to send message: {$e->getMessage()}"); } ``` 上述做法有助于记录下任何可能发生的错误日志,便于后续排查问题所在。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值