这里不做讲解,只是记录下自己做过的一个功能案例:如何在.net后台中创建企业会话并发送消息?
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#region 微信 //微信企业Id private static string Corpid = "微信企业号ID"; //微信管理组的凭证密钥 private static string Corpsecret = "微信企业号密匙"; /// <summary> /// 获取token--微信 /// </summary> /// <returns></returns> private static string GetAccessTokenForWeiXin() { string getUrl = string.Format("https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={0}&corpsecret={1}", Corpid, Corpsecret); string result = HttpGet(getUrl); dynamic data = JsonConvert.DeserializeObject<dynamic>(result); return data.access_token; } /// <summary> /// 创建企业会话--微信 /// </summary> /// <param name="chatid">会话id。字符串类型,最长32个字符。</param> /// <param name="name">会话标题</param> /// <param name="owner">管理员userid,必须是该会话userlist的成员之一</param> /// <param name="userlist">["zhangsan","lisi","wangwu"]会话成员列表,成员用userid来标识。会话成员必须在3人或以上,2000人以下</param> /// <returns></returns> public static bool CreateCompanyDialogForWeiXin(string chatid, string name, string owner, string[] userlist) { if (userlist.Length < 3) { throw new Exception("会话成员必须在3人或以上"); } string token = GetAccessTokenForWeiXin(); if (token.IsEmptyOrNull()) { throw new Exception("无法获取微信token"); } string postUrl = string.Format("https://qyapi.weixin.qq.com/cgi-bin/chat/create?access_token={0}", token); dynamic postData = new { chatid = chatid, name = name, owner = owner, userlist = userlist }; string result = HttpPost(postUrl, postData); dynamic data = JsonConvert.DeserializeObject<dynamic>(result); if (data.errmsg == "ok") { return true; } return false; } /// <summary> /// 修改企业会话--微信 /// </summary> /// <param name="chatid">会话id。字符串类型,最长32个字符。</param> /// <param name="op_user">操作人userid</param> /// <param name="name">会话标题</param> /// <param name="owner">管理员userid,必须是该会话userlist的成员之一</param> /// <param name="add_user_list">["zhaoli"]会话新增成员列表,成员用userid来标识</param> /// <param name="del_user_list">["zhangsan"]会话退出成员列表,成员用userid来标识</param> /// <returns></returns> public static bool UpdateCompanyDialogForWeiXin(string chatid, string op_user, string name = "", string owner = "", string[] add_user_list = null, string[] del_user_list = null) { string token = GetAccessTokenForWeiXin(); if (token.IsEmptyOrNull()) { throw new Exception("无法获取微信token"); } string postUrl = string.Format("https://qyapi.weixin.qq.com/cgi-bin/chat/update?access_token={0}", token); dynamic postData = new { chatid = chatid, op_user = op_user, add_user_list = add_user_list == null ? new string[] { } : add_user_list, del_user_list = del_user_list == null ? new string[] { } : del_user_list, }; string result = HttpPost(postUrl, postData); dynamic data = JsonConvert.DeserializeObject<dynamic>(result); if (data.errmsg == "ok") { return true; } return false; } /// <summary> /// 群组发消息--微信 /// </summary> /// <param name="type">接收人类型:single|group,分别表示:群聊|单聊</param> /// <param name="id">接收人的值,为userid|chatid,分别表示:成员id|会话id</param> /// <param name="sender">发送人</param> /// <param name="msgtype">消息类型,此时固定为:text</param> /// <param name="content">消息内容</param> /// <returns></returns> public static bool SendMessageDialogForWeiXin(string type, string id, string sender, string msgtype, string content) { string token = GetAccessTokenForWeiXin(); if (token.IsEmptyOrNull()) { throw new Exception("无法获取微信token"); } string postUrl = string.Format("https://qyapi.weixin.qq.com/cgi-bin/chat/send?access_token={0}", token); dynamic postData = new { receiver = new { type = type, id = id }, sender = sender, msgtype = msgtype, text = new { content = content } }; string result = HttpPost(postUrl, postData); dynamic data = JsonConvert.DeserializeObject<dynamic>(result); if (data.errmsg == "ok") { return true; } else { Log.WriteLog("发送企业会话消息error:" + JsonConvert.SerializeObject(data)); throw new Exception("发送企业会话消息error:" + JsonConvert.SerializeObject(data)); } //return false; } #endregion
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#region 辅助方法 public static string HttpGet(string url) { var request = (HttpWebRequest)WebRequest.Create(url); var response = (HttpWebResponse)request.GetResponse(); var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd(); return responseString; } /// <summary> /// httpPost请求--参数为object /// </summary> /// <param name="url">地址</param> /// <param name="postObject">Post参数传输为对象</param> /// <returns></returns> public static string HttpPost(string url, object postObject) { string result = string.Empty; try { var request = (HttpWebRequest)WebRequest.Create(url); var postData = JsonConvert.SerializeObject(postObject); var data = Encoding.UTF8.GetBytes(postData); //uft-8支持中文 request.Method = "POST"; //request.ContentType = "application/x-www-form-urlencoded"; request.ContentType = "application/json;charset=UTF-8"; request.ContentLength = data.Length; using (var stream = request.GetRequestStream()) { stream.Write(data, 0, data.Length); } HttpWebResponse response = (HttpWebResponse)request.GetResponse(); result = new StreamReader(response.GetResponseStream()).ReadToEnd(); } catch (Exception ex) { result = ex.Message; } Log.WriteLog("发送消息结果:" + result); return result; } /// <summary> /// httpPost请求--参数为string /// </summary> /// <param name="url">地址</param> /// <param name="postString">post参数参数为字符串</param> /// <returns></returns> public static string HttpPost(string url, string postString) { string result = string.Empty; try { var request = (HttpWebRequest)WebRequest.Create(url); var data = Encoding.UTF8.GetBytes(postString); //uft-8支持中文 request.Method = "POST"; //request.ContentType = "application/x-www-form-urlencoded"; request.ContentType = "application/json;charset=UTF-8"; request.ContentLength = data.Length; using (var stream = request.GetRequestStream()) { stream.Write(data, 0, data.Length); } HttpWebResponse response = (HttpWebResponse)request.GetResponse(); result = new StreamReader(response.GetResponseStream()).ReadToEnd(); } catch (Exception ex) { result = ex.Message; Log.WriteLog("同步签到大屏发送消息error:" + result); } return result; } #endregion
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/// <summary> /// 创建会议企业会话 /// </summary> /// <param name="conferenceID">会议编码</param> public static void CreateConferenceDialog(string conferenceID, string conferenceName) { //创建会话数据 //会话类型集合 DialogTypeCollection dtColl = DialogTypeAdapter.Instance.GetTColl(); //会话内容类型集合 DialogContentTypeCollection dctColl = DialogContentTypeAdapter.Instance.GetTColl(); //会议企业会话集合 ConferenceCompanyDialogCollection ccdColl = new ConferenceCompanyDialogCollection(); dtColl.ForEach(dt => { dctColl.ForEach(dct => { string id = Guid.NewGuid().ToString("N"); ConferenceCompanyDialog ccd = new ConferenceCompanyDialog() { ID = id, DialogCode = id, ConferenceID = conferenceID, DialogContentTypeID = dct.ID, DialogTypeID = dt.ID }; ccdColl.Add(ccd); }); }); ccdColl.ForEach(ccd => { DialogContentType dctModel = dctColl.Find(dct => dct.ID == ccd.DialogContentTypeID); string userlist = ConfigurationManager.AppSettings["ConferenceCompanyDialogUser"]; bool result = true; #region 微信 //群组名称 string dialogName = conferenceName.Substring(0, conferenceName.Length > 10 ? 10 : conferenceName.Length) + "_" + dctModel.Name; if (ccd.DialogTypeName == "WeiXin") { //添加微信企业号数据 result = ConferenceCompanyDialogHelp.CreateCompanyDialogForWeiXin(ccd.DialogCode, dialogName, userlist.Split(',')[0], userlist.Split(',')); } #endregion #region IM???? else if (ccd.DialogTypeName == "IM") { //由于IM还没有实现群组推送消息,所以,目前将IM的群组创建和推送即时消息暂推至以后处理??? #region IM创建群组临时代码 //string appId = ConferenceCompanyDialogHelp.GetAppID("远薪移动办公"); ////操作人userid(loginName)--暂取会话管理人 //string[] allUserLoginName = ConfigurationManager.AppSettings["ConferenceCompanyDialogUser"].Split(','); //string op_user = allUserLoginName[0]; //AttendeeConllection attColl = AttendeeAdapter.Instance.GetAttendeeConllectionByConference(conferenceID); //string opUserCode = attColl.Find(att => att.LoginName == op_user).AttendeeID; //string adminIMCode = ConferenceCompanyDialogHelp.GetIMUserID(opUserCode, appId).ToString(); //int[] members = new int[allUserLoginName.Length]; //for (int i = 0; i < allUserLoginName.Length; i++) //{ // string userCode = attColl.Find(att => att.LoginName == allUserLoginName[i]).AttendeeID; // int userIMCode = ConferenceCompanyDialogHelp.GetIMUserID(userCode, appId); // members[i] = userIMCode; //} ////添加IM数据??????? //ConferenceCompanyDialogHelp.CreateCompanyDialogForIM(appId, adminIMCode, dialogName, members); #endregion } #endregion if (result) { //添加数据库数据 ConferenceCompanyDialogAdapter.Instance.Update(ccd); } }); }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/// <summary> /// 现场服务推送消息 /// </summary> /// <param name="conferenceID">会议编码</param> /// <param name="attendeeID">参会人编码</param> /// <param name="siteServiceID">会务服务编码</param> public static void SendMessage(string conferenceID, string attendeeID, string siteServiceID) { ConferenceCompanyDialogCollection diaColl = ConferenceCompanyDialogAdapter.Instance.LoadByConferenceID(conferenceID); if (diaColl.Count == 0) { throw new Exception("该会议下没有任何企业会话"); } SiteServiceModel siteModel = SiteServiceAdapter.Instance.LoadByID(siteServiceID); //操作人userid(loginName)--暂取会话管理人 string op_user = ConfigurationManager.AppSettings["ConferenceCompanyDialogUser"].Split(',')[0]; if (op_user.IsEmptyOrNull()) { throw new Exception("请先配置会话管理人员"); } AttendeeModel attModel = AttendeeAdapter.Instance.LoadByID(attendeeID); if (attModel == null) { throw new Exception("该会议下没有找到参会人编码为:" + attendeeID + "的参会人"); } //张三(座位:3排5号,手机号:13652489652)申请饮用水 备注:WERThhjk string content = string.Format(@"{0}(座位:{1},手机号:{2})申请{3}" , attModel.Name, attModel.SeatAddress, attModel.MobilePhone, siteModel.SiteServiceTypeName); content += " 备注:" + ((siteModel.Remarks.IsEmptyOrNull() || siteModel.Remarks.Trim().ToLower() == "null") ? "无" : siteModel.Remarks); //换行符 只能放在string里有效,且使用双引号包裹,不能使用string.Format,stringbuild等方法,它们会吧 当初字符串处理 diaColl.ForEach(dia => { #region 微信企业号推送消息 if (dia.DialogTypeName == "WeiXin" && dia.DialogContentTypeName == "现场服务") { try { ConferenceCompanyDialogHelp.SendMessageDialogForWeiXin("group", dia.DialogCode, op_user, "text", content); } catch (Exception e) { throw e; } } #endregion #region IM推送消息??? else if (dia.DialogTypeName == "IM" && dia.DialogContentTypeName == "现场服务") { } #endregion }); }