打你一下

.net回复图片

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.IO;
using System.Net;
using System.Text;
using System.Xml;
using System.Web.Security;
using LYSY.Framework.Commons;
using System.Web.Script.Serialization;
using AgentsWork;
using System.Runtime.Serialization.Json;
using LYSY.Framework.CommonsWapper;
using System.Text.RegularExpressions;


    public partial class wxyz : System.Web.UI.Page
    {

       string Token = "";//你的token
        string appid = "";
          string appsecret = "";
        #region 以下代码只用于第一次验证  验证完后请注释
        protected void Page_Load(object sender, EventArgs e)
        {
            DataSet reply = ADOAccessor.Instance.GetAllBySql("SELECT TOP 1 * FROM dbo.Wxsysconfig");
            int replynumber=reply.Table1().Rows.Count;
            if (replynumber == 0)
            {

            }
            else
            {
                DataRow dr1 = reply.Tables[0].Rows[0];
               Token= Convert.ToString(dr1["token"]);
               appid = Convert.ToString(dr1["AppID"]);
               appsecret = Convert.ToString(dr1["AppSecret"]);
                int istoken = Convert.ToInt32(dr1["istoken"]);
                if (istoken == 1)
                {
                    string postStr = "";
                    if (Request.HttpMethod.ToLower() == "post")
                    {
                        System.IO.Stream s = System.Web.HttpContext.Current.Request.InputStream;
                        byte[] b = new byte[s.Length];
                        s.Read(b, 0, (int)s.Length);
                        postStr = System.Text.Encoding.UTF8.GetString(b);
                        if (!string.IsNullOrEmpty(postStr))
                        {
                            Response.End();
                        }
                        //WriteLog("postStr:" + postStr);
                    }
                    else
                    {
                        Valid();
                    }
                }
                else if (istoken == 2)
                {
                    if (Request.HttpMethod == "POST")
                    {
                        string weixin = "";
                        weixin = PostInput();//获取xml数据
                        if (!string.IsNullOrEmpty(weixin))
                        {
                            ResponseMsg(weixin);//调用消息适配器
                        }
                    }
                }
            }

           
        }
        #endregion

        #region 以下是正常使用时的pageload  请在验证时将其注释  并保证在正常使用时可用
        /// <summary>
        /// 以下是正常使用时的pageload  请在验证时将其注释  并保证在正常使用时可用
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        //protected void Page_Load(object sender, EventArgs e)
        //{

        //    if (Request.HttpMethod == "POST")
        //    {
        //        string weixin = "";
        //        weixin = PostInput();//获取xml数据
        //        if (!string.IsNullOrEmpty(weixin))
        //        {
        //            ResponseMsg(weixin);//调用消息适配器
        //        }
        //    }
        //}
        #endregion

        #region 获取post请求数据
        /// <summary>
        /// 获取post请求数据
        /// </summary>
        /// <returns></returns>
        private string PostInput()
        {
            Stream s = System.Web.HttpContext.Current.Request.InputStream;
            byte[] b = new byte[s.Length];
            s.Read(b, 0, (int)s.Length);
            return Encoding.UTF8.GetString(b);
        }
        #endregion

        #region 消息类型适配器
        private void ResponseMsg(string weixin)// 服务器响应微信请求
        {
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(weixin);//读取xml字符串
            XmlElement root = doc.DocumentElement;
            ExmlMsg xmlMsg = GetExmlMsg(root);
            //XmlNode MsgType = root.SelectSingleNode("MsgType");
            //string messageType = MsgType.InnerText;
            string messageType = xmlMsg.MsgType;//获取收到的消息类型。文本(text),图片(image),语音等。
            DataSet wxnumber = ADOAccessor.Instance.GetAllBySql("SELECT TOP 1 * FROM dbo.Wxsysreply");
            int wx = wxnumber.Table1().Rows.Count;
            try
            {

                switch (messageType)
                {
                    //当消息为文本时
                    case "text":
                        if (wx!= 0)
                        {
                               DataRow dr1 = wxnumber.Tables[0].Rows[0];
                               string defaul = Convert.ToString(dr1["defaul"]);
                               string texttype = "";
                               if (defaul.Trim() == "")
                               {
                                   WriteLog(xmlMsg.ToUserName);
                                   WriteLog(xmlMsg.FromUserName);
                                   textCase(xmlMsg, texttype);
                                 
                               }
                               else
                               {
                                   WriteLog(xmlMsg.ToUserName);
                                   WriteLog(xmlMsg.FromUserName);
                                   texttype = defaul;  
                                   textCase(xmlMsg, texttype);
                               }
                        }
                      
                        break;
                    case "event":
                        if (!string.IsNullOrEmpty(xmlMsg.EventName) && xmlMsg.EventName.Trim() == "subscribe")
                        {
                            string msg = "";
                            if (wx!= 0)
                            {
                                int nowtime = ConvertDateTimeInt(DateTime.Now);
                                DataRow dr1 = wxnumber.Tables[0].Rows[0];
                                string follow= Convert.ToString(dr1["follow"]);
                                if (follow.Trim() == "")
                                {
                                   
                                    msg = "感谢你关注!";
                                    string resxml = "<xml><ToUserName><![CDATA[" + xmlMsg.FromUserName + "]]></ToUserName><FromUserName><![CDATA[" + xmlMsg.ToUserName + "]]></FromUserName><CreateTime>" + nowtime + "</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[" + msg + "]]></Content><FuncFlag>0</FuncFlag></xml>";
                                    Response.Write(resxml);
                                }
                                else
                                {
                                    DataSet datafollow = ADOAccessor.Instance.GetAllBySql("SELECT TOP 1 * FROM dbo.Reply WHERE keyword='" + follow + "'");
                                    int followcount = datafollow.Table1().Rows.Count;
                                    if (followcount == 0)
                                    {
                                       
                                        msg = "感谢你关注!";
                                        string resxml = "<xml><ToUserName><![CDATA[" + xmlMsg.FromUserName + "]]></ToUserName><FromUserName><![CDATA[" + xmlMsg.ToUserName + "]]></FromUserName><CreateTime>" + nowtime + "</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[" + msg + "]]></Content><FuncFlag>0</FuncFlag></xml>";
                                        Response.Write(resxml);
                                    }
                                    else
                                    {
                                        DataRow followdr = datafollow.Tables[0].Rows[0];
                                       
                                        string modulekey = Convert.ToString(followdr["module"]);
                                        if (modulekey == "basic")
                                        {
                                            DataSet replytext = ADOAccessor.Instance.GetAllBySql("SELECT TOP 1 * FROM dbo.Replytext WHERE rid=" + Convert.ToString(followdr["rid"]));
                                            DataRow drtext = replytext.Tables[0].Rows[0];
                                           
                                            msg = Convert.ToString(drtext["content"]);
                                            string resxml = "<xml><ToUserName><![CDATA[" + xmlMsg.FromUserName + "]]></ToUserName><FromUserName><![CDATA[" + xmlMsg.ToUserName + "]]></FromUserName><CreateTime>" + nowtime + "</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[" + msg + "]]></Content><FuncFlag>0</FuncFlag></xml>";
                                            Response.Write(resxml);
                                        }
                                    }
                                }
                            }
                            else
                            {
                                int nowtime = ConvertDateTimeInt(DateTime.Now);
                                msg = "感谢你关注!";
                                string resxml = "<xml><ToUserName><![CDATA[" + xmlMsg.FromUserName + "]]></ToUserName><FromUserName><![CDATA[" + xmlMsg.ToUserName + "]]></FromUserName><CreateTime>" + nowtime + "</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[" + msg + "]]></Content><FuncFlag>0</FuncFlag></xml>";
                                Response.Write(resxml);
                            }
                            
                          
                            //刚关注时的时间,用于欢迎词  
                        
                        }
                        break;
                    case "image":
                        break;
                    case "voice":
                        break;
                    case "vedio":
                        break;
                    case "location":
                        break;
                    case "link":
                        break;
                    default:
                        break;
                }
                Response.End();
            }
            catch (Exception)
            {

            }
        }
        #endregion

      
        #region 操作文本消息 + void textCase(XmlElement root)
        private void textCase(ExmlMsg xmlMsg,String texttype)
        {
            int nowtime = ConvertDateTimeInt(DateTime.Now);
            string content = xmlMsg.Content;
            if (content == "授权书")
            {
                string mediaid = UploadMultimedia();
                string resxml = "<xml><ToUserName><![CDATA[" + xmlMsg.FromUserName + "]]></ToUserName><FromUserName><![CDATA[" + xmlMsg.ToUserName + "]]></FromUserName><CreateTime>" + nowtime + "</CreateTime><MsgType><![CDATA[image]]></MsgType><Image><MediaId><![CDATA[" + mediaid + "]]></MediaId></Image><FuncFlag>0</FuncFlag></xml>";
                Response.Write(resxml);
            }
            else {
            DataSet datacontent = ADOAccessor.Instance.GetAllBySql("SELECT TOP 1 * FROM dbo.Reply WHERE keyword='" + content + "'");
            int contentnumber = datacontent.Table1().Rows.Count;
         
            if (contentnumber == 0) {
            DataSet reply = ADOAccessor.Instance.GetAllBySql("SELECT TOP 1 * FROM dbo.Reply WHERE keyword='" + texttype + "'");
            int replycount = reply.Table1().Rows.Count;
           
            if (replycount == 1)
            {
                 DataRow dr1 = reply.Tables[0].Rows[0];
                 string module= Convert.ToString(dr1["module"]);
                 if (module == "basic")
                 {
                     DataSet replytext= ADOAccessor.Instance.GetAllBySql("SELECT TOP 1 * FROM dbo.Replytext WHERE rid="+Convert.ToString(dr1["rid"]));
                     DataRow drtext = replytext.Tables[0].Rows[0];
                     string msg = "";
                  msg = Convert.ToString(drtext["content"]);
                  string resxml = "<xml><ToUserName><![CDATA[" + xmlMsg.FromUserName + "]]></ToUserName><FromUserName><![CDATA[" + xmlMsg.ToUserName + "]]></FromUserName><CreateTime>" + nowtime + "</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[" + msg + "]]></Content><FuncFlag>0</FuncFlag></xml>";
                  Response.Write(resxml);
                 }
              
            }
            }
            else
            {
                DataRow contentlist = datacontent.Tables[0].Rows[0];
                string conentmodule = Convert.ToString(contentlist["module"]);
                if (conentmodule == "basic")
                {
                    DataSet replytext = ADOAccessor.Instance.GetAllBySql("SELECT TOP 1 * FROM dbo.Replytext WHERE rid=" + Convert.ToString(contentlist["rid"]));
                    DataRow drtext = replytext.Tables[0].Rows[0];
                    string msg = "";
                    msg = Convert.ToString(drtext["content"]);
                    string resxml = "<xml><ToUserName><![CDATA[" + xmlMsg.FromUserName + "]]></ToUserName><FromUserName><![CDATA[" + xmlMsg.ToUserName + "]]></FromUserName><CreateTime>" + nowtime + "</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[" + msg + "]]></Content><FuncFlag>0</FuncFlag></xml>";
                    Response.Write(resxml);
                }
            }

            }
        }
        #endregion
        //上传图片到公众号
        public string UploadMultimedia()
        {
            string result = "";
            string wxurl = "http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token=" + Get_Access_token() + "&type=image";
            string filepath = "E:\\web\\lsfwx\\bg.jpg";
             WriteLog("上传路径:" + filepath);
             WriteLog("acc_token:"+Get_Access_token());
             WriteLog("appid:" + appid);
             WriteLog("appsecret:" + appsecret);
            WebClient myWebClient = new WebClient();
            myWebClient.Credentials = CredentialCache.DefaultCredentials;
            try
            {
               // byte[] b = myWebClient.UploadFile(string.Format("https://qyapi.weixin.qq.com/cgi-bin/media/upload?access_token={0}&type=image", Get_Access_token()), filepath);//调用接口上传文件
                myWebClient.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
               // result = Encoding.Default.GetString(b);//获取返回值
                byte[] responseArray = myWebClient.UploadFile(wxurl, "POST",filepath);
                result = System.Text.Encoding.Default.GetString(responseArray, 0, responseArray.Length);
                WriteLog("上传result:" + result);
             UploadMM _mode = JsonHelper.ParseFromJson<UploadMM>(result);


             result = _mode.media_id;
            }
            catch (Exception ex)
            {
                result = "Error:" + ex.Message;
            }
            WriteLog("上传MediaId:" + result);
            return result;
        }
        //public string Get_Access_token()
        //{
        //    WebClient webclient = new WebClient();
        //    string url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appid + "&secret=" + appsecret + "";
        //    WriteLog("url:" + url);
        //    byte[] bytes = webclient.DownloadData(url);//在指定的path上下载
        //    string result = Encoding.GetEncoding("utf-8").GetString(bytes);//转string
        //    JavaScriptSerializer js = new JavaScriptSerializer();
        //    access_token amodel = js.Deserialize<access_token>(result);//此处为定义的类,用以将json转成model
        //    string a_token = amodel.accesstoken;
        //    return a_token;
        //}
        //获取acc_token
        public string Get_Access_token()
        {
            string Str = GetJson("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appid + "&secret=" + appsecret);
            WriteLog("str:" + Str);
            acc_token acc_token_model = JsonHelper.ParseFromJson<acc_token>(Str);
            string a_token = acc_token_model.access_token;
            return a_token;
        }
        protected string GetJson(string url)
        {
            WebClient wc = new WebClient();
            wc.Credentials = CredentialCache.DefaultCredentials;
            wc.Encoding = Encoding.UTF8;
            string returnText = wc.DownloadString(url);

            if (returnText.Contains("errcode"))
            {
                //可能发生错误
            }
            return returnText;
        }

        public class acc_token
        {

            public string access_token { get; set; }

            public string expires_in { get; set; }

        }
        public class UploadMM
        {
            public string media_id { get; set; }
        }

        #region 将datetime.now 转换为 int类型的秒
        /// <summary>
        /// datetime转换为unixtime
        /// </summary>
        /// <param name="time"></param>
        /// <returns></returns>
        private int ConvertDateTimeInt(System.DateTime time)
        {
            System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1));
            return (int)(time - startTime).TotalSeconds;
        }
        private int converDateTimeInt(System.DateTime time)
        {
            System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1));
            return (int)(time - startTime).TotalSeconds;
        }

        /// <summary>
        /// unix时间转换为datetime
        /// </summary>
        /// <param name="timeStamp"></param>
        /// <returns></returns>
        private DateTime UnixTimeToTime(string timeStamp)
        {
            DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
            long lTime = long.Parse(timeStamp + "0000000");
            TimeSpan toNow = new TimeSpan(lTime);
            return dtStart.Add(toNow);
        }
        #endregion

        #region 验证微信签名 保持默认即可
        /// <summary>
        /// 验证微信签名
        /// </summary>
        /// * 将token、timestamp、nonce三个参数进行字典序排序
        /// * 将三个参数字符串拼接成一个字符串进行sha1加密
        /// * 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信。
        /// <returns></returns>
        private bool CheckSignature()
        {
            string signature = Request.QueryString["signature"].ToString();
            string timestamp = Request.QueryString["timestamp"].ToString();
            string nonce = Request.QueryString["nonce"].ToString();
            string[] ArrTmp = { Token, timestamp, nonce };
            Array.Sort(ArrTmp);     //字典排序
            string tmpStr = string.Join("", ArrTmp);
            tmpStr = FormsAuthentication.HashPasswordForStoringInConfigFile(tmpStr, "SHA1");
            tmpStr = tmpStr.ToLower();
            if (tmpStr == signature)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        private void Valid()
        {
            string echoStr = Request.QueryString["echoStr"].ToString();
            if (CheckSignature())
            {
                if (!string.IsNullOrEmpty(echoStr))
                {
                    ADOAccessor.Instance.DefaultDataBase.ExecuteNonQuery("UPDATE dbo.Wxsysconfig SET istoken=2 WHERE ID!=0 ");
                    Response.Write(echoStr);
                    Response.End();
                }
            }
        }
        #endregion

        #region 写日志(用于跟踪) + WriteLog(string strMemo, string path = "*****")
        /// <summary>
        /// 写日志(用于跟踪)
        /// 如果log的路径修改,更改path的默认值
        /// </summary>
        private void WriteLog(string strMemo, string path = "wx.txt")
        {
            string filename = Server.MapPath(path);
            StreamWriter sr = null;
            try
            {
                if (!File.Exists(filename))
                {
                    sr = File.CreateText(filename);
                }
                else
                {
                    sr = File.AppendText(filename);
                }
                sr.WriteLine(strMemo);
            }
            catch
            {

            }
            finally
            {
                if (sr != null)
                    sr.Close();
            }
        }
        //#endregion
        #endregion

        #region 接收的消息实体类 以及 填充方法
        private class ExmlMsg
        {
            /// <summary>
            /// 本公众账号
            /// </summary>
            public string ToUserName { get; set; }
            /// <summary>
            /// 用户账号
            /// </summary>
            public string FromUserName { get; set; }
            /// <summary>
            /// 发送时间戳
            /// </summary>
            public string CreateTime { get; set; }
            /// <summary>
            /// 发送的文本内容
            /// </summary>
            public string Content { get; set; }
            /// <summary>
            /// 消息的类型
            /// </summary>
            public string MsgType { get; set; }
            /// <summary>
            /// 事件名称
            /// </summary>
            public string EventName { get; set; }

        }

        private ExmlMsg GetExmlMsg(XmlElement root)
        {
            ExmlMsg xmlMsg = new ExmlMsg()
            {
                FromUserName = root.SelectSingleNode("FromUserName").InnerText,
                ToUserName = root.SelectSingleNode("ToUserName").InnerText,
                CreateTime = root.SelectSingleNode("CreateTime").InnerText,
                MsgType = root.SelectSingleNode("MsgType").InnerText,
            };
            if (xmlMsg.MsgType.Trim().ToLower() == "text")
            {
                xmlMsg.Content = root.SelectSingleNode("Content").InnerText;
            }
            else if (xmlMsg.MsgType.Trim().ToLower() == "event")
            {
                xmlMsg.EventName = root.SelectSingleNode("Event").InnerText;
            }
            return xmlMsg;
        }
        #endregion
    }

posted on 2017-07-26 18:05  打你一下  阅读(221)  评论(0)    收藏  举报

导航