asp.net企业微信开发之同步通讯录

参考腾讯提供的企业微信api,得知企业微信在同步通讯录时需要先将部门和人员按照规定格式上传,然后再根据上传后返回的media_id执行部门或者人员的覆盖操作。
话不多说,直接上菜。

  • 同步程序
  public string SyncOrga()
        {
            string result = string.Empty;
            string token = getToken();

            //生成部门csv文件
            string ouCSVFilePath = GetOUCSV();

            // 先将部门文件上传至腾讯服务器
            string url = "https://qyapi.weixin.qq.com/cgi-bin/media/upload?access_token=" + token + "&type=file";
            string mediaid = string.Empty;

            //调用接口上传
            string mediaidou = HttpUploadFile(url, ouCSVFilePath);

            JObject resultInfo = JsonConvert.DeserializeObject<JObject>(mediaidou);
            int errcode = Convert.ToInt32(resultInfo["errcode"]);
            if (errcode == 0)
            {
                mediaid = Convert.ToString(resultInfo["media_id"]);
                //把上传反馈的id传入批量操作部门接口
                string replacepartyInfo = ReplacepartyTest(mediaid, token);
                JObject mediaouInfo = JsonConvert.DeserializeObject<JObject>(replacepartyInfo);
                int replacepartyerrcode = Convert.ToInt32(mediaouInfo["errcode"]);
                if (replacepartyerrcode == 0)
                {
                    //获取全量覆盖部门jobid
                    string jobidBM = Convert.ToString(mediaouInfo["jobid"]);
                    string ReturnBMInfo = GetReturnByJobid(token, jobidBM);
                    JObject BMResultInfo = JsonConvert.DeserializeObject<JObject>(ReturnBMInfo);
                    if (Convert.ToInt32(BMResultInfo["errcode"])==0)
                    {
                        BMMsg.Text = Convert.ToString(BMResultInfo["result"]);
                    }
                    else
                    {
                        BMMsg.Text = ReturnBMInfo;

                    }
                    //上传用户文件至腾讯服务器
                    string userCSVFilePath = GetUserCSV();

                    string mediaiduser = HttpUploadFile(url, userCSVFilePath);
                    JObject resultUserInfo = JsonConvert.DeserializeObject<JObject>(mediaiduser);
                    int mediaiduserErrCode = Convert.ToInt32(resultUserInfo["errcode"]);
                    if (mediaiduserErrCode == 0)
                    {
                        string userMediaId = Convert.ToString(resultUserInfo["media_id"]);
                        //把上传反馈的id传入批量操作部门接口
                        string replaceuserInfo = ReplaceUser(userMediaId, token);
                        JObject mediaiduserInfo = JsonConvert.DeserializeObject<JObject>(replaceuserInfo);
                        int UserErrorCode = Convert.ToInt32(mediaiduserInfo["errcode"]);
                        if (UserErrorCode == 0)
                        {
                            //获取全量覆成员jobid
                            string jobidUser = Convert.ToString(mediaiduserInfo["jobid"]);
                            string ReturnUserInfo = GetReturnByJobid(token, jobidUser);
                            JObject UserResultInfo = JsonConvert.DeserializeObject<JObject>(ReturnUserInfo);
                            if (Convert.ToInt32(UserResultInfo["errcode"]) == 0)
                            {
                                UserMsg.Text = Convert.ToString(UserResultInfo["result"]);
                            }
                            else
                            {
                                UserMsg.Text = ReturnUserInfo;

                            }
                            msg.Text = "同步成功";
                        }
                        else
                        {
                            msg.Text = replaceuserInfo;
                        }
                    }
                    else
                    {
                        msg.Text = mediaiduser;
                    }

                }
                else
                {
                    msg.Text = replacepartyInfo;
                }

            }
            else
            {
                msg.Text = mediaidou;
            }

            return result;
        }
  • 生成部门CSV文件
    public string GetOUCSV()
        {
            //更新部门
            //定义一个csv路径
            string attPath_Source = Epoint.Frame.Bizlogic.BasePage.GetApplicationPath() + "epoint_weixin_orga\\" + DateTime.Now.ToString("yyyyMMddHHmmss");//获取模板的文件夹路径
            string FileDir = System.Web.HttpContext.Current.Server.MapPath(attPath_Source);//获取服务器上的物理路径
            if (!Directory.Exists(FileDir))
            {
                Directory.CreateDirectory(FileDir);
            }
            String ouCSVFilePath = FileDir + "\\ou.csv";
            DataView dv = GetOU();
            if (!File.Exists(ouCSVFilePath)) //当文件不存在时创建文件
            {
                //创建文件流(创建文件)
                FileStream fs = new FileStream(ouCSVFilePath, FileMode.Create, FileAccess.Write);
                //创建流写入对象,并绑定文件流
                StreamWriter sw = new StreamWriter(fs);
                //实例化字符串流
                StringBuilder sb = new StringBuilder();
                //将数据添加进字符串流中(如果数据标题有变更,修改此处)
                sb.Append("部门名称").Append(",").Append("部门ID").Append(",").Append("父部门ID").Append(",").Append("排序");
                //将字符串流数据写入文件
                sw.WriteLine(sb);
                for (int i = 0; i < dv.Count; i++)
                {
                    string OUName = Convert.ToString(dv[i]["OUName"]);
                    int OUId =GetOuId( Convert.ToString(dv[i]["OUGuid"]));
                    int ParentOUid = GetOuId( Convert.ToString(dv[i]["ParentOUGuid"]));
                    string OrderNumber = Convert.ToString(dv[i]["OrderNumber"]) == null ? "0" : Convert.ToString(dv[i]["OrderNumber"]);

                    StringBuilder sbd = new StringBuilder();
                    //将需要保存的数据添加到字符串流中
                    sbd.Append(OUName).Append(",").Append(OUId).Append(",").Append(ParentOUid).Append(",").Append(OrderNumber);
                    sw.WriteLine(sbd);

                }
                //刷新文件流
                sw.Flush();
                sw.Close();
                fs.Close();
            }
            else
            {

                StreamWriter swd = new StreamWriter(ouCSVFilePath, true, Encoding.UTF8);
                StringBuilder sb = new StringBuilder();
                //将数据添加进字符串流中(如果数据标题有变更,修改此处)
                sb.Append("部门名称").Append(",").Append("部门ID").Append(",").Append("父部门ID").Append(",").Append("排序");
                //将字符串流数据写入文件
                swd.WriteLine(sb);
                for (int i = 0; i < dv.Count; i++)
                {
                    string OUName = Convert.ToString(dv[i]["OUName"]);
                    int OUId = GetOuId(Convert.ToString(dv[i]["OUGuid"]));
                    int ParentOUid = GetOuId(Convert.ToString(dv[i]["ParentOUGuid"]));
                    string OrderNumber = Convert.ToString(dv[i]["OrderNumber"]) == null ? "0" : Convert.ToString(dv[i]["OrderNumber"]);

                    StringBuilder sbd = new StringBuilder();
                    //将需要保存的数据添加到字符串流中
                    sbd.Append(OUName).Append(",").Append(OUId).Append(",").Append(ParentOUid).Append(",").Append(OrderNumber);
                    swd.WriteLine(sbd);

                }
                swd.Flush();
                swd.Close();
            }
            return ouCSVFilePath;

        }
  • 调用接口将CSV文件上传
 public static string HttpUploadFile(string url, string path)//这个方法是两个URL第一个url是微信接口地址,第二个是文件地址
        {
            // 设置参数
            HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
            CookieContainer cookieContainer = new CookieContainer();
            request.CookieContainer = cookieContainer;
            request.AllowAutoRedirect = true;
            request.Method = "POST";
            string boundary = DateTime.Now.Ticks.ToString("X"); // 随机分隔线
            request.ContentType = "multipart/form-data;charset=utf-8;boundary=" + boundary;
            byte[] itemBoundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "\r\n");
            byte[] endBoundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n");

            string fileName = "ou.osv";

            //请求头部信息 
            StringBuilder sbHeader = new StringBuilder(string.Format("Content-Disposition:form-data;name=\"file\";filename=\"{0}\"\r\nContent-Type:application/octet-stream\r\n\r\n", fileName));
            byte[] postHeaderBytes = Encoding.UTF8.GetBytes(sbHeader.ToString());

            FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);
            byte[] bArr = new byte[fs.Length];
            fs.Read(bArr, 0, bArr.Length);
            fs.Close();

            Stream postStream = request.GetRequestStream();
            postStream.Write(itemBoundaryBytes, 0, itemBoundaryBytes.Length);
            postStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);
            postStream.Write(bArr, 0, bArr.Length);
            postStream.Write(endBoundaryBytes, 0, endBoundaryBytes.Length);
            postStream.Close();

            //发送请求并获取相应回应数据
            HttpWebResponse response = request.GetResponse() as HttpWebResponse;
            //直到request.GetResponse()程序才开始向目标网页发送Post请求
            Stream instream = response.GetResponseStream();
            StreamReader sr = new StreamReader(instream, Encoding.UTF8);
            //返回结果网页(html)代码
            string content = sr.ReadToEnd();
            return content;
        }
  • 上传反馈的id传入批量操作部门接口
        public string ReplacepartyTest(string media_id, string token)
        {
            string postDataStr = JsonSerializer<InsertMessageparam>(new InsertMessageparam
            {
                media_id = media_id,

            });
            // 把上传反馈的id传入批量操作部门接口
            string url1 = "https://qyapi.weixin.qq.com/cgi-bin/batch/replaceparty?access_token=" + token;
            string replaceparty = HttpPost(url1, postDataStr, "0");

            return replaceparty;

        }
  • Post请求
 private string HttpPost(string Url, string postDataStr, string type)
        {

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
            request.Method = "POST";

            if (type.Equals("1"))
            {
                request.ContentType = "application/x-www-form-urlencoded";
            }

            else
            {
                request.ContentType = "application/json;charset=utf-8";
            }
            request.ContentLength = (long)Encoding.UTF8.GetBytes(postDataStr).Length;

            //request.CookieContainer = cookie;
            Stream myRequestStream = request.GetRequestStream();
            //StreamWriter myStreamWriter = new StreamWriter(myRequestStream, Encoding.GetEncoding("gb2312"));
            Stream myStreamWriter = request.GetRequestStream();
            myStreamWriter.Write(Encoding.UTF8.GetBytes(postDataStr), 0, Encoding.UTF8.GetByteCount(postDataStr));
            myStreamWriter.Close();
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            //response.Cookies = cookie.GetCookies(response.ResponseUri);
            Stream myResponseStream = response.GetResponseStream();
            StreamReader myStreamReader = new StreamReader(myResponseStream);
            string retString = myStreamReader.ReadToEnd();

            myStreamReader.Close();
            myResponseStream.Close();

            return retString;
        }

  • 参数
  public static string JsonSerializer<T>(T t)
        {
            DataContractJsonSerializer dataContractJsonSerializer = new DataContractJsonSerializer(typeof(T));
            MemoryStream memoryStream = new MemoryStream();
            dataContractJsonSerializer.WriteObject(memoryStream, t);
            string @string = Encoding.UTF8.GetString(memoryStream.ToArray());
            memoryStream.Close();
            return @string;
        }
   public class InsertMessageparam
        {
            public string media_id
            {
                get;
                set;
            }
        }
  • Get请求,用于获取全量覆盖部门接口调用结果
public static string HttpGet(string url)
        {
            string serviceAddress = url;
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(serviceAddress);
            request.Method = "GET";
            request.ContentType = "text/html;charset=UTF-8";
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            Stream myResponseStream = response.GetResponseStream();
            StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.UTF8);
            string retString = myStreamReader.ReadToEnd();
            myStreamReader.Close();
            myResponseStream.Close();
            return retString;
        }
  • 前台
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Sync.aspx.cs" Inherits="WebService.Sync" %>

<!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>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:Button runat="server" ID="syncOrga" Text="全量同步组织架构" OnClick="syncOrga_Click" />     
        </div>
    </form>
</body>
</html>

参考文档:https://work.weixin.qq.com/api/doc/#90000/90135/90982

同步人员操作与同步部门类似。
以上。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
内容提要<br><br><br>本书系统地介绍了ASP.NET程序设计开发,全书案例程序使用C#编写,并遵守C#的编码规范。所有案例程序均来自课堂教学和工程实践,注重知识的兼容性和规范性。 <br>  依照ASP.NET编程体系,本书分成4部分,共11章。第1部分.NET应用开发基础,介绍了.NET应用开发体系与开发环境配置,以及C#语言程序设计基础;第2部分ASP.NET程序设计基础,介绍了ASP.NET服务器端控件、页面结构、内置对象及.NET框架类;第3部分ASP.NET数据库程序设计,介绍了ADO.NET的结构,使用ADO.NET操作SQL Server数据库,以及XML程序设计基础;第4部分Web服务与项目开发,介绍了基于XML的.NET Web服务,考试系统的分析与设计,以及从零开始介绍开发一个电子商务项目的过程。 <br>  本书适合作为高校及各类培训机构的动态网站编程教材或者教学参考书,也可以作为.NET自学人员和.NET开发人员的参考书。 <br><br><br><br>前 言 <br><br> ASP.NET语言是目前应用开发中的核心语言,也是目前流行的3P语言中应用最广泛的一种。3P语言分别是ASP(Active Server Pages)及ASP.NET、PHP(Personal Home Page)和JSP(Java Server Pages)。其中ASP和ASP.NET是微软公司的产品,JSP最初是Sun公司推出的,PHP是由一个网络小组开发和维护的。ASP.NET也称做ASP+,是微软公司于2002年年初发布的网站编程语言。ASP.NET从根本上对ASP进行了升级,全面加入了面向对象的编程理念,并把ASP.NET作为.NET战略中重要组成部分。 <br>  在默认情况下,在ASP.NET应用程序中可以使用3种语言作为脚本语言,即VB.NET、JScript.NET和C#语言。其中VB.NET是对VB语言的升级,JScript.NET是对JScript语言的升级,C#是.NET的原生语言,是随着.NET的发布而发布的一门全新的面向对象编程语言。因此C#是使用.NET编程的最佳语言。本书中全部程序都使用C#作为编程语言。 <br>  依照ASP.NET编程体系,全书分成4个部分,共11章。 <br>  第1部分 .NET应用开发基础 <br>  第1章 应用开发体系与环境配置,介绍了应用程序开发体系,常用开发架构,.NET的结构及战略,ASP.NET+SQL Server的开发环境配置。 <br>  第2章 C#程序设计基础,介绍了C#语言的编译器、数据结构、控制语句及面向对象的编程特性。 <br>  第2部分 ASP.NET程序设计基础 <br>  第3章 服务器端控件,介绍了服务器端控件的基本概念、HTML服务器端控件、Web服务器端控件和用户自定义控件的使用。 <br>  第4章 ASP.NET内置对象和页面配置,介绍了ASP.NET的页面常用修饰符、常用内置对象的使用方法,以及ASP.NET的运行配置文件。 <br>  第5章 .NET框架类,介绍了常用框架类的命名控件System.IO、System.Web、System.Net和System.Drawing等。 <br>  第3部分 ASP.NET数据库程序设计 <br>  第6章 ADO.NET数据访问接口,介绍了ADO.NET的结构、ADO.NET的常用对象,以及3种重要的数据控件。 <br>  第7章 使用ADO.NET操作SQL Server数据库,介绍了SQL Server的基本操作、SQL Server的存储过程、SQL Server触发器,以及如何使用ADO.NET进行操作。 <br>  第8章 XML程序设计基础,介绍了XML的基本概念、XML的3种显示样式、XML的2种文档规则、常用的字符集,以及如何利用ASP.NET进行操作。 <br>  第4部分 Web服务与项目开发 <br>  第9章 基于XML的.NET Web服务,介绍了.NET Web服务的概念,如何创建和使用Web服务,SOAP的基本概念及用法,以及数据服务的创建方法。 <br>  第10章 软件项目的设计与实践,介绍了OOAD和UML的基本概念、ISO9001和CMM软件开发标准、以及在线考试系统的分析与设计。 <br>  第11章 项目规划与设计文档,从零开始介绍一个电子商务项目的规划、设计、测试和发布,以及项目通用文档的格式和编写。 <br><br>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值