Network Security Internet Technology Development Database Servers Mobile Phone Android Software Apple Software Computer Software News IT Information

In addition to Weibo, there is also WeChat

Please pay attention

WeChat public account

Shulou

How to develop customer service interface on Wechat official account

2025-01-19 Update From: SLTechnology News&Howtos shulou NAV: SLTechnology News&Howtos > Development >

Share

Shulou(Shulou.com)06/03 Report--

This article mainly introduces the Wechat official account how to develop customer service interface, has a certain reference value, interested friends can refer to, I hope you can learn a lot after reading this article, let the editor take you to know about it.

Kf_account.cs Code:

Public partial class Kf_account: Form {private readonly DataTable adt_user = new DataTable (); private readonly string as_INIFile = Application.StartupPath + "\\ user.ini"; public Kf_account () {BindUser ();} private void BindUser () {if (! File.Exists (as_INIFile)) {var str = new StringBuilder (); str.Append (" The content is automatically generated by the program. Please do not modify the contents of this file\ r\ n "); str.Append (" [total]\ r\ n "); str.Append (" total=\ r\ n "); str.Append (" [count]\ r\ n "); str.Append (" count=\ r\ n "); str.Append (" [user]\ r\ n "); / / StreamWriter sw = default (StreamWriter) / / sw = File.CreateText (ls_INIFile); / / sw.WriteLine (str.ToString ()); / / sw.Close (); File.WriteAllText (as_INIFile, str.ToString (), Encoding.Unicode); File.SetAttributes (as_INIFile, FileAttributes.Hidden);} CheckForIllegalCrossThreadCalls = false; InitializeComponent (); Icon = Resource1.ico Lkl_num.Text = INIFile.ContentValue ("total", "total", as_INIFile); lkl_num_c.Text = INIFile.ContentValue ("count", "count", as_INIFile); pictureBox1.Visible = true; var sr = new StreamReader (as_INIFile, Encoding.Unicode); String line; int li_count = 0; adt_user.Columns.Clear () Adt_user.Columns.Add ("username", Type.GetType ("System.String")); adt_user.Columns.Add ("openid", Type.GetType ("System.String")); while ((line = sr.ReadLine ())! = null) {li_count++; if (li_count > 6) {line = SysVisitor.Current.GetFormatStr (line); DataRow newRow NewRow = adt_user.NewRow (); newRow ["username"] = line.Substring (0, line.LastIndexOf ('=')); newRow ["openid"] = line.Substring (line.LastIndexOf ('=') + 1); adt_user.Rows.Add (newRow);}} sr.Close (); dataGridView1.AutoGenerateColumns = false; dataGridView1.DataSource = adt_user / / dataGridView1.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.DisplayedCells; lbl_count.Text = "Total" + (li_count-6) + "Line"; pictureBox1.Visible = false;} private void btn_GetUser_Click (object sender, EventArgs e) {if (MessageBox.Show (@ ") the speed of pulling user information depends on your followers and the speed of the network, and it may take several minutes or more. Using this feature consumes a large number of user management interface quotas. Do you want to continue this operation? " , "prompt:", MessageBoxButtons.YesNo) = = DialogResult.No) {return;} var thr = new Thread (Get_user_list); thr.Start ();} private void Get_user_list () {File.Delete (as_INIFile); var str = new StringBuilder (); str.Append (" The content is automatically generated by the program. Please do not modify the contents of this file\ r\ n "); str.Append (" [total]\ r\ n "); str.Append (" total=\ r\ n "); str.Append (" [count]\ r\ n "); str.Append (" count=\ r\ n "); str.Append (" [user]\ r\ n ") File.WriteAllText (as_INIFile, str.ToString (), Encoding.Unicode); File.SetAttributes (as_INIFile, FileAttributes.Hidden); string ls_appid = INIFile.ContentValue ("weixin", "Appid"); string ls_secret = INIFile.ContentValue ("weixin", "AppSecret"); string access_token = ""; string menu = "" If (ls_appid.Length! = 18 | | ls_secret.Length! = 32) {MessageBox.Show ("your Appid or AppSecret is not correct, please check before you operate"); return;} access_token = SysVisitor.Current.Get_Access_token (ls_appid, ls_secret); if (access_token = ") {MessageBox.Show (" Appid or AppSecret is not correct, please check before you operate ") Return;} menu = SysVisitor.Current.GetPageInfo ("https://api.weixin.qq.com/cgi-bin/user/get?access_token=" + access_token); if (menu.Substring (2,7) = =" errcode ") {MessageBox.Show (" pull failed, return message:\ r\ n "+ menu);} JObject json = JObject.Parse (menu) Lkl_num.Text = json ["total"]. ToString (); INIFile.SetINIString ("total", "total", lkl_num.Text, as_INIFile); lkl_num_c.Text = json ["count"]. ToString (); INIFile.SetINIString ("count", "count", lkl_num_c.Text, as_INIFile); int li_count = int.Parse (json ["count"]. ToString ()) Btn_GetUser.Enabled = false; pictureBox1.Visible = true; FileStream fs = null; Encoding encoder = Encoding.Unicode; for (int I = 0; I

< li_count; i++) { string openid, username; openid = Get_UserName(json["data"]["openid"][i].ToString()); username = json["data"]["openid"][i].ToString(); //INIFile.SetINIString("user", openid, username, as_INIFile); byte[] bytes = encoder.GetBytes(openid + "=" + username + " \r\n"); fs = File.OpenWrite(as_INIFile); //设定书写的開始位置为文件的末尾 fs.Position = fs.Length; //将待写入内容追加到文件末尾 fs.Write(bytes, 0, bytes.Length); fs.Close(); lab_nums.Text = "已拉取" + i + "个,还剩" + (li_count - i) + "个,请耐心等待"; } lab_nums.Text = ""; //BindUser(); btn_GetUser.Enabled = true; pictureBox1.Visible = false; MessageBox.Show("已全部拉取完毕,请重新打开该窗口"); } /// /// 获取用户信息详情,返回json /// /// private string Get_User(string as_openid) { string ls_json = ""; string access_token = ""; access_token = SysVisitor.Current.Get_Access_token(); ls_json = SysVisitor.Current.GetPageInfo("https://api.weixin.qq.com/cgi-bin/user/info?access_token=" + access_token + "&openid=" + as_openid + "&lang=zh_CN"); return ls_json; } /// /// 获取用户用户的昵称 /// private string Get_UserName(string as_openid) { string ls_json = ""; ls_json = Get_User(as_openid); string username = ""; JObject json = JObject.Parse(ls_json); username = json["nickname"].ToString(); username = SysVisitor.Current.GetFormatStr(username); return username; } private void btn_search_Click(object sender, EventArgs e) { string username = txt_search.Text.Trim(); if (string.IsNullOrWhiteSpace(username)) { return; } DataRow[] datarows = adt_user.Select("username like '%" + username + "%'"); var ldt = new DataTable(); ldt.Columns.Clear(); ldt.Columns.Add("username", Type.GetType("System.String")); ldt.Columns.Add("openid", Type.GetType("System.String")); ldt = ToDataTable(datarows); try { lbl_count.Text = ldt.Rows.Count.ToString(); } catch { } dataGridView1.AutoGenerateColumns = false; dataGridView1.DataSource = ldt; } public DataTable ToDataTable(DataRow[] rows) { if (rows == null || rows.Length == 0) return null; DataTable tmp = rows[0].Table.Clone(); // 复制DataRow的表结构 foreach (DataRow row in rows) tmp.Rows.Add(row.ItemArray); // 将DataRow添加到DataTable中 return tmp; } private void dataGridView1_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e) { try { SysVisitor.Current.Wx_openid = dataGridView1.Rows[dataGridView1.CurrentCell.RowIndex].Cells[1].Value.ToString(); SysVisitor.Current.Wx_username = dataGridView1.Rows[dataGridView1.CurrentCell.RowIndex].Cells[0].Value.ToString(); //MessageBox.Show(str); grb_chat.Enabled = true; grb_chat.Text = SysVisitor.Current.Wx_username; } catch { } webBrowser_msg.DocumentText = ""; string url = string.Format("https://api.weixin.qq.com/cgi-bin/customservice/getrecord?access_token={0}", SysVisitor.Current.Get_Access_token()); string ls_text = @"{"; ls_text += "\"starttime\" : " + DateTime.Now.AddDays(-3).Ticks + ","; ls_text += "\"endtime\" : " + DateTime.Now.Ticks + ","; ls_text += "\"openid\" : \"" + SysVisitor.Current.Wx_openid + "\","; ls_text += "\"pagesize\" : 1000,"; ls_text += "\"pageindex\" : 1,"; ls_text += "}"; string ls_history = SysVisitor.Current.PostPage(url, ls_text); webBrowser_msg.DocumentText = ls_history; } private void btn_send_Click(object sender, EventArgs e) { string ls_msg = richTextBox_msg.Text; string ls_text = @"{"; ls_text += "\"touser\":\"" + SysVisitor.Current.Wx_openid + "\","; ls_text += "\"msgtype\":\"text\","; ls_text += "\"text\":"; ls_text += "{"; ls_text += "\"content\":\"" + ls_msg + "\""; ls_text += "}"; ls_text += "}"; string url = string.Format("https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token={0}", SysVisitor.Current.Get_Access_token()); string ls_isright = SysVisitor.Current.PostPage(url, ls_text); webBrowser_msg.DocumentText += "" + ls_isright + ""; } private void btn_addkf_Click(object sender, EventArgs e) { string url = string.Format("https://api.weixin.qq.com/customservice/kfaccount/add?access_token={0}", SysVisitor.Current.Get_Access_token()); //客服账号 设置 xxx@你的公众号 这样的格式才是正确的哟。 string ls_text = "{"; ls_text += "\"kf_account\":test2@gz-sisosoft,"; ls_text += "\"nickname\":\"客服2\","; ls_text += "\"password\":\"12345\","; ls_text += "}"; string ls_kf = @"{ 'kf_account' : 'test1@gz-sisosoft', 'nickname' : '客服1', 'password' : '123456', }"; string ls_isok = SysVisitor.Current.PostPage(url, ls_text); MessageBox.Show(ls_isok); } private void Kf_account_Load(object sender, EventArgs e) { } } SysVisitor.cs代码: class SysVisitor { private static SysVisitor visit = null; public static SysVisitor Current { get { if (visit == null) visit = new SysVisitor(); return visit; } } /// /// 获取access_token /// ///appid ///appsecret /// public string Get_Access_token(string appid, string appsecret) { string secondappid = INIFile.ContentValue("weixin", "secondappid"); if (appid.ToLower() == secondappid.ToLower()) { string ls_time = INIFile.ContentValue("weixin", "gettime"); Decimal ldt; try { ldt = Convert.ToDecimal(ls_time); if (Convert.ToDecimal(DateTime.Now.ToString("yyyyMMddHHmmss")) - ldt < 7100)//每两个小时刷新一次 { return INIFile.ContentValue("weixin", "access_token"); } } catch { } } string ls_appid = appid.Replace(" ", ""); string ls_secret = appsecret.Replace(" ", ""); string access_token = ""; string url = string.Format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}", ls_appid, ls_secret); string json_access_token = GetPageInfo(url); //DataTable dt = Json.JsonToDataTable(json_access_token); DataTable dt = JsonHelper.JsonToDataTable(json_access_token); try { access_token = dt.Rows[0]["access_token"].ToString(); } catch { return ""; } INIFile.SetINIString("weixin", "gettime", DateTime.Now.ToString("yyyyMMddHHmmss")); INIFile.SetINIString("weixin", "access_token", access_token); INIFile.SetINIString("weixin", "secondappid", ls_appid); return access_token; } /// /// 获取access_token /// public string Get_Access_token() { string ls_appid = INIFile.ContentValue("weixin", "Appid"); string ls_secret = INIFile.ContentValue("weixin", "AppSecret"); return Get_Access_token(ls_appid, ls_secret); } /// /// Get方法请求url并接收返回消息 /// ///Url地址 /// public string GetPageInfo(string url) { HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); string ret = string.Empty; Stream s; string StrDate = ""; string strValue = ""; if (response.StatusCode == HttpStatusCode.OK) { s = response.GetResponseStream(); ////在这儿处理返回的文本 StreamReader Reader = new StreamReader(s, Encoding.UTF8); while ((StrDate = Reader.ReadLine()) != null) { strValue += StrDate + "\r\n"; } //strValue = Reader.ReadToEnd(); } return strValue; } /// /// Post方法 /// ///URL ///Post数据 /// public string PostPage(string posturl, string postData) { Stream outstream = null; Stream instream = null; StreamReader sr = null; HttpWebResponse response = null; HttpWebRequest request = null; Encoding encoding = Encoding.UTF8; byte[] data = encoding.GetBytes(postData); // 准备请求... try { // 设置参数 request = WebRequest.Create(posturl) as HttpWebRequest; CookieContainer cookieContainer = new CookieContainer(); request.CookieContainer = cookieContainer; request.AllowAutoRedirect = true; request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; request.ContentLength = data.Length; outstream = request.GetRequestStream(); outstream.Write(data, 0, data.Length); outstream.Close(); //发送请求并获取相应回应数据 response = request.GetResponse() as HttpWebResponse; //直到request.GetResponse()程序才开始向目标网页发送Post请求 instream = response.GetResponseStream(); sr = new StreamReader(instream, encoding); //返回结果网页(html)代码 string content = sr.ReadToEnd(); string err = string.Empty; return content; } catch (Exception ex) { string err = ex.Message; return string.Empty; } } /// /// 格式化字符串 /// /// /// public string GetFormatStr(string str) { if ("" == str) return ""; else { str = str.Trim(); str = str.Replace("'", "'"); str = str.Replace("〈", ""); str = str.Replace(",", ","); return str; } } string ls_username = ""; /// /// 用户名 /// public string Wx_username { get { return ls_username; } set { ls_username = value; } } string ls_openid = ""; /// /// Openid /// public string Wx_openid { get { return ls_openid; } set { ls_openid = value; } } } INIFile.cs代码: class INIFile { ///// ///// 设置INI文件参数 ///// /////INI文件中的段落 /////INI文件中的关键字 /////INI文件中关键字的数值 /////INI文件的完整的路径和名称 ///// //[DllImport("kernel32")] //private static extern long WritePrivateProfileString( // string section, string key, string val, string filePath); ///// ///// 获取INI文件参数 ///// /////INI文件中的段落名称 /////INI文件中的关键字 /////无法读取时候时候的缺省数值 /////读取数值 /////数值的大小 /////INI文件的完整路径和名称 //[DllImport("kernel32")] //private static extern int GetPrivateProfileString( // string section, string key, string def, StringBuilder retVal, int size, string filePath); //static string gs_FileName = System.AppDomain.CurrentDomain.BaseDirectory + "Config.ini"; ///// ///// 获取INI文件参数 ///// /////INI文件中的段落名称 /////INI文件中的关键字 /////INI文件的完整路径和名称 //public static string GetINIString(string as_section, string as_key, string as_FileName) //{ // StringBuilder temp = new StringBuilder(255); // int i = GetPrivateProfileString(as_section, as_key, "", temp, 255, as_FileName); // return temp.ToString(); //} ///// ///// 获取INI文件参数 ///// /////INI文件中的段落名称 /////INI文件中的关键字 /////INI文件的完整路径和名称 //public static string GetINIString(string as_section, string as_key) //{ // return GetINIString(as_section, as_key, gs_FileName); //} ///// ///// 设置INI文件参数 ///// /////INI文件中的段落 /////INI文件中的关键字 /////INI文件中关键字的数值 /////INI文件的完整路径和名称 //public static long SetINIString(string as_section, string as_key, string as_Value, string as_FileName) //{ // return WritePrivateProfileString(as_section, as_key, as_Value, as_FileName); //} ///// ///// 设置INI文件参数 ///// /////INI文件中的段落 /////INI文件中的关键字 /////INI文件中关键字的数值 //public static long SetINIString(string as_section, string as_key, string as_Value) //{ // return SetINIString(as_section, as_key, as_Value, gs_FileName); //} /// /// 写入INI文件 /// ///节点名称[如[TypeName]] ///键 ///值 ///文件路径 /// [DllImport("kernel32")] public static extern long WritePrivateProfileString(string section, string key, string val, string filepath); [DllImport("kernel32.dll")] public extern static int GetPrivateProfileSectionNamesA(byte[] buffer, int iLen, string fileName); /// /// 写入INI文件(section:节点名称 key:键 val:值) /// ///节点名称 ///键 ///值 /// public static long SetINIString(string section, string key, string val, string as_FilePath = "") { if (as_FilePath == "") { return (WritePrivateProfileString(section, key, val, strFilePath)); } else { return (WritePrivateProfileString(section, key, val, as_FilePath)); } } /// /// 读取INI文件 /// ///节点名称 ///键 ///值 ///stringbulider对象 ///字节大小 ///文件路径 /// [DllImport("kernel32")] public static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retval, int size, string filePath); public static string strFilePath = Application.StartupPath + "\\Config.ini";//获取INI文件默认路径 public static string strSec = ""; //INI文件名 /// /// 读取INI文件中的内容方法 (Section 节点名称;key 键) /// ///节点名称 ///键 /// public static string ContentValue(string Section, string key, string as_FilePath = "") { StringBuilder temp = new StringBuilder(1024); if (as_FilePath == "") { GetPrivateProfileString(Section, key, "", temp, 1024, strFilePath); } else { GetPrivateProfileString(Section, key, "", temp, 1024, as_FilePath); } return temp.ToString(); } /// /// 获取指定小节所有项名和值的一个列表 /// ///节 段,欲获取的小节。注意这个字串不区分大小写 ///缓冲区 返回的是一个二进制的串,字符串之间是用"\0"分隔的 ///缓冲区的大小 ///初始化文件的名字。如没有指定完整路径名,windows就在Windows目录中查找文件 /// [DllImport("kernel32")] public static extern int GetPrivateProfileSection(string section, byte[] buffer, int nSize, string filePath); /// /// 获取指定段section下的所有键值对 返回集合的每一个键形如"key=value" /// ///指定的段落 ///ini文件的绝对路径 /// public static List ReadKeyValues(string section, string as_FilePath = "") { byte[] buffer = new byte[32767]; List list = new List(); int length = 0; if (as_FilePath == "") { length = GetPrivateProfileSection(section, buffer, buffer.GetUpperBound(0), strFilePath); } else { length = GetPrivateProfileSection(section, buffer, buffer.GetUpperBound(0), as_FilePath); } string temp; int postion = 0; for (int i = 0; i < length; i++) { if (buffer[i] == 0x00) //以'\0'来作为分隔 { temp = System.Text.ASCIIEncoding.Default.GetString(buffer, postion, i - postion).Trim(); postion = i + 1; if (temp.Length >

0) {list.Add (temp);} return list } / delete the specified key / paragraph name to be written / the full path and file name of the key / INI file to be deleted, public static void DelKey (string section, string key, string as_FilePath = "") {if (as_FilePath = = "") {WritePrivateProfileString (section, key, null, strFilePath) } else {WritePrivateProfileString (section, key, null, as_FilePath);}} / return the collection of all Section names in the configuration file / public static ArrayList ReadSections () {byte [] buffer = new byte [65535]; int rel = GetPrivateProfileSectionNamesA (buffer, buffer.GetUpperBound (0), strFilePath); int iCnt, iPos ArrayList arrayList = new ArrayList (); string tmp; if (rel > 0) {iCnt = 0; iPos = 0; for (iCnt = 0; iCnt < rel; iCnt++) {if (buffer [iCnt] = = 0x00) {tmp = System.Text.ASCIIEncoding.UTF8.GetString (buffer, iPos, iCnt-iPos). Trim (); iPos = iCnt+ 1 If (tmp! = ") arrayList.Add (tmp);} return arrayList;}}

Running result:

Write the picture description here.

Thank you for reading this article carefully. I hope the article "how to develop customer service interface on Wechat official account" shared by the editor will be helpful to everyone. At the same time, I also hope that you will support and follow the industry information channel. More related knowledge is waiting for you to learn!

Welcome to subscribe "Shulou Technology Information " to get latest news, interesting things and hot topics in the IT industry, and controls the hottest and latest Internet news, technology news and IT industry trends.

Views: 0

*The comments in the above article only represent the author's personal views and do not represent the views and positions of this website. If you have more insights, please feel free to contribute and share.

Share To

Development

Wechat

© 2024 shulou.com SLNews company. All rights reserved.

12
Report