和微信用戶的溝通少不了,總覺得看起來微信官網後台管理中的會話回復消息有點呆板,所以我這裡就自定義了一個會話管理功能,最終效果圖如下:
因為我試使用富文本文件CKEDITOR來進行編寫,你看到穩中可能會有<P></p>字段,後台獲取數據內容時,替換為空字符即可:如下
string txtcontent = this.txtMessage.Value.ToString().Replace("<p>", ""); StringBuilder sb = new StringBuilder(); sb.Append(txtcontent.Replace("</p>\r\n", ""));
在我個人理解,做會話管理,無非就是將用戶對話信息(用戶發過來的數據,發給用戶的數據)存入數據庫,根據用戶的數據時間和回復用戶數據的時間來和當天系統的時間做對比,如果大於多少分鐘或者多少個小時就不可以再主動和用戶對話,就算我這裡是根據微信官網48小時來進行限制的,超過48小時禁用控件,如下圖:
廢話少說,上代碼:需要用到的兩個類,數據庫也要創建和類相同的名字(至少我試這麼做的)
/// <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,前台代碼如下:
<%@ 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; //否則是數字 }
此代碼已包含,後台分頁功能,仔細研究下,即可使用.
點擊開啟會話的頁面:MessageWindow.aspx如下:
<%@ 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"; } } }
本文已被整理到了《ASP.NET微信開發教程匯總》,歡迎大家學習閱讀。
以上就是會話管理功能的全部核心代碼,僅供參考,希望對大家的學習有所幫助。