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


Posted in PHP onOctober 21, 2016

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

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>

运行结果:

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

这里写图片描述

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

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

PHP 相关文章推荐
PHP中for与foreach的区别分析
Mar 09 PHP
PHP网站备份程序代码分享
Jun 10 PHP
SESSION信息保存在哪个文件目录下以及能够用来保存什么类型的数据
Jun 17 PHP
PHP闭包(Closure)使用详解
May 02 PHP
利用yahoo汇率接口实现实时汇率转换示例 汇率转换器
Jan 14 PHP
PHP date函数常用时间处理方法
May 11 PHP
php实现可逆加密的方法
Aug 11 PHP
php中引用&amp;的用法分析【变量引用,函数引用,对象引用】
Dec 12 PHP
PHP基于Closure类创建匿名函数的方法详解
Aug 17 PHP
PHP自动识别当前使用移动终端
May 21 PHP
PHP实现的无限分类类库定义与用法示例【基于thinkPHP】
Aug 06 PHP
PHP中用Trait封装单例模式的实现
Dec 18 PHP
PHP抓取远程图片(含不带后缀的)教程详解
Oct 21 #PHP
PHP Header用于页面跳转时的几个注意事项
Oct 21 #PHP
phpcms中的评论样式修改方法
Oct 21 #PHP
PHP+jquery+CSS制作头像登录窗(仿QQ登陆)
Oct 20 #PHP
PHP中的多种加密技术及代码示例解析
Oct 20 #PHP
php rmdir使用递归函数删除非空目录实例详解
Oct 20 #PHP
PHPCMS V9 添加二级导航的思路详解
Oct 20 #PHP
You might like
如何使用php绘制在图片上的正余弦曲线
2013/06/08 PHP
PHP大批量插入数据库的3种方法和速度对比
2014/07/08 PHP
主流PHP框架的优缺点对比分析
2014/12/25 PHP
浅谈PHP中静态方法和非静态方法的相互调用
2016/10/04 PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
2020/03/27 PHP
jquery判断单个复选框是否被选中的代码
2009/09/03 Javascript
javascript sudoku 数独智力游戏生成代码
2010/03/27 Javascript
js实现鼠标滚轮控制图片缩放效果的方法
2015/02/20 Javascript
浅谈Jquery核心函数
2015/06/18 Javascript
jquery实现倒计时功能
2015/12/28 Javascript
jquery trigger函数执行两次的解决方法
2016/02/29 Javascript
jQuery选择器基础入门教程
2016/05/10 Javascript
jQuery判断元素是否显示 是否隐藏的简单实现代码
2016/05/19 Javascript
js正则表达式replace替换变量方法
2016/05/21 Javascript
详解Angularjs在控制器(controller.js)中使用过滤器($filter)格式化日期/时间实例
2017/02/17 Javascript
10道典型的JavaScript面试题
2017/03/22 Javascript
BootStrap 获得轮播中的索引和当前活动的焦点对象
2017/05/11 Javascript
详解webpack-dev-server使用http-proxy解决跨域问题
2018/01/13 Javascript
利用weixin-java-miniapp生成小程序码并直接返回图片文件流的方法
2019/03/29 Javascript
微信小程序wx.request拦截器使用详解
2019/07/09 Javascript
vant时间控件使用方法详解
2020/12/24 Javascript
[01:20]辉夜杯背景故事宣传片《辉夜传说》
2015/12/25 DOTA
[56:18]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#2 MVP.Phx VS Fnatic第二局
2016/03/05 DOTA
[07:20]2018DOTA2国际邀请赛寻真——逐梦Mineski
2018/08/10 DOTA
浅谈python下tiff图像的读取和保存方法
2018/12/04 Python
Python替换月份为英文缩写的实现方法
2019/07/15 Python
python Django的web开发实例(入门)
2019/07/31 Python
详解python3类型注释annotations实用案例
2021/01/20 Python
python利用opencv实现颜色检测
2021/02/23 Python
Bailey帽子官方商店:Bailey Hats
2018/09/25 全球购物
土耳其玩具商店:Toyzz Shop
2019/08/02 全球购物
医药大学生求职简历的自我评价
2013/10/17 职场文书
女方婚礼新郎答谢词
2014/01/11 职场文书
水毁工程实施方案
2014/04/01 职场文书
Python爬虫之爬取哔哩哔哩热门视频排行榜
2021/04/28 Python
Python中的matplotlib绘制百分比堆叠柱状图,并为每一个类别设置不同的填充图案
2022/04/20 Python