asp.net微信開發第三篇----自定義會話管理

和微信用戶的溝通少不了,總以爲看起來微信官網後臺管理中的會話回覆消息有點呆板,因此我這裏就自定義了一個會話管理功能,最終效果圖以下:javascript

由於我試使用富文本文件CKEDITOR來進行編寫,你看到穩中可能會有<P></p>字段,後臺獲取數據內容時,替換爲空字符便可:以下css

      string txtcontent = this.txtMessage.Value.ToString().Replace("<p>", "");
            StringBuilder sb = new StringBuilder();
            sb.Append(txtcontent.Replace("</p>\r\n", ""));html

 

在我我的理解,作會話管理,無非就是將用戶對話信息(用戶發過來的數據,發給用戶的數據)存入數據庫,根據用戶的數據時間和回覆用戶數據的時間來和當天系統的時間作對比,若是大於多少分鐘或者多少個小時就不能夠再主動和用戶對話,就算我這裏是根據微信官網48小時來進行限制的,超過48小時禁用控件,以下圖:java

 

廢話少說,上代碼:須要用到的兩個類,數據庫也要建立和類相同的名字(至少我試這麼作的)jquery

 /// <summary>
    /// 微信會話記錄類,用戶存儲會話記錄列表
    /// </summary>
    public class WeixinKeFuInfo
    {
        public int UId { get; set; }//編號
        public string UserOpenId { get; set; }//用戶的OpenID
        public string UserContent { get; set; }//用戶內容
        public string CreaterDate { get; set; }//建立時間
    }

 

 /// <summary>
    /// 與微信用戶會話的消息記錄類
    /// </summary>
    public class WxMessageInfo
    {
        public int msgId { get; set; }//消息ID
        public string FromUser { get; set; }//發送用戶
        public string ToUser { get; set; }//接收用戶
        public string Content { get; set; }//發送內容
        public string FaSongDate { get; set; }//發送時間
        public string UId { get; set; }//會話用戶的UId,微信會話記錄類外鍵
    }

 

 

 

  /// <summary>
        /// 發送文本。。。。。。。。。。。。。還記得這個方法嗎?就是根據用戶發送過來的消息類型進行判斷後,若是是文本就回復發送此方法內的內容
        /// </summary>
        /// <param name="requestXML"></param>
        private void SendTextCase(RequestXML requestXML)
        {

      WeixinKeFuService wkfs = new WeixinKeFuService();//本身寫的服務類
                //根據openId查詢數據庫會話記錄是否存在
                WeixinKeFuInfo wkfinfoinfo = wkfs.GetWeixinKeFuInfoByOpenId(requestXML.FromUserName.ToString());
                if (wkfinfoinfo != null)
                {
                    //若是存在直接保存消息記錄
                    WxMessageService wms = new WxMessageService();
                    WxMessageInfo wminfo = new WxMessageInfo();
                    wminfo.FromUser = requestXML.FromUserName.ToString();
                    wminfo.ToUser = "";
                    wminfo.Content = requestXML.Content.ToString();
                    wminfo.FaSongDate = System.DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");
                    wminfo.UId = wkfinfoinfo.UId.ToString();
                    wms.AddWxMessageInfo(wminfo);
                }
                else
                {
                    //若是不存在新建會話記錄
                    WeixinKeFuInfo wkfinfo = new WeixinKeFuInfo();
                    wkfinfo.UserOpenId = requestXML.FromUserName.ToString();
                    wkfinfo.UserContent = requestXML.Content.ToString();
                    wkfinfo.CreaterDate = System.DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");
                    wkfs.AddWeixinKeFuInfo(wkfinfo);

                    string responseContent = FormatTextXML(requestXML.FromUserName, requestXML.ToUserName, "正在接入.請稍候.....");

                    HttpContext.Current.Response.ContentType = "text/xml";
                    HttpContext.Current.Response.ContentEncoding = Encoding.UTF8;
                    HttpContext.Current.Response.Write(responseContent);
                    HttpContext.Current.Response.End();
                }

  }

 

 

以上代碼實現了數據庫的插入,那麼取出來,顯示的頁面,核心代碼:WeiXinSessionList.aspx,前臺代碼以下:web

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WeiXinSessionList.aspx.cs" Inherits="DQWebSite.Administrator.WeiXinSessionList" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title></title>
    <meta http-equiv="refresh" content="60; url=WeiXinSessionList.aspx" />
     <link href="css/style.css" rel="Stylesheet" type="text/css" />
    <style type="text/css">
        .tablestyle { width:1124px; margin:10px auto 10px auto; border:1px solid #ecd9df; text-align:center;
        }
        th { height:35px;background-image:url('images/th.gif'); background-repeat:repeat-x;
        }
          tr { height:30px;
            }
            td {
                border-left:1px  dotted #a7b5bc;
            }
        .trcolor { background-color:#ecd9df;
        }
        tr:hover { cursor:pointer;
        }
          #FenPage { width:1124px; height:25px; line-height:25px; text-align:center; margin:20px auto 20px auto;
        }
        .linka { color:#0094ff; cursor:pointer;
        }
        .fenyebtn {width:60px; height:25px; border:1px solid #ced9df; border-radius:5px; text-align:center; line-height:25px; float:right;
        }
        .fenyebtn2 { width:60px; height:25px; border:1px solid #ced9df; border-radius:5px; text-align:center; line-height:25px;margin-left:10px;float:right;
        }
        .toPageIndex { width:60px;height:25px; background-image:url('images/inputbg.gif'); margin-left:10px; background-repeat:repeat-x;border-top:solid 1px #a7b5bc; border-left:solid 1px #a7b5bc; border-right:solid 1px #ced9df; border-bottom:solid 1px #ced9df; text-align:center; float:right;
        }
        .gotoPagebtn { width:60px; height:25px; border:1px solid #ced9df; border-radius:5px; text-align:center; line-height:25px;margin-left:10px;float:right; background-color:#ced9df;
        }
        .deletebtn {float:left;width:100px; color:#000; height:25px; background-color:#ced9df; border:1px solid #ced9df; border-radius:5px; text-align:center;
        }
        #BtnDeleteSelected:hover { cursor:pointer;
        }
        .publishHuoDong {background-color:#ced9df; border:1px solid #ced9df; border-radius:5px;text-align:center; width:100px; color:#000; height:25px; line-height:25px; float:left;
        }
        a { color:#08a5e0;
        }
        .droplist {  background-image:url('images/inputbg.gif'); background-repeat:repeat-x; width:120px; height:25px; border:1px solid #ced9df;
        }
    </style>
      <script type="text/javascript">

          function EditRoster(piciNumber) {
              var url = 'MessageWindow.aspx?id=' + piciNumber;                             //轉向網頁的地址;
              var name = 'add';                            //網頁名稱,可爲空;
              var iWidth = 850;                          //彈出窗口的寬度;
              var iHeight = 600;                         //彈出窗口的高度;
              //得到窗口的垂直位置
              var iTop = (window.screen.availHeight - 30 - iHeight) / 2;
              //得到窗口的水平位置
              var iLeft = (window.screen.availWidth - 10 - iWidth) / 2;
              window.open(url, name, 'height=' + iHeight + ',,innerHeight=' + iHeight + ',width=' + iWidth + ',innerWidth=' + iWidth + ',top=' + iTop + ',left=' + iLeft + ',status=no,toolbar=no,menubar=no,location=no,resizable=no,scrollbars=0,titlebar=no');

          }
    </script>
</head>
<body style="background-image:url('images/ygbg.png'); background-repeat:repeat;">
    <form id="form1" runat="server">
        <div class="place">
                <span>位置:</span>
                <ul class="placeul">
                    <li><a href="WelCome.aspx" target="rightFrame">首頁</a></li>
                    <li>微信管理</li>
                    <li>德橋員工服務中心--會話管理</li>
                </ul>
         </div>
    <div>
        <div style="width:1124px;margin:10px auto 0px 20px;">
            <font style="color:red;">  根據微信公衆平臺規定,用戶主送發起會話後,48小時以內可與該用戶進行無限次會話,超過48小時不能主動會話。</font>
        </div>
        <asp:ScriptManager ID="ScriptManager1" runat="server">
        </asp:ScriptManager>
        <asp:UpdatePanel ID="UpdatePanel1" runat="server">
            <ContentTemplate>
        <table class="tablestyle">
           <asp:Repeater ID="RepeaterGustBookList" runat="server" OnItemDataBound="RepeaterGustBookList_ItemDataBound">
            <HeaderTemplate>
                <tr>
                    <th style="width:50px;"><asp:CheckBox ID="CheckAll" runat="server"
            oncheckedchanged="CheckAll_CheckedChanged" /><br /></th>
                     <th style="width:105px;">openId</th>
<%--                     <th style="width:150px;">暱稱</th>
                     <th style="width:50px;">性別</th>--%>
                    <th style="width:200px;">初始內容</th>
                    <th style="width:100px;">接入時間</th>
                    <th style="width:100px;">近期會話</th>
                    <th style="width:80px;">會話狀態</th>
                    <th style="width:150px;">已過期間</th>
                    <th style="width:100px;">會話操做</th>
                </tr>
            </HeaderTemplate>
            <ItemTemplate>
                <tr style='%#(Container.ItemIndex%2==0)?"#fff":"#ced9ff"%>' >
                    <td><asp:CheckBox ID="CheckIn" runat="server" /></td>
                      <td><asp:Label ID="lbUId" runat="server" Visible="false" Text="Label"></asp:Label>
                          <%# Eval("UserOpenId")%>
                      </td>
<%--                    <td><asp:Label ID="lbNikeName" runat="server" Text="未知"></asp:Label></td>
                     <td><asp:Label ID="lbSex" runat="server" Text="未知"></asp:Label></td>--%>
                    <td><%# (Eval("UserContent").ToString().Length>10)?Eval("UserContent").ToString().Substring(0,10)+"..":Eval("UserContent") %></td>
                    <td><%# Eval("CreaterDate")%></td>
                    <td><asp:Label ID="lblastDate" runat="server" Text="未知"></asp:Label></td>
                    <td><asp:Label ID="lbState" runat="server" Text="未知"></asp:Label></td>
                    <td><asp:Label ID="lbChaoshi" runat="server" Text="未知"></asp:Label></td>
                    <td><a onclick="EditRoster(<%# Eval("UId") %>);">啓動會話</a>  
<%--                        <asp:HyperLink ID="HyperLinkNewSession" runat="server">新建</asp:HyperLink> --%>
                    </td>
                </tr>
            </ItemTemplate>
        </asp:Repeater>
        </table>
             <div id="FenPage">
               <asp:LinkButton ID="LinkBtnToPage" CssClass="gotoPagebtn" runat="server" OnClick="LinkBtnToPage_Click">肯定</asp:LinkButton>
               <asp:TextBox ID="txtPageIndex" CssClass="toPageIndex" runat="server"></asp:TextBox> 
               <asp:HyperLink ID="lnkLast" runat="server"><span class="fenyebtn2">>>|</span></asp:HyperLink> 
                <asp:HyperLink ID="lnkNext" runat="server"><span class="fenyebtn2">></span></asp:HyperLink> 
                 <asp:HyperLink ID="lnkTop" runat="server"><span class="fenyebtn2"><</span></asp:HyperLink> 
                <asp:HyperLink ID="lnkFist" runat="server"><span class="fenyebtn">|<<</span></asp:HyperLink> 
               <asp:Button ID="BtnDelete" runat="server" Text="刪除選中項" CssClass="deletebtn"
                BackColor="ButtonFace" onclick="BtnDelete_Click" />
              <span style="float:left;margin-left:20px;">當前第</span>
               <span style="float:left; color:red;"><asp:Label ID="lbPageIndex" runat="server" Text=""></asp:Label></span>
                <span style="float:left;margin-left:5px;">頁/</span>
                <span style="float:left;margin-left:5px;">共</span>
                <span style="float:left;color:red;"><asp:Label ID="lbCountPage" runat="server" Text=""></asp:Label></span>
                <span style="float:left;margin-left:5px;">頁</span>
                <span style="float:left;margin-left:10px;"><asp:Label ID="lbPageSize" runat="server" Text=""></asp:Label></span>
                <span style="float:left;margin-left:10px;">共搜索到 </span>
                <span style="float:left;margin-left:5px; color:red;"><asp:Label ID="lbCountData" runat="server" Text=""></asp:Label></span>
                <span style="float:left;margin-left:5px;">條記錄.</span>
           </div>
            </ContentTemplate>
        </asp:UpdatePanel>
    </div>
    </form>
</body>
</html>

 

 

 

WeiXinSessionList.aspx.cs後臺代碼以下:數據庫

 

PagedDataSource pds = new PagedDataSource();
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                BindGustBookList();
                this.DataBind();
                UsersInfo user = Session["Users"] as UsersInfo;
                if (user != null && user.RolsId == 1)
                {
                    this.BtnDelete.Enabled = true;
                }
                else
                {
                    this.BtnDelete.Enabled = false;
                }
            }
        }
        private void BindGustBookList()
        {

            WeixinKeFuService wkf = new WeixinKeFuService();
            List<WeixinKeFuInfo> wkflists = wkf.GetAllWeixinKeFuInfoList();


            //if (this.DDLState.SelectedValue.Equals("1"))
            //{
            //    lists = gbs.GetAllGustBookListByState();
            //}
            //else if (this.DDLState.SelectedValue.Equals("2"))
            //{
            //    lists = gbs.GetAllGustBookListByState2();
            //}
            //else
            //{
            //    lists = gbs.GetAllGustBookList();
            //}

            pds.DataSource = wkflists;
            pds.AllowPaging = true;
            pds.PageSize = 20;//每頁顯示爲20條
            int CurrentPage;


            if (!String.IsNullOrWhiteSpace(this.txtPageIndex.Text.ToString().Trim()))
            {

                CurrentPage = Convert.ToInt32(this.txtPageIndex.Text.ToString().Trim());
            }
            else if (Request.QueryString["Page"] != null)
            {
                CurrentPage = Convert.ToInt32(Request.QueryString["Page"]);
            }
            else
            {
                CurrentPage = 1;
            }
            pds.CurrentPageIndex = CurrentPage - 1;//當前頁的索引就等於當前頁碼-1;
            if (!pds.IsFirstPage)
            {
                //Request.CurrentExecutionFilePath 爲當前請求的虛擬路徑
                this.lnkTop.NavigateUrl = Request.CurrentExecutionFilePath + "?Page=" + Convert.ToString(CurrentPage - 1);
                this.lnkFist.Enabled = this.lnkTop.Enabled = true;
                this.lnkNext.Enabled = this.lnkLast.Enabled = true;
            }
            else
            {
                this.lnkFist.Enabled = this.lnkTop.Enabled = false;
                this.lnkNext.Enabled = this.lnkLast.Enabled = true;
                this.lnkFist.Attributes.Add("style", "color:#ced9df;");
                this.lnkTop.Attributes.Add("style", "color:#ced9df;");
                this.lnkNext.Attributes.Remove("style");
                this.lnkLast.Attributes.Remove("style");
            }
            if (!pds.IsLastPage)
            {
                //Request.CurrentExecutionFilePath 爲當前請求的虛擬路徑
                this.lnkNext.NavigateUrl = Request.CurrentExecutionFilePath + "?Page=" + Convert.ToString(CurrentPage + 1);
                this.lnkFist.Enabled = this.lnkTop.Enabled = true;
                this.lnkNext.Enabled = this.lnkLast.Enabled = true;
            }
            else
            {
                this.lnkNext.Enabled = this.lnkLast.Enabled = false;
                this.lnkFist.Enabled = this.lnkTop.Enabled = true;
                this.lnkNext.Attributes.Add("style", "color:#ced9df;");
                this.lnkLast.Attributes.Add("style", "color:#ced9df;");
                this.lnkFist.Attributes.Remove("style");
                this.lnkTop.Attributes.Remove("style");
            }
            this.lnkFist.NavigateUrl = Request.CurrentExecutionFilePath + "?Page=" + Convert.ToString(1);//跳轉至首頁
            this.lnkLast.NavigateUrl = Request.CurrentExecutionFilePath + "?Page=" + Convert.ToString(pds.PageCount);//跳轉至末頁

            this.RepeaterGustBookList.DataSource = pds;
            this.RepeaterGustBookList.DataBind();

            this.lbCountData.Text = wkflists.Count.ToString();
            this.lbPageIndex.Text = (pds.CurrentPageIndex + 1).ToString();
            this.lbPageSize.Text = "每頁" + pds.PageSize.ToString() + "條記錄";
            this.lbCountPage.Text = pds.PageCount.ToString();
            this.txtPageIndex.Text = (pds.CurrentPageIndex + 1).ToString();

            if (int.Parse(wkflists.Count.ToString()) <= int.Parse(pds.PageSize.ToString()))
            {
                this.lnkFist.Visible = this.lnkTop.Visible = this.lnkNext.Visible = this.lnkLast.Visible = this.txtPageIndex.Visible = this.LinkBtnToPage.Visible = false;
            }
            else
            {
                this.lnkFist.Visible = this.lnkTop.Visible = this.lnkNext.Visible = this.lnkLast.Visible = this.txtPageIndex.Visible = this.LinkBtnToPage.Visible = true;
            }

        }
        /// <summary>
        /// 刪除選中
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void BtnDelete_Click(object sender, EventArgs e)
        {
            Boolean bools = false;
            foreach (RepeaterItem di in this.RepeaterGustBookList.Items)
            {
                CheckBox checkIn = (CheckBox)di.FindControl("CheckIn");
                if (checkIn.Checked)
                {
                    bools = true;
                    Label lbGustNo = di.FindControl("lbUId") as Label;
                    WeixinKeFuService wkf = new WeixinKeFuService();
                    int num = wkf.DeleteWeixinKeFuInfo(int.Parse(lbGustNo.Text.ToString()));
                    if (num > 0)
                    {
                        ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "", "alert('刪除成功!');location='WeiXinSessionList.aspx'", true);
                    }
                    else
                    {
                        ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "", "alert('刪除失敗!');location='WeiXinSessionList.aspx'", true);
                    }
                }
            }
            if (!bools)
            {
                ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "", "alert('未選中刪除項!');location='WeiXinSessionList.aspx'", true);
            }
        }
        /// <summary>
        /// 全選全不選
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void CheckAll_CheckedChanged(object sender, EventArgs e)
        {
            CheckBox checkAll = (CheckBox)sender;
            foreach (RepeaterItem d in this.RepeaterGustBookList.Items)
            {
                CheckBox checkIn = (CheckBox)d.FindControl("CheckIn");
                checkIn.Checked = checkAll.Checked;
            }
        }
        protected void LinkBtnLook_Click(object sender, EventArgs e)
        {
            BindGustBookList();
        }
        /// <summary>
        /// 綁定事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void RepeaterGustBookList_ItemDataBound(object sender, RepeaterItemEventArgs e)
        {


            if (e.Item.ItemType == ListItemType.Header)
            {
                CheckBox checkAll = e.Item.FindControl("CheckAll") as CheckBox;
                checkAll.AutoPostBack = true;
            }
            if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
            {
                WeixinKeFuInfo wkf = e.Item.DataItem as WeixinKeFuInfo;

                    Label lbUId = e.Item.FindControl("lbUId") as Label;
                    lbUId.Text = wkf.UId.ToString();

                    WxMessageService wms = new WxMessageService();
                    WxMessageInfo wminfo = wms.GetTopLastFaSongDateByUId(lbUId.Text.ToString());

                    if(wminfo!=null&&!String.IsNullOrWhiteSpace(wminfo.FaSongDate.ToString()))
                    {
                        Label lblastDate = e.Item.FindControl("lblastDate") as Label;

                        lblastDate.Text = wminfo.FaSongDate.ToString();

                        DateTime datesystemss = DateTime.Parse(System.DateTime.Now.ToString());
                        DateTime lastLoingDatess = DateTime.Parse(lblastDate.Text.ToString());

                        TimeSpan ts11 = new TimeSpan(datesystemss.Ticks);
                        TimeSpan ts22 = new TimeSpan(lastLoingDatess.Ticks);

                        TimeSpan ts33 = ts11.Subtract(ts22).Duration();

                        Label lbState = e.Item.FindControl("lbState") as Label;

                        string chaoshifenzhong = ts33.TotalMinutes.ToString();

                        if (double.Parse(chaoshifenzhong) <=10)
                        {
                            lbState.Text = "會話中";
                            lbState.Attributes.Add("style","color:red;");
                        }
                        else
                        {
                            lbState.Text = "已結束";
                        }


                        Label lbChaoshi = e.Item.FindControl("lbChaoshi") as Label;

                        DateTime datesystem = DateTime.Parse(System.DateTime.Now.ToString());
                        DateTime lastLoingDate = DateTime.Parse(lblastDate.Text.ToString());

                        TimeSpan ts1 = new TimeSpan(datesystem.Ticks);
                        TimeSpan ts2 = new TimeSpan(lastLoingDate.Ticks);

                        TimeSpan ts3 = ts1.Subtract(ts2).Duration();

                        lbChaoshi.Text = ts3.Days.ToString() + "" + ts3.Hours.ToString() + "小時" + ts3.Minutes.ToString() + "分鐘";
                    }

                    //////根據用戶的openId獲取用戶暱稱

                    //WeiXinServer wxs = new WeiXinServer();

                    /////從緩存讀取accesstoken
                    //string Access_token = Cache["Access_token"] as string;

                    //if (Access_token == null)
                    //{
                    //    //若是爲空,從新獲取
                    //    Access_token = wxs.GetAccessToken();

                    //    //設置緩存的數據7000秒後過時
                    //    Cache.Insert("Access_token", Access_token, null, DateTime.Now.AddSeconds(7000), System.Web.Caching.Cache.NoSlidingExpiration);
                    //}

                    //string Access_tokento = Access_token.Substring(17, Access_token.Length - 37);

                    //string jsonres = "";


                    //jsonres = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=" + Access_tokento + "&openid=" + wkf.UserOpenId;

                    //HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(jsonres);
                    //myRequest.Method = "GET";
                    //HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
                    //StreamReader reader = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8);
                    //string content = reader.ReadToEnd();
                    //reader.Close();

                    ////使用前需藥引用Newtonsoft.json.dll文件
                    //JObject jsonObj = JObject.Parse(content);


                    //Label lbNikeName = e.Item.FindControl("lbNikeName") as Label;
                    //Label lbSex = e.Item.FindControl("lbSex") as Label;
                    //lbNikeName.Text = jsonObj["nickname"].ToString();
                    //if (jsonObj["sex"].ToString().Equals("1"))
                    //{
                    //    lbSex.Text = "男";
                    //}
                    //else
                    //{
                    //    lbSex.Text = "女";
                    //}

            }
        }
        /// <summary>
        /// 輸入頁碼提交跳轉
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void LinkBtnToPage_Click(object sender, EventArgs e)
        {

            if (String.IsNullOrWhiteSpace(this.txtPageIndex.Text.ToString().Trim()))
            {
                ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "", "alert('頁碼不能爲空!')", true);
                this.txtPageIndex.Focus();
                return;
            }
            if (IsNum(this.txtPageIndex.Text.ToString().Trim()))
            {
                ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "", "alert('頁碼數只能輸入數字!')", true);
                this.txtPageIndex.Focus();
                this.txtPageIndex.Text = this.lbPageIndex.Text.ToString();
                return;
            }
            if (int.Parse(this.txtPageIndex.Text.ToString().Trim()) > int.Parse(this.lbCountPage.Text.ToString().Trim()))
            {
                ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "", "alert('所輸頁數不能大於總頁數!')", true);
                this.txtPageIndex.Focus();
                this.txtPageIndex.Text = this.lbPageIndex.Text.ToString();
                return;
            }

            BindGustBookList();
        }
        /// <summary>
        /// 判斷是不是數字
        /// </summary>
        /// <param name="text"></param>
        /// <returns></returns>
        public static bool IsNum(string text) //
        {
            for (int i = 0; i < text.Length; i++)
            {
                if (!Char.IsNumber(text, i))
                {
                    return true; //輸入的不是數字   
                }
            }
            return false; //不然是數字
        }

 

 

 

此代碼已包含,後臺分頁功能,仔細研究下,便可使用.json

 點擊開啓會話的頁面:MessageWindow.aspx以下:api

<%@ Page Language="C#" AutoEventWireup="true" ValidateRequest="false" CodeBehind="MessageWindow.aspx.cs" Inherits="DQWebSite.Administrator.MessageWindow" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
     <style type="text/css">
        .messagestyle { width:100%; height:60px; margin-top:10px;
        }
         #LinkBtnSubSend { float:left;
         }
        /*.weixiao{ float:left; background-image:url('images/qqbiaoqing.jpg'); background-repeat:no-repeat; background-position:0px 0px; width:30px; height:28px;
        }
        .piezui { float:left; background-image:url('images/qqbiaoqing.jpg'); background-repeat:no-repeat; background-position:-31px -0px; width:30px; height:28px;
        }
        .hanxiao {float:left; background-image:url('images/qqbiaoqing.jpg'); background-repeat:no-repeat; background-position:-0px -62px; width:30px; height:28px;
        }
        .zhuakuang {float:left; background-image:url('images/qqbiaoqing.jpg'); background-repeat:no-repeat; background-position:-218px -62px; width:28px; height:28px;
        }
         .shuai {float:left; background-image:url('images/qqbiaoqing.jpg'); background-repeat:no-repeat; background-position:-248px -62px; width:28px; height:28px;
        }
         .yiwen {float:left; background-image:url('images/qqbiaoqing.jpg'); background-repeat:no-repeat; background-position:-126px -62px; width:28px; height:28px;
         }
         .liuhan {float:left; background-image:url('images/qqbiaoqing.jpg'); background-repeat:no-repeat; background-position:-404px -30px; width:28px; height:28px;
         }*/
        a:hover { cursor:pointer;
        }
         .LinkBtnSubSend { margin-top:5px;
         }
    </style>
     <script type="text/javascript">

         function LessThan(oTextArea) {

             //得到textarea的maxlength屬性
             var num = oTextArea.getAttribute("maxlength") - oTextArea.value.length;

             document.getElementById("errmsg").innerHTML = "還可輸入的字符數:" + num;

             //返回文本框字符個數是否符號要求的boolean值
             return oTextArea.value.length < oTextArea.getAttribute("maxlength");
         }
    </script>
       <script type="text/javascript" src="../js/jquery-1.7.1.min.js"></script>
    <script src="../ckeditor_4.5.4_full2/ckeditor/ckeditor.js"></script>
</head>
<body>
    <form id="form1" runat="server">
        <div style="height:30px; text-align:left;"> <asp:Label ID="lbduihua1" runat="server" Text="Label"></asp:Label> <span style="color:red;"><asp:Label ID="lbduihuamsg" runat="server" Text="Label"></asp:Label></span> <asp:Label ID="lbduihua2" runat="server" Text="Label"></asp:Label></div>
        <div style="height:200px; width:100%; border:2px groove #ced9df; border-top-left-radius:5px; border-top-right-radius:5px; overflow-y:auto;background-image:url('images/ygbg.png'); background-repeat:repeat;">
        <asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
        <asp:UpdatePanel ID="UpdatePanel1" runat="server">
            <ContentTemplate>
                <ul>
                    <asp:Repeater ID="RepeaterMessageList" runat="server" OnItemDataBound="RepeaterMessageList_ItemDataBound" >
                        <ItemTemplate>
                            <li><span style="color:red;">
                                <asp:Label ID="lbFromUser" runat="server" Text="Label"></asp:Label> </span>對<span style="color:red;"><%# Eval("ToUser") %></span>說:
                                <asp:Image ID="Imagelaba" runat="server" />
                                <br />
                                <%# Eval("Content") %>  [<%# Eval("FaSongDate") %>]<br />
                            </li>
                        </ItemTemplate>
                    </asp:Repeater>     
                </ul>
                 <asp:Timer ID="timeTick" runat="server" Interval="200" OnTick="timeTick_Tick"></asp:Timer>
            </ContentTemplate>
        </asp:UpdatePanel>
        </div>
        <textarea id="txtMessage" name="txtMessage" runat="server" class="ckeditor messagestyle" maxlength="200" onkeypress="return LessThan(this);" onchange="return LessThan(this);"></textarea>
         <script type="text/javascript">CKEDITOR.replace('<%=txtMessage.ClientID.Replace("_","$") %>');</script>
         <div style="height:35px; line-height:35px;">
              <asp:LinkButton ID="LinkBtnSubSend" CssClass="LinkBtnSubSend" runat="server" OnClick="LinkBtnSubSend_Click"><div style="background-image:url('images/buttonbg.png'); width:111px; height:35px; line-height:35px; font-weight:bold; text-align:center; float:left; color:#fff;">發送</div></asp:LinkButton>
            <span id="errmsg" style="color:red;" runat="server" >該推送功能直接將信息推送到對方用戶微信,謹慎發言</span>
         </div>
    </form>
</body>
</html>

 

 

 

MessageWindow.aspx.cs的核心代碼以下:緩存

 

protected void Page_Load(object sender, EventArgs e)
        {
            if(!Page.IsPostBack)
            {
                if(Request.QueryString["id"]!=null)
                {
                    WeixinKeFuService wkfs = new WeixinKeFuService();

                    WeixinKeFuInfo wkfinfo = wkfs.GetWeixinKeFuInfoByid(int.Parse(Request.QueryString["id"].ToString()));
                    this.lbduihuamsg.Text = wkfinfo.UserOpenId.ToString();

                    this.lbduihua1.Text = "正在於";
                    this.lbduihua2.Text = "對話中.......";

                    WxMessageService wms = new WxMessageService();
                    WxMessageInfo wminfo = wms.GetTopLastFaSongDateByUId(wkfinfo.UId.ToString());


                    if (wminfo != null)
                    {

                        DateTime datesystemss = DateTime.Parse(System.DateTime.Now.ToString());
                        DateTime lastLoingDatess = DateTime.Parse(wminfo.FaSongDate.ToString());

                        TimeSpan ts11 = new TimeSpan(datesystemss.Ticks);
                        TimeSpan ts22 = new TimeSpan(lastLoingDatess.Ticks);

                        TimeSpan ts33 = ts11.Subtract(ts22).Duration();

                        string chaodays = ts33.TotalDays.ToString();

                        if (double.Parse(chaodays) >=2)
                        {
                            this.LinkBtnSubSend.Enabled = false;
                            this.errmsg.InnerText = "會話已結束!超過48小時不能主動推送信息給該用戶!";
                            this.lbduihua1.Text = "已經於";
                            this.lbduihua2.Text = "失去鏈接.....除非該用戶主動會話才能從新創建鏈接!";
                            this.txtMessage.Attributes.Add("readonly","true");
                        }
                    }

                    BindMsgList();

                    this.DataBind();
                }
            }
        }

        private void BindMsgList()
        {
            string id = Request.QueryString["id"].ToString();


            WxMessageService wms = new WxMessageService();

            List<WxMessageInfo> wmlist = wms.GetAllMessageList(id);

            if(wmlist.Count>0)
            {
                this.RepeaterMessageList.DataSource = wmlist;
                this.RepeaterMessageList.DataBind();
            }

        }

        protected void timeTick_Tick(object sender, EventArgs e)
        {
            BindMsgList();
        }
        /// <summary>
        /// 推送消息到用戶
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void LinkBtnSubSend_Click(object sender, EventArgs e)
        {
            if(String.IsNullOrWhiteSpace(this.txtMessage.Value.ToString().Trim()))
            {
                this.errmsg.InnerText = "發送的內容不能爲空!";
                this.txtMessage.Focus();
                return;
            }
            if (this.txtMessage.Value.ToString().Length < 5 || this.txtMessage.Value.ToString().Length > 200)
            {
                this.errmsg.InnerText = "發送內容應在5-200個字符之間!";
                this.txtMessage.Focus();
                return;
            }

            //若是存在直接保存消息記錄
            WxMessageService wms = new WxMessageService();
            WxMessageInfo wminfo = new WxMessageInfo();
            wminfo.FromUser = "";
            wminfo.ToUser = this.lbduihuamsg.Text.ToString();
            wminfo.Content = this.txtMessage.Value.ToString().Trim();
            wminfo.FaSongDate = System.DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");
            wminfo.UId = Request.QueryString["id"].ToString();
            wms.AddWxMessageInfo(wminfo);



            WeiXinServer wxs = new WeiXinServer();
            string res = "";

            ///從緩存讀取accesstoken
            string Access_token = Cache["Access_token"] as string;

            if(Access_token==null)
            {
                //若是爲空,從新獲取
                Access_token = wxs.GetAccessToken();

                //設置緩存的數據7000秒後過時
                Cache.Insert("Access_token", Access_token, null, DateTime.Now.AddSeconds(7000), System.Web.Caching.Cache.NoSlidingExpiration);
            }


            string Access_tokento = Access_token.Substring(17, Access_token.Length - 37);

            string txtcontent = this.txtMessage.Value.ToString().Replace("<p>", "");
            StringBuilder sb = new StringBuilder();
            sb.Append(txtcontent.Replace("</p>\r\n", ""));

            string posturl = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=" + Access_tokento;
            string postData = "{\"touser\":\"" + this.lbduihuamsg.Text.ToString() + "\",\"msgtype\":\"text\",\"text\":{\"content\":\"" + sb.ToString() + "\"}}";
            res = wxs.GetPage(posturl, postData);


            //使用前需藥引用Newtonsoft.json.dll文件
            JObject jsonObj = JObject.Parse(res);

            ///獲取返回結果的正確|true|false
            string isright = jsonObj["errcode"].ToString();//0
            string istrueorfalse = jsonObj["errmsg"].ToString();//ok
            if (isright.Equals("0") && istrueorfalse.Equals("ok"))
            {
                this.errmsg.InnerText = "消息推送成功!消息已送達微信用戶!";
                this.txtMessage.Value = "";
            }
            else
            {
                this.errmsg.InnerText = "消息推送失敗!消息已保存至數據庫!";
            }
        }

        protected void RepeaterMessageList_ItemDataBound(object sender, RepeaterItemEventArgs e)
        {
            if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
            {
                WxMessageInfo wminfo = e.Item.DataItem as WxMessageInfo;

                Image Imagelaba = e.Item.FindControl("Imagelaba") as Image;

                Label lbFromUser = e.Item.FindControl("lbFromUser") as Label;

                lbFromUser.Text = wminfo.FromUser.ToString();


                if (wminfo.FromUser.ToString().Equals(""))
                {
                    Imagelaba.ImageUrl = "images/fa.gif";
                }
                else
                {
                    Imagelaba.ImageUrl = "images/shou.gif";
                }

            }
        }

 

 

以上就是會話管理功能的所有核心代碼,僅供參考!另外若是因使用富文本編輯器報下列錯誤:

A potentially dangerous Request.Form value was detected from the client

解決方法:

用戶在頁面上提交表單到服務器時,服務器會檢測到一些潛在的輸入風險,例如使用富文本編輯器控件(RichTextBox、 FreeTextBox、CuteEditor等)編輯的內容中包含有HTML標記或腳本標記,ASP.NET頁面會拋出一個"A potentially dangerous Request.Form value was deceted from the client"的異常。這個是ASP.NET頁面爲了防範頁面注入功能的一種保護機制,要取消這種保護,常規的作法是在.aspx文件 的<%@Page %>部分加入ValidateRequest="false"屬性。可是從.NET 4.0開始你可能須要多修改一個地方,在網站的web.config文件中加入這行配置:

<system.web> <compilation debug="true" targetFramework="4.0"/> <httpRuntime requestValidationMode="2.0"/> </system.web>

同時,你還須要確保頁面上用戶輸入的部分不會存在任何注入攻擊的代碼,經常使用的作法是使用Encode處理。

相關文章
相關標籤/搜索