internal bool Send(string access_token, string no, string room, string seatno, string time1, string time2)
        {
            WeChatMessage wcm = new WeChatMessage();
            Dictionary <string, string> title = new Dictionary <string, string>();

            title.Add("touser", "oeWZDvymOiKK1FZT8d54seRnQbYw");
            title.Add("template_id", "g0QUjurQbbjVMqHyVGHUXrXqF0NM7o1V2R_3FH-ORmE");
            title.Add("topcolor", "#FF0000");
            Dictionary <string, string> data = new Dictionary <string, string>();

            data.Add("first", no + "\n");
            data.Add("keyword1", room + "\n");
            data.Add("keyword2", seatno + "\n");
            data.Add("keyword3", time1 + "\n");
            data.Add("keyword4", time2 + "\n");
            string res = wcm.SendMessage(access_token, "https://api.weixin.qq.com/cgi-bin/message/template/send", Method.POST, title, data);

            if (res.ToLower() == "ok")
            {
                return(true);
            }
            else
            {
                return(false);
            }
        }
        private static async Task <bool> MessageSend(List <WeChatMessage> MessagesList)
        {
            SharedManager SM = new SharedManager();

            foreach (WeChatMessage messageItem in MessagesList)
            {
                WeChatMessage objper = new WeChatMessage();
                objper.touser = messageItem.touser; //要发送微信的人员姓名
                objper.text   = messageItem.text;   //要发送的微信内容
                objper.safe   = 0;
                try
                {
                    string        postData = JsonConvert.SerializeObject(objper);
                    string        result   = SM.PostUrl(WeChatConfig.WeChatUrl, postData);
                    List <string> objwx    = JsonHelper.GetJson(result);
                    if (Convert.ToInt32(objwx[1]) != 0)
                    {
                        break;
                    }
                }
                catch (Exception ex)
                {
                    return(false);
                }
            }
            return(true);
        }
예제 #3
0
        internal static void DrawItem(WeChatMessage msg, ViewHolder holder, Graphics g)
        {
            string path   = msg.fileName;
            bool   IsSend = msg.IsSend;

            if (!File.Exists(path))
            {
                TextHolder.DrawItem("获取图片失败", holder, g);
                return;
            }
            Image     image = Image.FromFile(path);
            Point     point = holder.bounds.Location;
            Rectangle rec   = new Rectangle();

            rec.Width  = image.Width;
            rec.Height = image.Height;
            rec.Y      = point.Y + 10;
            if (IsSend)
            {
                rec.X = holder.bounds.Width - 95 - rec.Width;
            }
            else
            {
                rec.X = 70;
            }
            g.DrawImage(image, rec, new Rectangle(0, 0, image.Width, image.Height), GraphicsUnit.Pixel);
            holder.bounds.Height = rec.Height + 10;
            image.Dispose();
        }
예제 #4
0
 public bool AddWeChat(WeChatMessage message, Action <WeChatMessage> callback)
 {
     if (DateTime.Compare(message.date, nowTime) < 0)
     {
         Lucky.LuckyUtils.Log("error " + message.date);
         return(false);
     }
     else
     {
         if (waitingWeChat.ContainsKey(message.date))
         {
             List <MessageParam <WeChatMessage> > list;
             waitingWeChat.TryGetValue(message.date, out list);
             if (list != null)
             {
                 list.Add(new MessageParam <WeChatMessage>(message, callback));
             }
         }
         else
         {
             List <MessageParam <WeChatMessage> > list = new List <MessageParam <WeChatMessage> >();
             list.Add(new MessageParam <WeChatMessage>(message, callback));
             waitingWeChat.Add(message.date, list);
         }
         return(true);
     }
 }
예제 #5
0
 protected override void UpdateView()
 {
     if (m_Data != null)
     {
         Type classtype = m_Data.GetType();
         if (classtype == typeof(NewMessage))
         {
             NewMessage tdata = m_Data as NewMessage;
             SetData(tdata);
         }
         else if (classtype == typeof(WeChatMessage))
         {
             Lucky.LuckyUtils.Log("we chat message get");
             WeChatMessage tdata = m_Data as WeChatMessage;
             SetData(tdata);
         }
         else if (classtype == typeof(Accident))
         {
             Accident tdata = m_Data as Accident;
             SetData(tdata);
         }
         else if (classtype == typeof(ItemMessage))
         {
             ItemMessage tdata = m_Data as ItemMessage;
             SetData(tdata);
         }
     }
     base.UpdateView();
 }
예제 #6
0
        internal static void DrawItem(WeChatMessage msg, ViewHolder holder, Graphics g, Control owner)
        {
            if (holder.isMouseClick)
            {
                bounds = holder.bounds;
            }
            VoiceHolder.owner = owner;
            float Duration = msg.VoiceLength / 1000;//长度

            holder.UserData = msg;
            bool IsSend = msg.IsSend;

            //if (IsSend)
            //{
            //    animatedImage = Resources.img_play_voice;
            //}
            //else
            //{
            //    animatedImage = Resources.img_play_voice_mime;
            //}

            g.SmoothingMode = SmoothingMode.AntiAlias;
            Rectangle point = holder.bounds;

            Point[] points = TextHolder.GetPolygon(point, IsSend);
            int     Width  = 100;

            using (SolidBrush brushes = new SolidBrush(TriangleColor))
            {
                g.FillPolygon(brushes, points);

                Rectangle rect = Rectangle.Empty;
                if (IsSend)
                {
                    rect = new Rectangle(holder.bounds.Width - 95 - Width, point.Y + 10, Width + 15, Height + 15);
                }
                else
                {
                    rect = new Rectangle(70, point.Y + 10, Width + 15, Height + 15);
                }
                GraphicsUtils.FillRoundRectangle(g, brushes, rect, 4);
                ImageAnimator.UpdateFrames();
                g.DrawImage(animatedImage, rect.Location.X + Width / 2, rect.Location.Y + 7);

                brushes.Color = Color.FromArgb(153, 153, 153);
                if (IsSend)
                {
                    g.DrawString(Duration + "\"", font, brushes, holder.bounds.X + rect.Location.X - 40, rect.Location.Y + 20);
                }
                else
                {
                    g.DrawString(Duration + "\"", font, brushes, rect.Location.X + Width + 30, rect.Location.Y + 20);
                }
            }

            holder.bounds.Height = Height + 20;
            g.SmoothingMode      = SmoothingMode.None;
        }
예제 #7
0
        internal static void DrawItem(string message, ViewHolder holder, Graphics g)
        {
            WeChatMessage msg = new WeChatMessage()
            {
                Content = message
            };

            DrawItem(msg, holder, g);
        }
예제 #8
0
        private WeChatMessage JObjectToMessage(JToken jObject)
        {
            WeChatMessage message = jObject.ToObject <WeChatMessage>();

            //message.Content = message.MsgType == 1 ? message.Content : "请在其他设备上查看消息";//只接受文本消息
            message.CreateDateTime = message.CreateTime.ToTime();
            message.ShortTime      = message.CreateDateTime.ToString("HH:mm");
            message.IsReceive      = message.ToUserName == WeChatUser.UserName;
            return(message);
        }
예제 #9
0
            public string Execute(WeChatMessage message)
            {
                var    myDomain = "https://www.netnr.com";//请更改成你的域名
                string myPic    = myDomain + "/favicon.ico";

                var mb         = message.Body;
                var openId     = mb.GetText("FromUserName");
                var myUserName = mb.GetText("ToUserName");

                var news = new WeChatNews
                {
                    title       = "NET牛人(Gist,Run,Doc,Draw)",
                    description = "NET牛人,技术分享博客、代码片段、在线运行代码、接口文档、绘制 等等",
                    picurl      = myPic,
                    url         = myDomain
                };

                //默认首页
                string result = ReplayPassiveMessage.RepayNews(openId, myUserName, news);

                switch (message.Type)
                {
                //文字消息
                case WeChatMessageType.Text:
                {
                    string Content = mb.GetText("Content");
                    string repmsg  = string.Empty;

                    if ("sj".Split(' ').ToList().Contains(Content))
                    {
                        repmsg = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                    }
                    else if ("xh".Split(' ').ToList().Contains(Content))
                    {
                        repmsg = "笑话\nhttps://ss.netnr.com/qiushibaike";
                    }
                    else if ("note".Split(' ').ToList().Contains(Content))
                    {
                        repmsg = "记事\n" + myDomain + "/tool/note";
                    }
                    else if ("cp lottery".Split(' ').ToList().Contains(Content))
                    {
                        repmsg = "彩票\nhttps://ss.netnr.com/lottery";
                    }

                    if (!string.IsNullOrWhiteSpace(repmsg))
                    {
                        result = ReplayPassiveMessage.RepayText(openId, myUserName, repmsg);
                    }
                }
                break;
                }
                return(result);
            }
예제 #10
0
    private void SetData(WeChatMessage tdata)
    {
        string path = "";

        switch (tdata.name)
        {
        case "妈妈":
            path = Sprites.mother;
            break;

        case "爸爸":
            path = Sprites.father;
            break;

        default:
            path = Sprites.sister;
            break;
        }
        image.sprite = SpriteManager.Instance.GetSprite(path);
        title.text   = tdata.name;
        maincontent  = tdata.content;
        if (maincontent.Length > num)
        {
            content.text = maincontent.Substring(0, num) + "...";
        }
        else
        {
            content.text = maincontent;
        }


        btn.onClick.RemoveAllListeners();
        if (tdata.callback == null)
        {
            btn.onClick.AddListener(delegate()
            {
                HideItem();
            });
            time.text = "现在";
        }
        else
        {
            btn.onClick.AddListener(delegate()
            {
                Lucky.LuckyUtils.Log("show");
                tdata.callback(tdata);
            });
            time.text = GetTime(tdata.date);
        }
    }
        public IWeChatMessage GetMessage(string data, IOfficialAccountService service)
        {
            if (string.IsNullOrWhiteSpace(data))
            {
                return(null);
            }

            WeChatMessage message = null;

            using (TextReader reader = new StringReader(data)) {
                message = (WeChatMessage)this.m_serializer.Deserialize(reader);
            }
            return(message);
        }
 /// <summary>
 /// 发送微信通知内容
 /// </summary>
 /// <param name="Names"></param>
 /// <param name="Content"></param>
 /// <returns></returns>
 public static async void SendWeChatMessage(List <string> Names, string Content)
 {
     try
     {
         List <WeChatMessage> WeChatMessagesList = new List <WeChatMessage>();
         WeChatMessage        weChatMessage;
         foreach (string name in Names)
         {
             weChatMessage        = new WeChatMessage();
             weChatMessage.touser = name;
             weChatMessage.text   = Content;
             WeChatMessagesList.Add(weChatMessage);
         }
         bool result = await MessageSend(WeChatMessagesList);
     }
     catch (Exception ex)
     {
     }
 }
예제 #13
0
        /// <summary>
        /// 发送文本消息
        /// </summary>
        /// <param name="msg"></param>
        private void SendTextMsg(string msg)
        {
            var selectedChat = ChatContentManager.SelectedChat;

            WeChatMessage weChatMessage = new WeChatMessage
            {
                Content        = msg,
                CreateDateTime = DateTime.Now,
                FromUserName   = WeChatUser.UserName,
                MsgType        = 1,
                ToUserName     = selectedChat.UserName,
                ShortTime      = DateTime.Now.ToString("HH:mm"),
                IsReceive      = false
            };

            ChatListManager.SyncMessage(weChatMessage);

            wcs.SendMsg(EmojiManager.ReplaceEmojiCode(msg), WeChatUser.UserName, selectedChat.UserName, 1);
        }
예제 #14
0
    public void WechatContentProcessor()
    {
        WeChatMessage message;
        DateTime time;
        int timeModifier;
        Lucky.LuckyUtils.Log("Diag count: "+diag.Count);
        foreach(WechatDialog item in diag)
        {
            string[] timetemp = item.time.Split(':');
            time = new DateTime(DateTime.Now.Year, 2, 4, int.Parse(timetemp[0]), int.Parse(timetemp[1]), 30);
            timeModifier = 0;
            Lucky.LuckyUtils.Log("Processing name: "+item.name+" Time "+time.ToShortTimeString());
            for(int i = 0; i < item.content.Count; i++)
            {
                message = new WeChatMessage(item.name, item.content[i], time.AddSeconds(timeModifier));
                timeModifier += item.content[i].Length / 2;
                WechatList.Add(message);
            }

        }
    }
예제 #15
0
        internal static void DrawItem(WeChatMessage msg, ViewHolder holder, Graphics g)
        {
            string content = msg.Content;
            bool   IsSend  = msg.IsSend;

            content = content.Replace("&lt;", "<").Replace("&gt;", ">");
            Size size = GraphicsUtils.GetStringWidth(content, g, font, 350);

            g.SmoothingMode = SmoothingMode.AntiAlias;
            Rectangle point = holder.bounds;

            Point[] points = GetPolygon(point, IsSend);
            using (SolidBrush brushes = new SolidBrush(TriangleColor))
            {
                g.FillPolygon(brushes, points);
                Rectangle rect = Rectangle.Empty;
                if (IsSend)
                {
                    rect = new Rectangle(holder.bounds.Width - 95 - size.Width, point.Y + 10, size.Width + 15, size.Height + 15);
                }
                else
                {
                    rect = new Rectangle(70, point.Y + 10, size.Width + 15, size.Height + 15);
                }
                GraphicsUtils.FillRoundRectangle(g, brushes, rect, 4);
                List <string> emojis = IsEmoji(content);
                if (emojis.Count > 0)
                {
                    DrawEmoji(g, content, emojis, rect);
                }
                else
                {
                    brushes.Color = TextColor;
                    g.DrawString(content, font, brushes, rect, StringFormat);
                }

                holder.bounds.Height = rect.Height + 20;
            }
            g.SmoothingMode = SmoothingMode.None;
        }
예제 #16
0
        /// <summary>
        /// 聊天记录点击事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void fListView1_ItemClick(object sender, WinForm.UI.Events.ItemClickEventArgs e)
        {
            WeChatMessage msg = e.ViewHolder.UserData as WeChatMessage;

            if (msg.MsgType == 3)//图片消息
            {
                string path = string.Empty;
                //TODO 获取图片
                ImageForm form = new ImageForm();
                form.Show(path);
            }
            else if (msg.MsgType == 34)//语音消息
            {
                string path = msg.fileName;
                adapter.Play();
                AsyncTask.StartNew(() =>
                {
                    Thread.Sleep((int)msg.VoiceLength / 1000);
                    adapter.Stop();
                });
            }
        }
 public void Callback(WeChatMessage newMessage)
 {
     Debug.Log("enter callback");
     InfoView.Show(new InfoMessage(newMessage.content, newMessage.name));
 }
예제 #18
0
 public static WeChatMessageModel ToModel(this WeChatMessage entity, IObjectMapper ObjectMapper)
 {
     return(entity.MapTo <WeChatMessage, WeChatMessageModel>(ObjectMapper));
 }
예제 #19
0
        /// <summary>
        /// 开发者接管
        /// </summary>
        public void Index(string signature, string timestamp, string nonce, string echostr, string encrypt_type, string msg_signature)
        {
            string result = string.Empty;

            //微信后台验证地址(使用Get),微信后台的“接口配置信息”的Url
            if (Request.Method.ToLower() != "post")
            {
                var Token = Configuration.GetValue <string>("WeChat:MP:Token");
                if (Helpers.Util.CheckSignature(signature, timestamp, nonce, Token))
                {
                    //返回随机字符串则表示验证通过
                    result = echostr;
                }
                else
                {
                    result = "参数错误!";
                }
            }
            //处理请求
            else
            {
                WeChatMessage message  = null;
                var           safeMode = encrypt_type == "aes";

                var Token          = string.Empty;
                var EncodingAESKey = string.Empty;
                var AppID          = string.Empty;

                if (safeMode)
                {
                    Token          = Configuration.GetValue <string>("WeChat:MP:Token");
                    EncodingAESKey = Configuration.GetValue <string>("WeChat:MP:EncodingAESKey");
                    AppID          = Configuration.GetValue <string>("WeChat:MP:AppID");
                }

                using (var ms = new MemoryStream())
                {
                    Request.Body.CopyTo(ms);
                    var myByteArray = ms.ToArray();

                    var    decryptMsg = string.Empty;
                    string postStr    = System.Text.Encoding.UTF8.GetString(myByteArray);

                    #region 解密
                    if (safeMode)
                    {
                        var wxBizMsgCrypt = new Helpers.Crypto.WXBizMsgCrypt(Token, EncodingAESKey, AppID);
                        var ret           = wxBizMsgCrypt.DecryptMsg(msg_signature, timestamp, nonce, postStr, ref decryptMsg);
                        //解密失败
                        if (ret != 0)
                        {
                            //TODO:开发者解密失败的业务处理逻辑
                        }
                    }
                    else
                    {
                        decryptMsg = postStr;
                    }
                    #endregion

                    message = WeChatMessage.Parse(decryptMsg);
                }
                var response   = new WeChatExecutor().Execute(message);
                var encryptMsg = string.Empty;

                #region 加密
                if (safeMode)
                {
                    var wxBizMsgCrypt = new Helpers.Crypto.WXBizMsgCrypt(Token, EncodingAESKey, AppID);
                    var ret           = wxBizMsgCrypt.EncryptMsg(response, timestamp, nonce, ref encryptMsg);
                    if (ret != 0)//加密失败
                    {
                        //TODO:开发者加密失败的业务处理逻辑
                    }
                }
                else
                {
                    encryptMsg = response;
                }
                #endregion
            }

            //输出
            byte[] buffer = System.Text.Encoding.UTF8.GetBytes(result);
            Response.Body.Write(buffer, 0, buffer.Length);
            Response.Body.Flush();
        }
예제 #20
0
            /// <summary>
            /// 说明:带TODO字眼的代码段,需要开发者自行按照自己的业务逻辑实现
            /// </summary>
            /// <param name="message"></param>
            /// <returns>已经打包成xml的用于回复用户的消息包</returns>
            public string Execute(WeChatMessage message)
            {
                var result = "";
                var domain = "";//请更改成你的域名

                var mb         = message.Body;
                var openId     = mb.GetText("FromUserName");
                var myUserName = mb.GetText("ToUserName");

                //这里需要调用获取Token的,省略了。
                switch (message.Type)
                {
                case WeChatMessageType.Text:    //文字消息
                    string userMessage = mb.GetText("Content");
                    result = ReplayPassiveMessage.RepayText(openId, myUserName, "欢迎使用,您输入了:" + userMessage);
                    break;

                case WeChatMessageType.Image:                //图片消息
                    string imageUrl = mb.GetText("PicUrl");  //图片地址
                    string mediaId  = mb.GetText("MediaId"); //mediaId
                    result = ReplayPassiveMessage.ReplayImage(openId, myUserName, mediaId);
                    break;

                case WeChatMessageType.Video:    //视频消息
                    #region 视频消息
                {
                    var media_id       = mb.GetText("MediaId");
                    var thumb_media_id = mb.GetText("PicUThumbMediaIdrl");
                    var msgId          = mb.GetText("MsgId");
                    //TODO
                    result = ReplayPassiveMessage.RepayText(openId, myUserName, string.Format("视频消息:openid:{0},media_id:{1},thumb_media_id:{2},msgId:{3}", openId, media_id, thumb_media_id, msgId));
                }
                    #endregion
                    break;

                case WeChatMessageType.Voice:    //语音消息
                    #region 语音消息
                {
                    var media_id = mb.GetText("MediaId");
                    var format   = mb.GetText("Format");
                    var msgId    = mb.GetText("MsgId");
                    //TODO
                    result = ReplayPassiveMessage.RepayText(openId, myUserName, string.Format("语音消息:openid:{0},media_id:{1},format:{2},msgId:{3}", openId, media_id, format, msgId));
                }
                    #endregion
                    break;

                case WeChatMessageType.Location:    //地理位置消息
                    #region 地理位置消息
                {
                    var location_X = mb.GetText("Location_X");
                    var location_Y = mb.GetText("Location_Y");
                    var scale      = mb.GetText("Scale");
                    var Label      = mb.GetText("Label");
                    //TODO
                    result = ReplayPassiveMessage.RepayText(openId, myUserName, string.Format("地理位置消息: openid:{0},Location_X:{1},Location_Y:{2},Scale:{3},label:{4}", openId, location_X, location_Y, scale, Label));
                }
                    #endregion
                    break;

                case WeChatMessageType.Link:    //链接消息
                    #region 链接消息
                {
                    var title       = mb.GetText("Title");
                    var description = mb.GetText("Description");
                    var url         = mb.GetText("Url");
                    var msgId       = mb.GetText("MsgId");
                    //TODO
                    result = ReplayPassiveMessage.RepayText(openId, myUserName, string.Format("openid:{0},title:{1},description:{2},url:{3},msgId:{4}", openId, title, description, url, msgId));
                }
                    #endregion
                    break;

                case WeChatMessageType.Event:
                    string eventType = mb.GetText("Event").ToLower();
                    string eventKey  = string.Empty;
                    try
                    {
                        eventKey = mb.GetText("EventKey");
                    }
                    catch { }
                    switch (eventType)
                    {
                    case "subscribe":        //用户未关注时,进行关注后的事件推送
                        #region 首次关注

                        //TODO: 获取用户基本信息后,将用户信息存储在本地。
                        //var weixinInfo = UserAdminAPI.GetInfo(token, openId);//注意:订阅号没有此权限

                        if (!string.IsNullOrEmpty(eventKey))
                        {
                            var qrscene = eventKey.Replace("qrscene_", "");        //此为场景二维码的场景值
                            result = ReplayPassiveMessage.RepayNews(openId, myUserName,
                                                                    new WeChatNews
                            {
                                title       = "欢迎订阅,场景值:" + qrscene,
                                description = "欢迎订阅,场景值:" + qrscene,
                                picurl      = string.Format("{0}/ad.jpg", domain),
                                url         = domain
                            });
                        }
                        else
                        {
                            result = ReplayPassiveMessage.RepayNews(openId, myUserName,
                                                                    new WeChatNews
                            {
                                title       = "欢迎订阅",
                                description = "欢迎订阅,点击此消息查看在线demo",
                                picurl      = string.Format("{0}/ad.jpg", domain),
                                url         = domain
                            });
                        }
                        #endregion
                        break;

                    case "unsubscribe":        //取消关注
                        #region 取消关注
                        result = ReplayPassiveMessage.RepayText(openId, myUserName, "欢迎再来");
                        #endregion
                        break;

                    case "scan":        // 用户已关注时的事件推送
                        #region 已关注扫码事件
                        if (!string.IsNullOrEmpty(eventKey))
                        {
                            var qrscene = eventKey.Replace("qrscene_", "");        //此为场景二维码的场景值
                            result = ReplayPassiveMessage.RepayNews(openId, myUserName,
                                                                    new WeChatNews
                            {
                                title       = "欢迎使用,场景值:" + qrscene,
                                description = "欢迎使用,场景值:" + qrscene,
                                picurl      = string.Format("{0}/ad.jpg", domain),
                                url         = domain
                            });
                        }
                        else
                        {
                            result = ReplayPassiveMessage.RepayNews(openId, myUserName,
                                                                    new WeChatNews
                            {
                                title       = "欢迎使用",
                                description = "欢迎订阅,点击此消息查看在线demo",
                                picurl      = string.Format("{0}/ad.jpg", domain),
                                url         = domain
                            });
                        }
                        #endregion
                        break;

                    case "masssendjobfinish":        //事件推送群发结果,
                        #region 事件推送群发结果
                    {
                        var msgId     = mb.GetText("MsgID");
                        var msgStatus = mb.GetText("Status");            //“send success”或“send fail”或“err(num)”
                                                                         //send success时,也有可能因用户拒收公众号的消息、系统错误等原因造成少量用户接收失败。
                                                                         //err(num)是审核失败的具体原因,可能的情况如下:err(10001)涉嫌广告, err(20001)涉嫌政治, err(20004)涉嫌社会, err(20002)涉嫌色情, err(20006)涉嫌违法犯罪,
                                                                         //err(20008)涉嫌欺诈, err(20013)涉嫌版权, err(22000)涉嫌互推(互相宣传), err(21000)涉嫌其他
                        var totalCount  = mb.GetText("TotalCount");      //group_id下粉丝数;或者openid_list中的粉丝数
                        var filterCount = mb.GetText("FilterCount");     //过滤(过滤是指特定地区、性别的过滤、用户设置拒收的过滤,用户接收已超4条的过滤)后,准备发送的粉丝数,原则上,FilterCount = SentCount + ErrorCount
                        var sentCount   = mb.GetText("SentCount");       //发送成功的粉丝数
                        var errorCount  = mb.GetText("FilterCount");     //发送失败的粉丝数
                                                                         //TODO:开发者自己的处理逻辑,这里用log4net记录日志
                                                                         //string.Format("mass send job finishe,msgId:{0},msgStatus:{1},totalCount:{2},filterCount:{3},sentCount:{4},errorCount:{5}", msgId, msgStatus, totalCount, filterCount, sentCount, errorCount);
                    }
                        #endregion
                        break;

                    case "templatesendjobfinish":        //模版消息结果,
                        #region 模版消息结果
                    {
                        var msgId     = mb.GetText("MsgID");
                        var msgStatus = mb.GetText("Status");            //发送状态为成功: success; 用户拒绝接收:failed:user block; 发送状态为发送失败(非用户拒绝):failed: system failed
                                                                         //TODO:开发者自己的处理逻辑,这里用log4net记录日志
                                                                         //string.Format("template send job finish,msgId:{0},msgStatus:{1}", msgId, msgStatus);
                    }
                        #endregion
                        break;

                    case "location":        //上报地理位置事件
                        #region  报地理位置事件
                        var lat = mb.GetText("Latitude");
                        var lng = mb.GetText("Longitude");
                        var pcn = mb.GetText("Precision");
                        //TODO:在此处将经纬度记录在数据库,这里用log4net记录日志
                        //string.Format("openid:{0} ,location,lat:{1},lng:{2},pcn:{3}", openId, lat, lng, pcn);
                        #endregion
                        break;

                    case "voice":        //语音消息
                        #region 语音消息
                        //A:已开通语音识别权限的公众号
                        var userVoice = mb.GetText("Recognition");        //用户语音消息文字
                        result = ReplayPassiveMessage.RepayText(openId, myUserName, "您说:" + userVoice);

                        //B:未开通语音识别权限的公众号
                        var userVoiceMediaId = mb.GetText("MediaId");        //media_id
                                                                             //TODO:调用自定义的语音识别程序识别用户语义

                        #endregion
                        break;

                    case "image":                             //图片消息
                        #region 图片消息
                        var userImage = mb.GetText("PicUrl"); //用户语音消息文字
                        result = ReplayPassiveMessage.RepayNews(openId, myUserName, new WeChatNews
                        {
                            title       = "您刚才发送了图片消息",
                            picurl      = string.Format("{0}/Images/ad.jpg", domain),
                            description = "点击查看图片",
                            url         = userImage
                        });
                        #endregion
                        break;

                    case "click":        //自定义菜单事件
                        #region 自定义菜单事件
                    {
                        switch (eventKey)
                        {
                        case "myaccount":                //CLICK类型事件举例
                            #region 我的账户
                            result = ReplayPassiveMessage.RepayNews(openId, myUserName, new List <WeChatNews>()
                                {
                                    new WeChatNews {
                                        title       = "我的帐户",
                                        url         = string.Format("{0}/user?openId={1}", domain, openId),
                                        description = "点击查看帐户详情",
                                        picurl      = string.Format("{0}/Images/ad.jpg", domain)
                                    },
                                });
                            #endregion
                            break;

                        case "www.weixinsdk.net":                //VIEW类型事件举例,注意:点击菜单弹出子菜单,不会产生上报。
                                                                 //TODO:后台处理逻辑
                            break;

                        default:
                            result = ReplayPassiveMessage.RepayText(openId, myUserName, "没有响应菜单事件");
                            break;
                        }
                    }
                        #endregion
                        break;

                    case "view":        //点击菜单跳转链接时的事件推送
                        #region 点击菜单跳转链接时的事件推送
                        result = ReplayPassiveMessage.RepayText(openId, myUserName, string.Format("您将跳转至:{0}", eventKey));
                        #endregion
                        break;

                    case "scancode_push":                                                                                //扫码推事件的事件推送
                    {
                        var scanType   = mb.SelectSingleNode("//ScanCodeInfo").SelectSingleNode("//ScanType").InnerText; //扫描类型,一般是qrcode
                        var scanResult = mb.SelectSingleNode("//ScanCodeInfo").SelectSingleNode("ScanResult").InnerText; //扫描结果,即二维码对应的字符串信息
                        result = ReplayPassiveMessage.RepayText(openId, myUserName, string.Format("您扫描了二维码,scanType:{0},scanResult:{1},EventKey:{2}", scanType, scanResult, eventKey));
                    }
                    break;

                    case "scancode_waitmsg":                                                                               //扫码推事件且弹出“消息接收中”提示框的事件推送
                    {
                        var scanType   = mb.SelectSingleNode("//ScanCodeInfo").SelectSingleNode("//ScanType").InnerText;   //扫描类型,一般是qrcode
                        var scanResult = mb.SelectSingleNode("//ScanCodeInfo").SelectSingleNode("//ScanResult").InnerText; //扫描结果,即二维码对应的字符串信息
                        result = ReplayPassiveMessage.RepayText(openId, myUserName, string.Format("您扫描了二维码,scanType:{0},scanResult:{1},EventKey:{2}", scanType, scanResult, eventKey));
                    }
                    break;

                    case "pic_sysphoto":                                      //弹出系统拍照发图的事件推送
                    {
                        var count   = mb.SelectNodes("//SendPicsInfo").Count; //发送的图片数量
                        var picList = mb.GetText("PicList");                  //发送的图片信息
                        result = ReplayPassiveMessage.RepayText(openId, myUserName, string.Format("弹出系统拍照发图,count:{0},EventKey:{1}", count, eventKey));
                    }
                    break;

                    case "pic_photo_or_album":                                //弹出拍照或者相册发图的事件推送
                    {
                        var count   = mb.SelectNodes("//SendPicsInfo").Count; //发送的图片数量
                        var picList = mb.GetText("PicList");                  //发送的图片信息
                        result = ReplayPassiveMessage.RepayText(openId, myUserName, string.Format("弹出拍照或者相册发图,count:{0},EventKey:{1}", count, eventKey));
                    }
                    break;

                    case "pic_weixin":                                        //弹出微信相册发图器的事件推送
                    {
                        var count   = mb.SelectNodes("//SendPicsInfo").Count; //发送的图片数量
                        var picList = mb.GetText("PicList");                  //发送的图片信息
                        result = ReplayPassiveMessage.RepayText(openId, myUserName, string.Format("弹出微信相册发图器,count:{0},EventKey:{1}", count, eventKey));
                    }
                    break;

                    case "location_select":        //弹出地理位置选择器的事件推送
                    {
                        var sli        = mb.SelectSingleNode("//SendLocationInfo");
                        var location_X = sli.SelectSingleNode("Location_X").InnerText; //X坐标信息
                        var location_Y = sli.SelectSingleNode("Location_Y").InnerText; //Y坐标信息
                        var scale      = sli.SelectSingleNode("Scale").InnerText;      //精度,可理解为精度或者比例尺、越精细的话 scale越高
                        var label      = sli.SelectSingleNode("Label").InnerText;      //地理位置的字符串信息
                        var poiname    = sli.SelectSingleNode("Poiname");              //朋友圈POI的名字,可能为空
                        result = ReplayPassiveMessage.RepayText(openId, myUserName, string.Format("弹出地理位置选择器,location_X:{0},location_Y:{1},scale:{2},label:{3},poiname:{4},eventKey:{5}", location_X, location_Y, scale, label, poiname, eventKey));
                    }
                    break;

                    case "card_pass_check":                //生成的卡券通过审核时,微信会把这个事件推送到开发者填写的URL。
                    {
                        var cardid = mb.GetText("CardId"); //CardId
                        result = ReplayPassiveMessage.RepayText(openId, myUserName, string.Format("您的卡券已经通过审核"));
                    }
                    break;

                    case "card_not_pass_check":            //生成的卡券未通过审核时,微信会把这个事件推送到开发者填写的URL。
                    {
                        var cardid = mb.GetText("CardId"); //CardId
                    }
                    break;

                    case "user_get_card":                                  //用户在领取卡券时,微信会把这个事件推送到开发者填写的URL。
                    {
                        var cardid         = mb.GetText("CardId");         //CardId
                        var isGiveByFriend = mb.GetText("IsGiveByFriend"); //是否为转赠,1代表是,0代表否。
                        var fromUserName   = mb.GetText("FromUserName");   //领券方帐号(一个OpenID)
                        var friendUserName = mb.GetText("FriendUserName"); //赠送方账号(一个OpenID),"IsGiveByFriend”为1时填写该参数。
                        var userCardCode   = mb.GetText("UserCardCode");   //code序列号。自定义code及非自定义code的卡券被领取后都支持事件推送。
                        var outerId        = mb.GetText("OuterId");        //领取场景值,用于领取渠道数据统计。可在生成二维码接口及添加JSAPI接口中自定义该字段的整型值。
                    }
                    break;

                    case "user_del_card":                              //用户在删除卡券时,微信会把这个事件推送到开发者填写的URL
                    {
                        var cardid       = mb.GetText("CardId");       //CardId
                        var userCardCode = mb.GetText("UserCardCode"); //商户自定义code值。非自定code推送为空
                    }
                    break;

                    case "merchant_order":                           //微信小店:订单付款通知:在用户在微信中付款成功后,微信服务器会将订单付款通知推送到开发者在公众平台网站中设置的回调URL(在开发模式中设置)中,如未设置回调URL,则获取不到该事件推送。
                    {
                        var orderId     = mb.GetText("OrderId");     //CardId
                        var orderStatus = mb.GetText("OrderStatus"); //OrderStatus
                        var productId   = mb.GetText("ProductId");   //ProductId
                        var skuInfo     = mb.GetText("SkuInfo");     //SkuInfo
                    }
                    break;
                    }
                    break;

                default:
                    result = ReplayPassiveMessage.RepayText(openId, myUserName, string.Format("未处理消息类型:{0}", message.Type));
                    break;
                }
                return(result);
            }
예제 #21
0
 public static WeChatMessage ToEntity(this WeChatMessageModel model, WeChatMessage destination, IObjectMapper ObjectMapper)
 {
     return(model.MapTo(destination, ObjectMapper));
 }
예제 #22
0
 private bool AddWeChatMessage(WeChatMessage data)
 {
     MessageModel.Instance.WeChatList.Add(data);
     return(false);
 }
예제 #23
0
            /// <summary>
            /// 处理微信消息
            /// </summary>
            /// <param name="message"></param>
            /// <returns>已经打包成xml的用于回复用户的消息包</returns>
            public string Execute(WeChatMessage message)
            {
                var    myDomain = GlobalTo.GetValue("Common:Domain");
                string myPic    = $"{myDomain}/favicon.svg";

                var mb         = message.Body;
                var openId     = mb.GetText("FromUserName");
                var myUserName = mb.GetText("ToUserName");

                var news = new WeChatNews
                {
                    title       = GlobalTo.GetValue("Common:ChineseName") + "(Gist,Run,Doc,Draw)",
                    description = GlobalTo.GetValue("Common:ChineseName") + ",技术分享博客、代码片段、在线运行代码、接口文档、绘制 等等",
                    picurl      = myPic,
                    url         = myDomain
                };

                //默认首页
                string result = ReplayPassiveMessage.RepayNews(openId, myUserName, news);

                switch (message.Type)
                {
                //文字消息
                case WeChatMessageType.Text:
                {
                    string Content = mb.GetText("Content");
                    string repmsg  = string.Empty;

                    if ("sj".Split(' ').ToList().Contains(Content))
                    {
                        repmsg = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                    }
                    else if ("xh".Split(' ').ToList().Contains(Content))
                    {
                        repmsg = "笑话\nhttps://ss.netnr.com/qiushibaike";
                    }
                    else if ("note".Split(' ').ToList().Contains(Content))
                    {
                        repmsg = $"记事\n{myDomain}/tool/note";
                    }
                    else if ("gist".Split(' ').ToList().Contains(Content))
                    {
                        repmsg = $"代码片段\n{myDomain}/gist/discover";
                    }
                    else if ("doc".Split(' ').ToList().Contains(Content))
                    {
                        repmsg = $"文档\n{myDomain}/doc/discover";
                    }
                    else if ("cp lottery".Split(' ').ToList().Contains(Content))
                    {
                        repmsg = "彩票\nhttps://ss.netnr.com/lottery";
                    }

                    if (!string.IsNullOrWhiteSpace(repmsg))
                    {
                        result = ReplayPassiveMessage.RepayText(openId, myUserName, repmsg);
                    }
                }
                break;
                }
                return(result);
            }
예제 #24
0
        public HttpResponseMessage WetChatVerify(HttpRequestMessage content)      //HttpRequestMessage 和HttpResponseMessage,分别用于封装Requset和Response
        {
            string echostr = (from kvp in content.GetQueryNameValuePairs()
                              where kvp.Key == "echostr"
                              select kvp.Value).FirstOrDefault();

            string signature = (from kvp in content.GetQueryNameValuePairs()
                                where kvp.Key == "signature"
                                select kvp.Value).FirstOrDefault();

            string timestamp = (from kvp in content.GetQueryNameValuePairs()
                                where kvp.Key == "timestamp"
                                select kvp.Value).FirstOrDefault();

            string nonce = (from kvp in content.GetQueryNameValuePairs()
                            where kvp.Key == "nonce"
                            select kvp.Value).FirstOrDefault();

            log.Info("echostr:" + echostr + " signature:" + signature + " nonce:" + nonce);
            string xmlContent = content.Content.ReadAsStringAsync().Result;
            string response   = string.Empty;

            log.Info("xml3:" + xmlContent);

            if (!string.IsNullOrEmpty(xmlContent))
            {
                XmlDocument doc = new XmlDocument();
                doc.LoadXml(xmlContent);
                WeChatMessage msg = WeChatHelper.GetWxMessage(xmlContent);

                if (msg.MsgType.Trim() == "text")//用户发送一些文字信息
                {
                    string text = WXMsgUtil.GetFromXML(doc, "Content") + "";

                    response = WXMsgUtil.GetTulingMsg(text != ""?text:"你是谁?") + "";
                    log.Info("text:" + text + " tuling:" + response);
                }
                if (msg.MsgType.Trim() == "event")//点击菜单或者新增/取消关注
                {
                    switch (msg.EventName.Trim().ToLower())
                    {
                    case "click":          //点击菜单
                        response = "haha";
                        break;

                    case "subscribe":        //用户新增关注(可以返回一些欢迎信息之类)                                  
                        response = "wawa";
                        break;

                    case "unsubscribe":       //用户取消关注(一般不需要去返回什么信息)
                    default:
                        break;
                    }
                }

                HttpResponseMessage xmlResult = new HttpResponseMessage();
                xmlResult.Content = new StringContent(WXMsgUtil.CreateTextMsg(doc, response != "" ? response : "返回不能为空值!"));
                return(xmlResult);
            }
            string returnStr = "";

            if (string.IsNullOrEmpty(echostr) | string.IsNullOrEmpty(signature) | string.IsNullOrEmpty(timestamp) | string.IsNullOrEmpty(nonce))
            {
                returnStr = "error";
            }

            //if (CheckSignature(signature, timestamp, nonce))
            //{
            //    log.Info("验证成功,返回:" + echostr);
            returnStr = echostr;
            //}

            HttpResponseMessage result = new HttpResponseMessage();

            result.Content = new StringContent(returnStr != ""?returnStr:"返回不能为空值!");
            return(result);
        }
예제 #25
0
        /// <summary>
        /// 开发者接管
        /// </summary>
        /// <param name="signature"></param>
        /// <param name="timestamp"></param>
        /// <param name="nonce"></param>
        /// <param name="echostr"></param>
        /// <param name="encrypt_type"></param>
        /// <param name="msg_signature"></param>
        public async void WeChat(string signature, string timestamp, string nonce, string echostr, string encrypt_type, string msg_signature)
        {
            string result = string.Empty;

            //微信后台验证地址(使用Get),微信后台的“接口配置信息”的Url
            if (Request.Method.ToLower() == "get")
            {
                var Token = GlobalTo.GetValue("ApiKey:WeChatMP:Token");

                if (Netnr.WeChat.Helpers.Util.CheckSignature(signature, timestamp, nonce, Token))
                {
                    //返回随机字符串则表示验证通过
                    result = echostr;
                }
                else
                {
                    result = "参数错误!";
                }
            }
            //处理请求
            else
            {
                WeChatMessage message  = null;
                var           safeMode = encrypt_type == "aes";

                var Token          = string.Empty;
                var EncodingAESKey = string.Empty;
                var AppID          = string.Empty;

                if (safeMode)
                {
                    Token          = GlobalTo.GetValue("ApiKey:WeChatMP:Token");
                    EncodingAESKey = GlobalTo.GetValue("ApiKey:WeChatMP:EncodingAESKey");
                    AppID          = GlobalTo.GetValue("ApiKey:WeChatMP:AppID");
                }

                using (var ms = new MemoryStream())
                {
                    await Request.Body.CopyToAsync(ms);

                    var myByteArray = ms.ToArray();

                    var    decryptMsg = string.Empty;
                    string postStr    = System.Text.Encoding.UTF8.GetString(myByteArray);

                    #region 解密
                    if (safeMode)
                    {
                        var wxBizMsgCrypt = new WeChat.Helpers.Crypto.WXBizMsgCrypt(Token, EncodingAESKey, AppID);
                        var ret           = wxBizMsgCrypt.DecryptMsg(msg_signature, timestamp, nonce, postStr, ref decryptMsg);
                        //解密失败
                        if (ret != 0)
                        {
                            FilterConfigs.WriteLog(HttpContext, new Exception("微信解密失败"));
                        }
                    }
                    else
                    {
                        decryptMsg = postStr;
                    }
                    #endregion

                    message = WeChatMessage.Parse(decryptMsg);
                }
                var response = new WeChatExecutor().Execute(message);

                #region 加密
                if (safeMode)
                {
                    var wxBizMsgCrypt = new WeChat.Helpers.Crypto.WXBizMsgCrypt(Token, EncodingAESKey, AppID);
                    var ret           = wxBizMsgCrypt.EncryptMsg(response, timestamp, nonce, ref result);
                    if (ret != 0)//加密失败
                    {
                        FilterConfigs.WriteLog(HttpContext, new Exception("微信加密失败"));
                    }
                }
                else
                {
                    result = response;
                }
                #endregion
            }

            //输出
            byte[] buffer = System.Text.Encoding.UTF8.GetBytes(result);
            await Response.Body.WriteAsync(buffer, 0, buffer.Length);

            await Response.Body.FlushAsync();
        }
예제 #26
0
 public void PostWeChat(WeChatMessage data)
 {
     Lucky.LuckyUtils.Log("send we chat " + data.name);
     MessageBus.Post(data);
 }