How to develop customer service interface on Wechat official account
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!