示例#1
0
        /// <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 = "仅企业号才可进行主动发送消息"
                });
            }
        }
示例#2
0
        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);
            }
        }
示例#3
0
        /// <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);
        }
示例#5
0
        /// <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 = "仅企业号才可进行部门管理"
                });
            }
        }
示例#6
0
        /// <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 = "仅企业号才可进行用户管理"
                });
            }
        }
示例#7
0
        /// <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 = "仅企业号才可进行用户管理"
                });
            }
        }
示例#8
0
        /// <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 = "仅企业号才可进行用户管理"
                });
            }
        }
示例#9
0
        /// <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 = "仅企业号才可进行标签管理"
                });
            }
        }
示例#10
0
        /// <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);
        }
示例#11
0
        /// <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 = "仅企业号才可进行部门管理"
                });
            }
        }
示例#12
0
        /// <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 = "仅企业号才可进行标签管理"
                });
            }
        }
示例#13
0
        /// <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 = "仅企业号才可进行标签管理"
                });
            }
        }
示例#14
0
        /// <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 = "仅企业号才可进行主动发送消息"
                });
            }
        }