参考腾讯提供的企业微信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){//获取全量覆盖部门jobidstring 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){//获取全量覆成员jobidstring 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

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

asp.net企业微信开发之同步通讯录相关推荐

  1. 企业微信开发总结-获取通讯录

    企业微信开发总结-获取通讯录 最近遇到个项目需求,需要能够获取到用户企业的通讯录,同步到我们系统中,这样就不用重复输入一批企业人员了.一开始想的很简单,实际研究下来发现企业微信比个人微信对接起来复杂多 ...

  2. 服务器端缓存企业微信,企业微信开发

    企业微信开发又以下三类,可以根据需要查看相应的文档 企业内部应用开发:开发内部使用应用,开发个性化办公应用 第三方应用开发:开发出来的应用可供其他企业使用 第三方应用开发.png 智慧硬件开发 企业内 ...

  3. 前端企业微信开发内嵌H5记录

    前端企业微信开发内嵌H5记录(Vue) 文章目录 前端企业微信开发内嵌H5记录(Vue) 一.引入相应JS-SDK 1.JS-SDK 二.授权(网页授权) 1.构造网页授权链接 2.发起授权 3.注入 ...

  4. 企业微信开发:获取 access_token(二)

    前言   简单的用白话了解一下企业微信的作用,企业微信是腾讯微信团队为企业打造的专业办公管理工具.大致和钉钉差不多,适用于政府.企业等各类组织的一个产品,可以有效的帮您管理员工.个人感觉企业微信开发要 ...

  5. 企业微信开发第三方应用开发视频教程,ToB Dev李月喜全网首发

    csdn程序员学院<企业微信三方应用开发>视频课程,全网企业微信三方应用开发教程首发, https://edu.csdn.net/course/detail/30582  即将完结欢迎试看 ...

  6. 企业微信开发——企业内部自建应用开发(第一篇)---环境搭建

    一.背景介绍 现在越来越多的企业开始注重私域流量的运营和建设,防止客户随着人员流动而流失,所以就出现了基于企业微信开发的需求,但是目前关于企业微信开发的生态环境依旧不太丰富,腾讯的api文档写的也是晦 ...

  7. 企业微信开发H5页面授权 使用接口的问题

    企业微信 h5踩坑指南 企业微信开发H5页面授权 使用接口的问题 开发企业微信的时候 h5页面需要获取登录用户的信息,这个时候就需要jsdk里面的 [开发文档] (https://work.weixi ...

  8. Java企业微信开发-企业微信所有类型消息推送封装

    企业微信开发第一步获取AccessToken,企业微信的AccessToken和公众号的不一样,企业微信所有接口调用只需要一个AccessToken,而公众号授权和jssdk是分开的 一.获取企业微信 ...

  9. 微信及企业微信内嵌浏览器内核信息及H5跑分数据-企业微信开发

    加我微信li570467731,拉你进二百多人企业微信开发同行群(文末有二维码). 企业微信开发三部曲: <企业微信应用开发概述篇(免费)>已完结: <企业微信开发第三方应用开发篇& ...

最新文章

  1. ubuntu vscode 配置opencv3.0_ubuntu下配置vscode的c++环境
  2. h5 神策埋点_咕咚技术总监唐平麟:神策使我们的数据平台成本降低约 75%,迭代效率提升 2~3 倍...
  3. android 快速布局,快速实现android的协同布局CoordinatorLayout
  4. 我的react+material-ui之路
  5. 利用ping/ipconfig/nslookup/dig/whois简单工具测试DNS
  6. [BUAA软工]beta阶段贡献分
  7. python selenium安装教程_Python Selenium模块安装使用教程详解
  8. 顶级的CSS和Javascript动画框架推荐
  9. TypeError: 'module' object is not callable (pytorch在进行MNIST数据集预览时出现的错误)
  10. 苹果电脑屏幕刷新率如何调整
  11. 利用ffmpeg一步一步编程实现摄像头采集编码推流直播系统
  12. robocopy 备份_使用Robocopy复制、备份文件夹
  13. 服务器ghost备份后无法进入系统还原,如下图,电脑开不起来了,重新ghost恢复备份的系统后启动依旧蓝屏,怎么办?...
  14. mysql查询出现ambiguous的问题
  15. 视频录制软件有哪些?4款录制视频软件,免费下载
  16. 工欲善其事,必先利其器篇-高效实现右滑退出功能
  17. 视音频学习入门---ffmpeg篇(四)---基于windows平台的ffmpeg开发(二)
  18. P28 Elastic Beanstalk
  19. phpcms extention.func.php数据的使用
  20. 浅析java.lang.IllegalArgumentException: URI is not absolute

热门文章

  1. git推送代码一直报错Permission denied, please try again怎么解决?
  2. 校园O2O商铺平台-店铺信息编辑模块
  3. Spring源码阅读一——IOC
  4. 乐视视频 现在已被我认为是流氓网站
  5. Cartoon Animator 4 for Mac(二维动画软件)
  6. linux网络编程中listen函数 backlog的含义
  7. 纤维增强塑料复合材料行业调研报告 - 市场现状分析与发展前景预测
  8. 最炙手可热的行业——大数据就业方向和学习路线图详解!
  9. 廖雪峰python学习笔记之高级特性
  10. 为什么里程碑很重要?