微信公众号开发客服接口实例代码

最近,开发微信公众号,负责开发客服功能,这里简单记录下:

Kf_account.cs代码:

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(";内容由程序自动生成,请不要修改此文件内容\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 = "共" + (li_count - 6) + "行"; pictureBox1.Visible = false; } private void btn_GetUser_Click(object sender, EventArgs e) { if (MessageBox.Show(@"拉取用户信息的速度取决于你的关注数与网络速度, 可能需要几分钟甚至更长时间。 使用此功能将消耗大量用户管理接口配额。 要继续此操作吗?", "提示:", 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(";内容由程序自动生成,请不要修改此文件内容\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("你的Appid或AppSecret不对,请检查后再操作"); return; } access_token = SysVisitor.Current.Get_Access_token(ls_appid, ls_secret); if (access_token == "") { MessageBox.Show("Appid或AppSecret不对,请检查后再操作"); 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("拉取失败,返回消息:\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("已全部拉取完毕,请重新打开该窗口"); } /// <summary> /// 获取用户信息详情,返回json /// </summary> ///<param name="as_openid"> 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; } /// <summary> /// 获取用户用户的昵称 /// </summary> 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; } } /// <summary> /// 获取access_token /// </summary> ///<param name="appid">appid ///<param name="secret">appsecret /// <returns></returns> 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; } /// <summary> /// 获取access_token /// </summary> 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); } /// <summary> /// Get方法请求url并接收返回消息 /// </summary> ///<param name="strUrl">Url地址 /// <returns></returns> 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; } /// <summary> /// Post方法 /// </summary> ///<param name="posturl">URL ///<param name="postData">Post数据 /// <returns></returns> 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; } } /// <summary> /// 格式化字符串 /// </summary> ///<param name="str"> /// <returns></returns> public string GetFormatStr(string str) { if ("" == str) return ""; else { str = str.Trim(); str = str.Replace("'", "'"); str = str.Replace("〈", "<"); str = str.Replace("〉", ">"); str = str.Replace(",", ","); return str; } } string ls_username = ""; /// <summary> /// 用户名 /// </summary> public string Wx_username { get { return ls_username; } set { ls_username = value; } } string ls_openid = ""; /// <summary> /// Openid /// </summary> public string Wx_openid { get { return ls_openid; } set { ls_openid = value; } } }

INIFile.cs代码:

class INIFile { ///// <summary> ///// 设置INI文件参数 ///// </summary> /////<param name="section">INI文件中的段落 /////<param name="key">INI文件中的关键字 /////<param name="val">INI文件中关键字的数值 /////<param name="filePath">INI文件的完整的路径和名称 ///// <returns></returns> //[DllImport("kernel32")] //private static extern long WritePrivateProfileString( // string section, string key, string val, string filePath); ///// <summary> ///// 获取INI文件参数 ///// </summary> /////<param name="section">INI文件中的段落名称 /////<param name="key">INI文件中的关键字 /////<param name="def">无法读取时候时候的缺省数值 /////<param name="retVal">读取数值 /////<param name="size">数值的大小 /////<param name="filePath">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"; ///// <summary> ///// 获取INI文件参数 ///// </summary> /////<param name="as_section">INI文件中的段落名称 /////<param name="as_key">INI文件中的关键字 /////<param name="as_FileName">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(); //} ///// <summary> ///// 获取INI文件参数 ///// </summary> /////<param name="as_section">INI文件中的段落名称 /////<param name="as_key">INI文件中的关键字 /////<param name="as_FileName">INI文件的完整路径和名称 //public static string GetINIString(string as_section, string as_key) //{ // return GetINIString(as_section, as_key, gs_FileName); //} ///// <summary> ///// 设置INI文件参数 ///// </summary> /////<param name="as_section">INI文件中的段落 /////<param name="as_key">INI文件中的关键字 /////<param name="as_Value">INI文件中关键字的数值 /////<param name="as_FileName">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); //} ///// <summary> ///// 设置INI文件参数 ///// </summary> /////<param name="as_section">INI文件中的段落 /////<param name="as_key">INI文件中的关键字 /////<param name="as_Value">INI文件中关键字的数值 //public static long SetINIString(string as_section, string as_key, string as_Value) //{ // return SetINIString(as_section, as_key, as_Value, gs_FileName); //} /// <summary> /// 写入INI文件 /// </summary> ///<param name="section">节点名称[如[TypeName]] ///<param name="key">键 ///<param name="val">值 ///<param name="filepath">文件路径 /// <returns></returns> [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); /// <summary> /// 写入INI文件(section:节点名称 key:键 val:值) /// </summary> ///<param name="section">节点名称 ///<param name="key">键 ///<param name="val">值 /// <returns></returns> 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)); } } /// <summary> /// 读取INI文件 /// </summary> ///<param name="section">节点名称 ///<param name="key">键 ///<param name="def">值 ///<param name="retval">stringbulider对象 ///<param name="size">字节大小 ///<param name="filePath">文件路径 /// <returns></returns> [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文件名 /// <summary> /// 读取INI文件中的内容方法 (Section 节点名称;key 键) /// </summary> ///<param name="Section">节点名称 ///<param name="key">键 /// <returns></returns> 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(); } /// <summary> /// 获取指定小节所有项名和值的一个列表 /// </summary> ///<param name="section">节 段,欲获取的小节。注意这个字串不区分大小写 ///<param name="buffer">缓冲区 返回的是一个二进制的串,字符串之间是用"\0"分隔的 ///<param name="nSize">缓冲区的大小 ///<param name="filePath">初始化文件的名字。如没有指定完整路径名,windows就在Windows目录中查找文件 /// <returns></returns> [DllImport("kernel32")] public static extern int GetPrivateProfileSection(string section, byte[] buffer, int nSize, string filePath); /// <summary> /// 获取指定段section下的所有键值对 返回集合的每一个键形如"key=value" /// </summary> ///<param name="section">指定的段落 ///<param name="filePath">ini文件的绝对路径 /// <returns></returns> public static List<string> ReadKeyValues(string section, string as_FilePath = "") { byte[] buffer = new byte[32767]; List<string> list = new List<string>(); 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; } /// <summary> /// 删除指定的key /// </summary> ///<param name="section">要写入的段落名 ///<param name="key">要删除的键 ///<param name="fileName">INI文件的完整路径和文件名 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); } } /// <summary> /// 返回该配置文件中所有Section名称的集合 /// </summary> 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; } }</string></string></string>

运行结果:

这里写图片描述

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

时间: 2024-09-20 05:50:02

微信公众号开发客服接口实例代码的相关文章

获取在线客服-微信公众号多客服 获取多客服老是失败

问题描述 微信公众号多客服 获取多客服老是失败 接口放回的错 是accesstoken失效了 可是我accesstoken是先获取存到数据库 然后隔7000秒重新获取 求大神帮我看看 这是获取在线客服的方法 public List<String> getOnlineKefu(AccessToken token) { GET_KEFU_ONLINE = GET_KEFU_ONLINE.replace("ACCESS_TOKEN", token.getToken()); Lis

WPF框架实现微信公众号多客服实例教程(多图)

利用WPF框架作为前端技术,实现桌面版微信多客服系统.项目采用Prism作为前端框架,采用MVVM模式极好的对UI和逻辑代码分离,使用MefBootstrapper集成的MEF IOC容器,解耦各模块对象.合理利用 IEventAggregator 实现事件和交互.文章在介绍对应功能时候会给出相关实现的参考,读者可以参考改进,引入到自己的项目中. 程序运行界面及功能预览: 一.登陆: 功能:支持记住用户和用户设置,可选择记住用户密码. 实现相关: 自定义登陆窗口,引入Microsoft.Wind

微信公众号模板消息群发php实例代码

微信模板消息只能发给一个人,如果要群发,需要通过php循环,依次发送. 注意,如果模板消息发信息时有时无,不稳定,可能你的access_token令牌更新缓存不及时,过期了.可以根据日志文件查看.建议300秒更新一下.否则会很烦. 模板id需要自己去公众号中设置行业后得到.    代码如下 复制代码 <?php  //使用方法.直接在页面的逻辑中增加fahuo_wechat();即可.函数要事先引用.  functionfahuo_wechat($shopid){       if(_cfg(&qu

php 微信公众平台开发模式实现多客服的实例代码_php实例

其实微信公众平台的多客服功能已经出来好久了,并且一出来的时候我就已经为自己的公众号实现了,原本以为大家都已经会了,但是今天还是有人问起这个多客服功能怎么使用,我找了下网上也没什么好的教程,今天我就给大家发一篇比较简单易懂的教程吧 在这篇微信公众平台开发教程中,我们将介绍如何使用开发模式实现多客服系统. 一.回复多客服消息 在新的微信协议中,开发模式也可以接入客服系统. 开发者如果需要让用户使用客服系统,需要在接收到用户发送的消息时,返回一个MsgType为transfer_customer_se

微信公众号开发之微信公共平台消息回复类实例_php技巧

本文实例讲述了微信公众号开发之微信公共平台消息回复类.分享给大家供大家参考.具体如下: 微信公众号开发代码我在网上看到了有不少,其实都是大同小义了都是参考官方给出的demo文件进行修改的,这里就给各位分享一个. 复制代码 代码如下: <?php /**  * 微信公共平台消息回复类  *  *  */ class BBCweixin{    private $APPID="******";  private $APPSECRET="******";  /*  

微信公众平台多客服新增自定义客服头像和消息转发接口功能

多客服一般是开放给微信认证服务号的一个便捷功能,可以将消息转发到多客服方便回复.对有些"选择综合症"的客服,看到那一层不变的客服头像就想吐槽.现在好了,多客服新增自定义客服头像和接口功能,也可以自定义昵称 一.开通"多客服"的公众号可为客服工号配置自定义头像. 使用6.0.2版微信的用户在同公众号进行客服沟通时,可以看到配置的客服头像和昵称. 二.为满足公众号个性化客服需求,公众平台为开发者提供了"多客服"相关接口,可将消息转发到多客服 和 消息

微信公众号开发 自定义菜单跳转页面并获取用户信息实例详解_基础知识

微信公众号开发 自定义菜单 请先读完本文再进行配置开发 请先前往微信平台开发者文档阅读"网页授权获取用户基本信息"的接口说明 在微信公众账号开发中,往往有定义一个菜单,然后用户点击该菜单就进入用户个人中心的功能,通常应用于各个公众账号中的会员服务. 如何在微信自定义菜单中将用户导航到个人中心页面呢? 首选需要通过用户点击获取用户openid,而通过用户的点击跳转获取用户openid就必须在菜单中动态绑定用户的openid,或者在菜单的跳转URL中填写微信提供的链接,官方给了两个链接类型

php微信公众号开发(2)百度BAE搭建和数据库使用_php实例

微信越来越火,今天开始学习微信公众号开发,在开发之前,假如你已经了解PHP知识和HTML/css等技术. 1.申请微信公众号:地址https://mp.weixin.qq.com/ 注册前需要手拿身份证照片半身像,保证身份证信息看清楚,我用iPhone 4s拍的可以使用,千万不要美化照片,原装即可,又不是相亲. 填写相关信息,真实即可,在7个工作日审核是否通过,一般两三天就知道结果,如果不通过,重新提交即可,你只有一共4次机会,要注意. 一个人可以申请两个公众号,因为手机号和身份证都只能登记2次

php微信公众号开发模式详解_php实例

学习步骤:分四章来讲述这部分内容,下面是每章的大致内容. 1.了解开发模式与编辑模式,开发前的一些准备. 2.开发模式用户.微信服务器.个人服务器是如何交互的.什么是接口. 3.各种接口功能的调用与实现. 4.js-SDK的调用 微信公众号开发两种模式:编辑模式和开发模式.编辑模式比较简单,你不需要操作任何的代码,只需要借助微信提供的功能来管理自己的微信公众号.这种方式开发的页面比较简单,主要用来实现文章的推送等功能.开发者模式则能通过自己的后台服务器与微信关注用户实现更多的交互作用,调用微信的