这里不做讲解,只是记录下自己做过的一个功能案例:如何在.net后台中创建企业会话并发送消息?
#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
微信相关方法
#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
Http请求封装
/// <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);
}
});
}
创建会话案例
/// <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 += "\n备注:" + ((siteModel.Remarks.IsEmptyOrNull() || siteModel.Remarks.Trim().ToLower() == "null") ? "无" : siteModel.Remarks); //换行符\n只能放在string里有效,且使用双引号包裹,不能使用string.Format,stringbuild等方法,它们会吧\n当初字符串处理
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
});
}
发送消息案例