/// <summary> /// 企业号发送应用内容消息 /// </summary> /// <param name="channelId"></param> /// <returns></returns> public static async Task <ResponseWorkMsgDTO> SendWorkAgentContentMsgAsync <TMessage>(int channelId, TMessage msgDto) where TMessage : RequestWorkContextMsgDTO { var validateResult = WeixinConfigHelper.ValidateWorkChannel(channelId, out WeixinConfigDTO configDto); if (validateResult) { if (msgDto.Validate()) { msgDto.AgentId = configDto.AgentId; var sendMsgUrl = string.Format("https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={0}", configDto.AccessToken); var result = await HttpHelper.PostDataAsync <ResponseWorkMsgDTO, TMessage>(sendMsgUrl, msgDto); return(result); } else { return(new ResponseWorkMsgDTO { errcode = -9998, errmsg = "请选择接收消息的用户范围" }); } } else { return(new ResponseWorkMsgDTO { errcode = -9999, errmsg = "仅企业号才可进行主动发送消息" }); } }
public static void DownloadFile(int channelId, string saveFilePath, string mediaId) { var configDto = WeixinConfigHelper.GetWeixinConfigDTOAsync(channelId).Result; var weixinDownloadFileUrl = string.Format("https://qyapi.weixin.qq.com/cgi-bin/media/get?access_token={0}&media_id={1}", configDto.AccessToken, mediaId); using (var fileStream = File.Create(saveFilePath)) { WeixinDownloadFile(weixinDownloadFileUrl, fileStream); } }
/// <summary> /// 企业号上传临时素材 /// </summary> /// <param name="channelId"></param> /// <param name="fileType"></param> /// <param name="filePath"></param> /// <returns></returns> public static WeixinWorkFileUploadDTO UploadFile(int channelId, UploadMediaFileType fileType, string filePath) { var configDto = WeixinConfigHelper.GetWeixinConfigDTOAsync(channelId).Result; var weixinUploadUrl = string.Format("https://qyapi.weixin.qq.com/cgi-bin/media/upload?access_token={0}&type={1}", configDto.AccessToken, fileType.ToString()); using (var fileStream = File.OpenRead(filePath)) { var fileName = Path.GetFileName(filePath); var html = WeixinUploadFile(weixinUploadUrl, fileName, fileStream); var result = html.FromJson <WeixinWorkFileUploadDTO>(); return(result); } }
/// <summary> /// 校验渠道微信签名 /// </summary> /// <param name="channelId">渠道id</param> /// <returns></returns> public ExecuteResult <Tuple <bool, string> > CheckChannelWeixinSign(int channelId, string msg_signature, string signature, string timestamp, string nonce, string echo) { var result = new ExecuteResult <Tuple <bool, string> > { ErrorCode = ExecuteResult.ErrorCodeEnum.Fail, Success = false, ErrorMsg = "校验渠道微信签名失败" }; try { var checkResult = false; var replyEcho = string.Empty; var configDto = WeixinConfigHelper.GetWeixinConfigDTOAsync(channelId).Result; switch (configDto.WxType) { case Enums.WeixinType.WxMp: { checkResult = SignHelper.CheckSignature(channelId, signature, timestamp, nonce, echo, out replyEcho); } break; case Enums.WeixinType.WxWork: default: { checkResult = SignHelper.ValidateUrl(channelId, msg_signature, timestamp, nonce, echo, out replyEcho); } break; } result.Data = new Tuple <bool, string>(checkResult, replyEcho); result.Success = true; result.ErrorCode = ExecuteResult.ErrorCodeEnum.Success; result.ErrorMsg = "校验渠道微信签名成功"; return(result); } catch (Exception ex) { ex.WriteExceptionLog("校验渠道微信签名失败"); } return(result); }
/// <summary> /// 删除部门 /// </summary> /// <param name="channelId">渠道id</param> /// <param name="id">部门id,32位整型,指定时必须大于1</param> /// <returns></returns> public static async Task <ResponseBaseDTO> DeleteDepartmentAsync(int channelId, int id) { var validateResult = WeixinConfigHelper.ValidateWorkChannel(channelId, out WeixinConfigDTO configDto); if (validateResult) { var deleteDepartmentUrl = string.Format("https://qyapi.weixin.qq.com/cgi-bin/department/delete?access_token={0}&id={1}", configDto.AccessToken, id); var result = await HttpHelper.GetHtmlAsync <CreateDepartmentResponseDTO>(deleteDepartmentUrl); return(result); } else { return(new ResponseBaseDTO { errcode = -9999, errmsg = "仅企业号才可进行部门管理" }); } }
/// <summary> /// 获取部门成员详情 /// </summary> /// <param name="channelId">渠道id</param> /// <param name="department_id">获取的部门id</param> /// <param name="fetch_child">1/0:是否递归获取子部门下面的成员</param> /// <returns></returns> public static async Task <GetDepartmentMemberDetailListResponseDTO> GetDepartmentMemberDetailList(int channelId, int department_id, int?fetch_child = null) { var validateResult = WeixinConfigHelper.ValidateWorkChannel(channelId, out WeixinConfigDTO configDto); if (validateResult) { var getMemberListUrl = string.Format("https://qyapi.weixin.qq.com/cgi-bin/user/list?access_token={0}&department_id={1}&fetch_child={2}", configDto.AccessToken, department_id, fetch_child); var result = await HttpHelper.GetHtmlAsync <GetDepartmentMemberDetailListResponseDTO>(getMemberListUrl); return(result); } else { return(new GetDepartmentMemberDetailListResponseDTO { errcode = -9999, errmsg = "仅企业号才可进行用户管理" }); } }
/// <summary> /// 批量删除成员 /// </summary> /// <param name="channelId">渠道id</param> /// <param name="userid">成员id</param> /// <returns></returns> public static async Task <ResponseBaseDTO> BatchDelteMemberAsync(int channelId, List <string> useridlist) { var validateResult = WeixinConfigHelper.ValidateWorkChannel(channelId, out WeixinConfigDTO configDto); if (validateResult) { var batchDeleteMemberUrl = string.Format("https://qyapi.weixin.qq.com/cgi-bin/user/batchdelete?access_token={0}", configDto.AccessToken); var result = await HttpHelper.PostDataAsync <ResponseBaseDTO, List <string> >(batchDeleteMemberUrl, useridlist); return(result); } else { return(new ResponseBaseDTO { errcode = -9999, errmsg = "仅企业号才可进行用户管理" }); } }
/// <summary> /// 读取成员 /// </summary> /// <param name="channelId">渠道id</param> /// <param name="userid">成员id</param> /// <returns></returns> public static async Task <MemberDetailListResponseDTO> GetMemberAsync(int channelId, string userid) { var validateResult = WeixinConfigHelper.ValidateWorkChannel(channelId, out WeixinConfigDTO configDto); if (validateResult) { var getMemberUrl = string.Format("https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token={0}&userid={1}", configDto.AccessToken, userid); var result = await HttpHelper.GetHtmlAsync <MemberDetailListResponseDTO>(getMemberUrl); return(result); } else { return(new MemberDetailListResponseDTO { errcode = -9999, errmsg = "仅企业号才可进行用户管理" }); } }
/// <summary> /// 获取标签成员 /// </summary> /// <param name="channelId">渠道id</param> /// <param name="tagId">标签ID</param> /// <returns></returns> public static async Task <GetTagListResponseDTO> GetTagListAsync(int channelId) { var validateResult = WeixinConfigHelper.ValidateWorkChannel(channelId, out WeixinConfigDTO configDto); if (validateResult) { var tagListUrl = string.Format("https://qyapi.weixin.qq.com/cgi-bin/tag/list?access_token={0}", configDto.AccessToken); var result = await HttpHelper.GetHtmlAsync <GetTagListResponseDTO>(tagListUrl); return(result); } else { return(new GetTagListResponseDTO { errcode = -9999, errmsg = "仅企业号才可进行标签管理" }); } }
/// <summary> /// 获取菜单 /// </summary> /// <param name="channelId"></param> /// <param name="buttonData">菜单内容</param> /// <returns></returns> public static async Task <ResponseBaseDTO> DeleteMenuAsync(int channelId) { var configDto = await WeixinConfigHelper.GetWeixinConfigDTOAsync(channelId); var weixinDeleteMenuUrl = string.Empty; switch (configDto.WxType) { case Enums.WeixinType.WxMp: weixinDeleteMenuUrl = string.Format("https://api.weixin.qq.com/cgi-bin/menu/delete?access_token={0}", configDto.AccessToken); break; case Enums.WeixinType.WxWork: default: weixinDeleteMenuUrl = string.Format("https://qyapi.weixin.qq.com/cgi-bin/menu/delete?access_token={0}&agentid={1}", configDto.AccessToken, configDto.AgentId); break; } var result = await HttpHelper.GetHtmlAsync <ResponseBaseDTO>(weixinDeleteMenuUrl); return(result); }
/// <summary> /// 更新部门 /// </summary> /// <param name="channelId">渠道id</param> /// <param name="name">部门名称。长度限制为1~32个字符,字符不能包括\:?”<>|</param> /// <param name="parentId">父部门id,32位整型</param> /// <param name="order">在父部门中的次序值。order值大的排序靠前。有效的值范围是[0, 2^32)</param> /// <param name="id">部门id,32位整型,指定时必须大于1。若不填该参数,将自动生成id</param> /// <returns></returns> public static async Task <ResponseBaseDTO> UpdateDepartmentAsync(int channelId, string name, long parentId, int order = 1, long?id = null) { var validateResult = WeixinConfigHelper.ValidateWorkChannel(channelId, out WeixinConfigDTO configDto); if (validateResult) { var updateDepartmentUrl = string.Format("https://qyapi.weixin.qq.com/cgi-bin/department/update?access_token={0}", configDto.AccessToken); var postData = new { name, parentid = parentId, order, id }; var result = await HttpHelper.PostDataAsync <CreateDepartmentResponseDTO, object>(updateDepartmentUrl, postData); return(result); } else { return(new ResponseBaseDTO { errcode = -9999, errmsg = "仅企业号才可进行部门管理" }); } }
/// <summary> /// 删除标签成员 /// </summary> /// <param name="channelId">渠道id</param> /// <param name="tagId">标签ID</param> /// <param name="userList">企业成员ID列表,注意:userlist、partylist不能同时为空,单次请求长度不超过1000</param> /// <param name="partyList">企业部门ID列表,注意:userlist、partylist不能同时为空,单次请求长度不超过100</param> /// <returns></returns> public static async Task <AddOrDeleteTagMemberResponseDTO> DeleteTagMemberAsync(int channelId, int tagId, List <string> userList = null, List <string> partyList = null) { var validateResult = WeixinConfigHelper.ValidateWorkChannel(channelId, out WeixinConfigDTO configDto); if (validateResult) { var delTagUsersUrl = string.Format("https://qyapi.weixin.qq.com/cgi-bin/tag/deltagusers?access_token={0}", configDto.AccessToken); var postData = new { tagid = tagId, userlist = string.Join("|", userList.ToArray()), partylist = string.Join("|", partyList.ToArray()) }; var result = await HttpHelper.PostDataAsync <AddOrDeleteTagMemberResponseDTO, object>(delTagUsersUrl, postData); return(result); } else { return(new AddOrDeleteTagMemberResponseDTO { errcode = -9999, errmsg = "仅企业号才可进行标签管理" }); } }
/// <summary> /// 更新标签名字 /// </summary> /// <param name="channelId">渠道id</param> /// <param name="tagName">标签名称,长度限制为32个字(汉字或英文字母),标签不可与其他标签重名。</param> /// <param name="tagId">标签ID</param> /// <returns></returns> public static async Task <ResponseBaseDTO> UpdateTagNameAsync(int channelId, string tagName, int tagId) { var validateResult = WeixinConfigHelper.ValidateWorkChannel(channelId, out WeixinConfigDTO configDto); if (validateResult) { var updateTagNameUrl = string.Format("https://qyapi.weixin.qq.com/cgi-bin/tag/update?access_token={0}", configDto.AccessToken); var postData = new { tagname = tagName, tagid = tagId }; var result = await HttpHelper.PostDataAsync <ResponseBaseDTO, object>(updateTagNameUrl, postData); return(result); } else { return(new ResponseBaseDTO { errcode = -9999, errmsg = "仅企业号才可进行标签管理" }); } }
/// <summary> /// 企业号发送应用媒体消息 /// </summary> /// <param name="channelId"></param> /// <returns></returns> public static async Task <ResponseWorkMsgDTO> SendWorkAgentMediaMsgAsync <TMessage>(int channelId, TMessage msgDto) where TMessage : RequestWorkMediaMsgDTO { var validateResult = WeixinConfigHelper.ValidateWorkChannel(channelId, out WeixinConfigDTO configDto); if (validateResult) { if (msgDto.Validate()) { msgDto.AgentId = configDto.AgentId; var sendMsgUrl = string.Format("https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={0}", configDto.AccessToken); if (msgDto is RequestWorkFileMsgDTO)//文件消息 { var mediaUploadResult = MediaApi.UploadFile(channelId, UploadMediaFileType.file, msgDto.FilePath); var mediaDto = msgDto as RequestWorkFileMsgDTO; mediaDto.FileInfo.MeidaId = mediaUploadResult.media_id; var result = await HttpHelper.PostDataAsync <ResponseWorkMsgDTO, RequestWorkFileMsgDTO>(sendMsgUrl, mediaDto); return(result); } if (msgDto is RequestWorkImageMsgDTO)//图片消息 { var mediaUploadResult = MediaApi.UploadFile(channelId, UploadMediaFileType.image, msgDto.FilePath); var mediaDto = msgDto as RequestWorkImageMsgDTO; mediaDto.Image.MeidaId = mediaUploadResult.media_id; var result = await HttpHelper.PostDataAsync <ResponseWorkMsgDTO, RequestWorkImageMsgDTO>(sendMsgUrl, mediaDto); return(result); } if (msgDto is RequestWorkVideoMsgDTO)//视频消息 { var mediaUploadResult = MediaApi.UploadFile(channelId, UploadMediaFileType.image, msgDto.FilePath); var mediaDto = msgDto as RequestWorkVideoMsgDTO; mediaDto.VideoInfo.MeidaId = mediaUploadResult.media_id; var result = await HttpHelper.PostDataAsync <ResponseWorkMsgDTO, RequestWorkVideoMsgDTO>(sendMsgUrl, mediaDto); return(result); } if (msgDto is RequestWorkVoiceMsgDTO)//语音消息 { var mediaUploadResult = MediaApi.UploadFile(channelId, UploadMediaFileType.image, msgDto.FilePath); var mediaDto = msgDto as RequestWorkVoiceMsgDTO; mediaDto.VoiceInfo.MeidaId = mediaUploadResult.media_id; var result = await HttpHelper.PostDataAsync <ResponseWorkMsgDTO, RequestWorkVoiceMsgDTO>(sendMsgUrl, mediaDto); return(result); } return(new ResponseWorkMsgDTO { errcode = -9997, errmsg = "请选择接收消息类型" }); } else { return(new ResponseWorkMsgDTO { errcode = -9998, errmsg = "请选择接收消息的用户范围" }); } } else { return(new ResponseWorkMsgDTO { errcode = -9999, errmsg = "仅企业号才可进行主动发送消息" }); } }