/// <summary>
        /// 群发消息预览,微信支持多种预览账号,但每次只能一个,所以OpenIdSendParam.touser参数只第一个值有效并转成微信需要的参数键名
        /// </summary>
        /// <param name="previewAccount">touser字段都可以改为towxname,这样就可以针对微信号进行预览(而非openID),towxname和touser同时赋值时,以towxname优先</param>
        /// <param name="openIdSendParam">与实际群发参数一致</param>
        /// <returns>群发消息预览发送结果</returns>
        public WeChatResult <GroupSendResult> PreviewSendAll(PreviewAccount previewAccount, OpenIdSendParam openIdSendParam)
        {
            string accessToken = connect.GetAccessToken();
            string url         = $"https://api.weixin.qq.com/cgi-bin/message/mass/preview?access_token={accessToken}";

            if (openIdSendParam.touser == null || openIdSendParam.touser.Count == 0)
            {
                throw new ArgumentException("OpenIdSendParam.touser必须指定最少一个预览账号");
            }
            string  previewWx  = openIdSendParam.touser[0];
            string  originJson = JsonConvert.SerializeObject(openIdSendParam);
            JObject jobject    = JObject.Parse(originJson);

            jobject.Remove("touser");
            if (previewAccount == PreviewAccount.OpenId)
            {
                jobject.Add($"\"touser\":\"{previewWx}\"");
            }
            else
            {
                jobject.Add($"\"towxname\":\"{previewWx}\"");
            }
            string resultStr = SimulateRequest.HttpPost(url, jobject.ToString());
            WeChatResult <GroupSendResult> weChatResult = JsonConvert.DeserializeObject <WeChatResult <GroupSendResult> >(resultStr);

            if (weChatResult.errcode != WeChatErrorCode.SUCCESS)
            {
                SystemLogHelper.Warn(GetType().FullName, $"群发消息预览PreviewSendAll,微信服务报错:{weChatResult}");
            }
            return(weChatResult);
        }
Exemple #2
0
        /// <summary>
        /// 新增临时素材,注意3天后media_id失效
        /// </summary>
        /// <param name="filePathName">指定包含完整路径的文件名</param>
        /// <returns>微信服务返回的创建结果</returns>
        public WeChatResult <TempMaterialResult> AddTempMaterial(string filePathName)
        {
            string url         = "https://api.weixin.qq.com/cgi-bin/media/upload?access_token={0}&type={1}";
            string accessToken = connect.GetAccessToken();
            string type        = MimeMapping.GetMimeMapping(filePathName); //获取文件的Mime-Type

            type = type.Substring(0, type.IndexOf('/'));                   //提取Mime-Type的前部分
            string fileName = Path.GetFileName(filePathName);

            using (Stream fileStream = new FileStream(filePathName, FileMode.Open))
            {
                if ("image".Equals(type) && fileStream.Length < 64 * 1024)
                {
                    type = "thumb";//如果文件属于图片,而且小于64KB的,类型改成缩略图(thumb)
                }
                else if ("audio".Equals(type))
                {
                    type = "voice";
                }
                url = string.Format(url, accessToken, type);
                string resultStr = SimulateRequest.UploadFile(new UploadFileParam(url, fileName, fileStream));
                WeChatResult <TempMaterialResult> weChatResult = new WeChatResult <TempMaterialResult>(resultStr);
                if (weChatResult.errcode != WeChatErrorCode.SUCCESS)
                {
                    SystemLogHelper.Warn(MethodBase.GetCurrentMethod(), $"新增临时素材AddTempMaterial,微信服务报错:{weChatResult}");
                }
                return(weChatResult);
            }
        }
 /// <summary>
 /// 发送邮件并可发送附件
 /// </summary>
 /// <param name="isBodyHtml">发送的内容是否为html格式</param>
 /// <returns>是否发送成功</returns>
 public bool SendEmailWithAttachment(bool isBodyHtml = false)
 {
     try
     {
         // SmtpClient要发送的邮件实例
         MailMessage message = new MailMessage();
         message.From            = new MailAddress(FromAddress);
         message.Subject         = Subject;
         message.SubjectEncoding = Encoding.UTF8; //标题编码
         message.Body            = Body;
         message.BodyEncoding    = Encoding.UTF8; //邮件内容编码
         message.IsBodyHtml      = isBodyHtml;
         foreach (var to in ToAddressList)
         {
             //添加接收人地址
             message.To.Add(new MailAddress(to));
         }
         //添加邮件附件
         foreach (var file in FileList)
         {
             //添加附件
             // 为邮件创建文件附件对象
             Attachment data = new Attachment(file, MediaTypeNames.Application.Octet);
             // Add time stamp information for the file.
             //为文件添加时间戳信息。
             ContentDisposition disposition = data.ContentDisposition;
             disposition.CreationDate     = System.IO.File.GetCreationTime(file);
             disposition.ModificationDate = System.IO.File.GetLastWriteTime(file);
             disposition.ReadDate         = System.IO.File.GetLastAccessTime(file);
             // Add the file attachment to this e-mail message.
             //将文件附件添加到该电子邮件。
             message.Attachments.Add(data);
             //data.Dispose();
         }
         //添加纯文本格式的替代邮件内容
         foreach (var body in AlternateViews)
         {
             ContentType mimeType = new System.Net.Mime.ContentType("text/html");
             // Add the alternate body to the message.
             AlternateView alternate = AlternateView.CreateAlternateViewFromString(body, mimeType);
             message.AlternateViews.Add(alternate);
         }
         //创建基于密码的身份验证方案
         NetworkCredential nc     = new NetworkCredential(FromAddress, Password);
         SmtpClient        client = new SmtpClient(Server);
         //表示以当前登录用户的默认凭据进行身份验证
         client.UseDefaultCredentials = true;
         client.Credentials           = nc;                                         //设置验证发件人的身份凭证
         client.DeliveryMethod        = System.Net.Mail.SmtpDeliveryMethod.Network; //待发的电子邮件通过网络发送到smtp服务器
         //Send the message.
         //正式发送信息
         client.Send(message);
         return(true);
     }
     catch (Exception ex)
     {
         SystemLogHelper.Error(MethodBase.GetCurrentMethod(), "发送邮件失败_SendEmailWithAttachment", ex);
         return(false);
     }
 }
Exemple #4
0
        /// <summary>
        /// 对微信推送过来的消息进行解密
        /// </summary>
        /// <param name="request">推送过来的请求</param>
        /// <returns>解密后的xml明文</returns>
        private string MessageDecrypt(WeChatEncryptMsg requestEncryptMsg)
        {
            //string signature = request.QueryString["signature"];
            //string timestamp = request.QueryString["timestamp"];
            //string nonce = request.QueryString["nonce"];
            //string openid = request.QueryString["openid"];
            //string encrypt_type = request.QueryString["encrypt_type"];//aes
            //string msg_signature = request.QueryString["msg_signature"];
            var          stream     = requestEncryptMsg.Body; //具体消息数据在请求流里面
            StreamReader reader     = new StreamReader(stream);
            string       ciphertext = reader.ReadToEnd();     //密文消息

            reader.Close();
            string xmlMsgTxt = null;  //解析之后的明文

            if (ciphertext.Contains("<Encrypt>") && ciphertext.Contains("</Encrypt>"))
            {
                int result = wxcpt.DecryptMsg(requestEncryptMsg.MsgSignature,
                                              requestEncryptMsg.Timestamp, requestEncryptMsg.Nonce, ciphertext, ref xmlMsgTxt);
                SystemLogHelper.Info(GetType().FullName, "消息解密处理结果:" + CryptResult(result));
                weChatConfig.EnCrypt = true;//确实启用了加密方式
            }
            else
            {
                xmlMsgTxt            = ciphertext;
                weChatConfig.EnCrypt = false;//并没有启用加密方式
            }
            return(xmlMsgTxt);
        }
Exemple #5
0
        /// <summary>
        /// 新增其他类型永久素材
        /// </summary>
        /// <param name="filePathName">指定包含完整路径的文件名</param>
        /// <param name="videoDescription">上传视频素材时,需提供视频的描述信息</param>
        /// <returns>新增永久素材的结果</returns>
        public WeChatResult <MaterialResult> AddMaterial(string filePathName, VideoDescription videoDescription = null)
        {
            string accessToken = connect.GetAccessToken();
            string type        = MimeMapping.GetMimeMapping(filePathName); //获取文件的Mime-Type

            type = type.Substring(0, type.IndexOf('/'));                   //提取Mime-Type的前部分
            string fileName = Path.GetFileName(filePathName);

            using (Stream fileStream = new FileStream(filePathName, FileMode.Open))
            {
                if ("image".Equals(type) && fileStream.Length < 64 * 1024)
                {
                    type = "thumb";//如果文件属于图片,而且小于64KB的,类型改成缩略图(thumb)
                }
                else if ("audio".Equals(type))
                {
                    type = "voice";
                }
                string          url       = $"https://api.weixin.qq.com/cgi-bin/material/add_material?access_token={accessToken}&type={type}";
                UploadFileParam fileParam = new UploadFileParam(url, fileName, fileStream);
                if (videoDescription != null)
                {
                    fileParam.PostParameters.Add("title", videoDescription.title);
                    fileParam.PostParameters.Add("introduction", videoDescription.introduction);
                }
                string resultStr = SimulateRequest.UploadFile(fileParam);
                WeChatResult <MaterialResult> weChatResult = new WeChatResult <MaterialResult>(resultStr);
                if (weChatResult.errcode != WeChatErrorCode.SUCCESS)
                {
                    SystemLogHelper.Warn(MethodBase.GetCurrentMethod(), $"上传图文消息内的图片获取URLGetUrlByUpdateImg,微信服务报错:{weChatResult}");
                }
                return(weChatResult);
            }
        }
        /// <summary>
        /// 直接去微信获取AccessToken
        /// </summary>
        /// <returns>微信提供的AccessToken</returns>
        private string GetWeChatAccessToken()
        {
            if (WeChatConfig == null)
            {
                throw new NullReferenceException("请使用构造ConnectLinkUp(idOrAppId),或初始化Initialize(idOrAppId)");
            }
            string accessToken = String.Empty;
            string appId       = WeChatConfig.AppID;
            string secret      = WeChatConfig.AppSecret;
            string url         = String.Format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}", appId, secret);
            string resultStr   = SimulateRequest.HttpGet(url);
            WeChatResult <AccessToken> accessTokenResult = new WeChatResult <AccessToken>(resultStr);

            if (accessTokenResult.errcode != WeChatErrorCode.SUCCESS)
            {
                SystemLogHelper.Warn(MethodBase.GetCurrentMethod(), $"直接去微信获取AccessToken,GetWeChatAccessToken(),{accessTokenResult}");
            }
            else
            {
                accessToken = accessTokenResult.resultData.access_token;
                string accessTokenKey = string.Format(RedisKeyPrefix.WECHAT_ACCESS_TOKEN, appId);
                int    validTime      = accessTokenResult.resultData.expires_in - 600;//有效时间提前10分钟
                redisHelper.StringSet(accessTokenKey, accessTokenResult.resultData, TimeSpan.FromSeconds(validTime));
            }
            return(accessToken);
        }
        /// <summary>
        /// 获取公众号的AccessToken
        /// </summary>
        /// <returns>微信提供的AccessToken</returns>
        public string GetAccessToken()
        {
            if (WeChatConfig == null)
            {
                throw new NullReferenceException("请使用构造ConnectLinkUp(idOrAppId),或初始化Initialize(idOrAppId)");
            }
            string accessToken = String.Empty;
            //先从数据库获取Access_Token,如果不存在或已过期,则重新跟微信拿Access_Token
            string appId          = WeChatConfig.AppID;
            string accessTokenKey = string.Format(RedisKeyPrefix.WECHAT_ACCESS_TOKEN, appId);
            string updateTokenKey = string.Format(RedisKeyPrefix.WECHAT_TOKEN_CONCURRENT, appId);

            do
            {
                if ("Concurrent".Equals(accessToken))
                {
                    SystemLogHelper.Info(MethodBase.GetCurrentMethod(), "GetAccessToken(),已有线程直接去微信获取AccessToken,在此等待");
                    Thread.Sleep(500);//发生并发的线程需要回到这里,等待单线程更新完成
                }
                AccessToken wechatAccessToken = redisHelper.StringGet <AccessToken>(accessTokenKey);
                if (wechatAccessToken != null)
                {
                    accessToken = wechatAccessToken.access_token;
                }
                else//Redis里面的Token已经失效,需要单线程去更新Token
                {
                    accessToken = ConcurrentControl.SingleUserFunc(updateTokenKey, "Concurrent", () =>
                    {
                        SystemLogHelper.Info(MethodBase.GetCurrentMethod(), "获取公众号的AccessToken,GetAccessToken(),直接去微信获取AccessToken");
                        return(GetWeChatAccessToken());
                    });
                }
            } while ("Concurrent".Equals(accessToken));
            return(accessToken);
        }
        /// <summary>
        /// 正式写入日志到Redis
        /// </summary>
        /// <typeparam name="TState">泛型</typeparam>
        /// <param name="logLevel">日志等级</param>
        /// <param name="eventId">日志触发事件</param>
        /// <param name="state">泛型实体</param>
        /// <param name="exception">异常信息</param>
        /// <param name="formatter">格式化处理</param>
        public void Log <TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func <TState, Exception, string> formatter)
        {
            if (!IsEnabled(logLevel))
            {
                return;
            }
            var msg = $"日志触发ID:{eventId.Id},日志名:{eventId.Name},具体》》" + formatter(state, exception);

            switch (logLevel)
            {
            case LogLevel.Trace:
            case LogLevel.Debug:
                SystemLogHelper.Debug(moduleName, msg, exception);
                break;

            case LogLevel.Information:
                SystemLogHelper.Info(moduleName, msg, exception);
                break;

            case LogLevel.Warning:
                SystemLogHelper.Warn(moduleName, msg, exception);
                break;

            case LogLevel.Error:
                SystemLogHelper.Error(moduleName, msg, exception);
                break;

            case LogLevel.Critical:
                SystemLogHelper.Fatal(moduleName, msg, exception);
                break;

            default: break;
            }
        }
Exemple #9
0
 /// <summary>
 /// 输出Debug的日志提示
 /// </summary>
 /// <param name="message">日志提示消息</param>
 /// <param name="isWriteLog">是否需要记录到系统日志,默认需要</param>
 public void Debug(string message, bool isWriteLog = true)
 {
     showLog(message + $"---{DateTime.Now} ThreadId:{Thread.CurrentThread.ManagedThreadId}\r\n", Color.Black);
     if (isWriteLog)
     {
         SystemLogHelper.Debug(MethodBase.GetCurrentMethod(), message);
     }
 }
Exemple #10
0
 /// <summary>
 /// 输出Error的日志提示
 /// </summary>
 /// <param name="message">日志提示消息</param>
 /// <param name="exception">可指定发生的异常对象</param>
 /// <param name="isWriteLog">是否需要记录到系统日志,默认需要</param>
 public void Error(string message, Exception exception = null, bool isWriteLog = true)
 {
     showLog(message + exception?.GetExceptionMsg()
             + $"---{DateTime.Now} ThreadId:{Thread.CurrentThread.ManagedThreadId}\r\n", Color.Red);
     if (isWriteLog)
     {
         SystemLogHelper.Error(MethodBase.GetCurrentMethod(), message, exception);
     }
 }
Exemple #11
0
        /// <summary>
        /// 以推送过来请求中的随机字符串、时间戳为基础进行响应消息加密
        /// </summary>
        /// <param name="xmlMsgTxt">要加密的明文</param>
        /// <returns>加密后的密文</returns>
        private string MessageEncrypt(string xmlMsgTxt)
        {
            string timestamp   = TimeHelper.GetTime(DateTime.Now).ToString();
            string nonce       = StringHelper.RandomStr(StrType.NumAndLowercase, 16);
            string sEncryptMsg = null; //xml格式的密文
            int    result      = wxcpt.EncryptMsg(xmlMsgTxt, timestamp, nonce, ref sEncryptMsg);

            SystemLogHelper.Info(GetType().FullName, "消息加密处理结果:" + CryptResult(result));
            return(sEncryptMsg);
        }
Exemple #12
0
 public DatabaseInitService(BackendDBContext context, IMapper mapper,
                            IConfiguration configuration, ILogger <DatabaseInitService> logger,
                            IHttpContextAccessor httpContextAccessor, SystemLogHelper systemLogHelper)
 {
     this.context        = context;
     Mapper              = mapper;
     Configuration       = configuration;
     Logger              = logger;
     HttpContextAccessor = httpContextAccessor;
     SystemLogHelper     = systemLogHelper;
 }
        /// <summary>
        /// 获取设置的行业信息
        /// </summary>
        /// <returns>公众号设置的行业信息</returns>
        public WeChatResult <IndustryQuery> GetIndustry()
        {
            string accessToken = connect.GetAccessToken();
            string url         = "https://api.weixin.qq.com/cgi-bin/template/get_industry?access_token=" + accessToken;
            WeChatResult <IndustryQuery> weChatResult = SimulateRequest.HttpGet <WeChatResult <IndustryQuery> >(url);

            if (weChatResult.errcode != WeChatErrorCode.SUCCESS)
            {
                SystemLogHelper.Warn(GetType().FullName, $"获取设置的行业信息GetIndustry,微信服务报错:{weChatResult}");
            }
            return(weChatResult);
        }
        /// <summary>
        /// 获取公众号已添加的模板列表
        /// </summary>
        /// <returns>公众号获得的模板列表</returns>
        public WeChatResult <TemplateListInfo> SearchTemplate()
        {
            string accessToken = connect.GetAccessToken();
            string url         = "https://api.weixin.qq.com/cgi-bin/template/get_all_private_template?access_token=" + accessToken;
            WeChatResult <TemplateListInfo> weChatResult = SimulateRequest.HttpGet <WeChatResult <TemplateListInfo> >(url);

            if (weChatResult.errcode != WeChatErrorCode.SUCCESS)
            {
                SystemLogHelper.Warn(GetType().FullName, $"获取公众号已添加的模板列表SearchTemplate,微信服务报错:{weChatResult}");
            }
            return(weChatResult);
        }
        /// <summary>
        /// 发送模板消息
        /// </summary>
        /// <param name="templateMessage">发送模板消息的参数</param>
        /// <returns>发送模板消息获得的消息ID</returns>
        public WeChatResult <Msg_ID> SendTemplate(TemplateMessageParam templateMessage)
        {
            string accessToken = connect.GetAccessToken();
            string url         = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken;
            string resultData  = SimulateRequest.HttpPost(url, templateMessage);
            WeChatResult <Msg_ID> weChatResult = new WeChatResult <Msg_ID>(resultData);

            if (weChatResult.errcode != WeChatErrorCode.SUCCESS)
            {
                SystemLogHelper.Warn(GetType().FullName, $"发送模板消息SendTemplate,微信服务报错:{weChatResult}");
            }
            return(weChatResult);
        }
        /// <summary>
        /// 获取群发速度
        /// </summary>
        /// <returns>发送状态查询结果</returns>
        public WeChatResult <GroupSendSpeed> GetSendSpeed()
        {
            string accessToken = connect.GetAccessToken();
            string url         = $"https://api.weixin.qq.com/cgi-bin/message/mass/speed/get?access_token={accessToken}";
            WeChatResult <GroupSendSpeed> weChatResult = SimulateRequest
                                                         .HttpGet <WeChatResult <GroupSendSpeed> >(url);

            if (weChatResult.errcode != WeChatErrorCode.SUCCESS)
            {
                SystemLogHelper.Warn(GetType().FullName, $"获取群发速度GetSendSpeed,微信服务报错:{weChatResult}");
            }
            return(weChatResult);
        }
        /// <summary>
        /// 上传图文消息素材
        /// </summary>
        /// <param name="articleNews">图文消息素材</param>
        /// <returns>上传图文消息素材结果</returns>
        public WeChatResult <UploadNewsResult> UpdateNews(ArticleNews articleNews)
        {
            string accessToken = connect.GetAccessToken();
            string url         = $"https://api.weixin.qq.com/cgi-bin/media/uploadnews?access_token={accessToken}";
            string resultStr   = SimulateRequest.HttpPost(url, articleNews);
            WeChatResult <UploadNewsResult> weChatResult = new WeChatResult <UploadNewsResult>(resultStr);

            if (weChatResult.errcode != WeChatErrorCode.SUCCESS)
            {
                SystemLogHelper.Warn(GetType().FullName, $"上传图文消息素材UpdateNews,微信服务报错:{weChatResult}");
            }
            return(weChatResult);
        }
        /// <summary>
        /// 发送客服输入状态
        /// <para>下发输入状态,需要客服之前30秒内跟用户有过消息交互</para>
        /// <para>在输入状态中(持续15s),不可重复下发输入态</para>
        /// <para>在输入状态中,如果向用户下发消息,会同时取消输入状态</para>
        /// </summary>
        /// <param name="serviceMsg">需发送的客服消息,可指定客服账号</param>
        /// <returns>发送客服消息的微信结果</returns>
        public WeChatResult SendTyping(string openId, WxMsgCommand msgCommand)
        {
            string       accessToken  = connect.GetAccessToken();
            string       url          = "https://api.weixin.qq.com/cgi-bin/message/custom/typing?access_token=" + accessToken;
            string       resultStr    = SimulateRequest.HttpPost(url, new { touser = openId, command = msgCommand.ToString() });
            WeChatResult weChatResult = new WeChatResult(resultStr);

            if (weChatResult.errcode != WeChatErrorCode.SUCCESS)
            {
                SystemLogHelper.Warn(GetType().FullName, $"获取所有客服账号SearchKFList,微信服务报错:{weChatResult}");
            }
            return(weChatResult);
        }
        /// <summary>
        /// 获取所有客服账号,获取公众号中所设置的客服基本信息,包括客服工号、客服昵称、客服登录账号
        /// </summary>
        /// <param name="account">账号,如:[email protected]</param>
        /// <param name="nickName">昵称,如:客服1</param>
        /// <param name="password">客服登录密码,内部会转成md5</param>
        /// <returns>删除的微信结果</returns>
        public WeChatResult <KFAccountInfo> SearchKFList()
        {
            string accessToken = connect.GetAccessToken();
            string url         = "https://api.weixin.qq.com/cgi-bin/customservice/getkflist?access_token=" + accessToken;
            string resultStr   = SimulateRequest.HttpGet(url);
            WeChatResult <KFAccountInfo> weChatResult = new WeChatResult <KFAccountInfo>(resultStr);

            if (weChatResult.errcode != WeChatErrorCode.SUCCESS)
            {
                SystemLogHelper.Warn(GetType().FullName, $"获取所有客服账号SearchKFList,微信服务报错:{weChatResult}");
            }
            return(weChatResult);
        }
        /// <summary>
        /// 设置群发速度
        /// </summary>
        /// <param name="msgId">群发消息后返回的消息id</param>
        /// <returns>发送状态查询结果</returns>
        public WeChatResult SetSendSpeed(int speed)
        {
            string       accessToken  = connect.GetAccessToken();
            string       url          = $"https://api.weixin.qq.com/cgi-bin/message/mass/speed/set?access_token={accessToken}";
            string       resultData   = SimulateRequest.HttpPost(url, new { speed });
            WeChatResult weChatResult = new WeChatResult(resultData);

            if (weChatResult.errcode != WeChatErrorCode.SUCCESS)
            {
                SystemLogHelper.Warn(GetType().FullName, $"设置群发速度SetSendSpeed,微信服务报错:{weChatResult}");
            }
            return(weChatResult);
        }
Exemple #21
0
        /// <summary>
        /// 获取素材总数
        /// </summary>
        /// <returns>微信服务返回的数量结果</returns>
        public WeChatResult <MaterialCount> GetMaterialCount()
        {
            string accessToken = connect.GetAccessToken();
            string url         = "https://api.weixin.qq.com/cgi-bin/material/get_materialcount?access_token=" + accessToken;
            string resultStr   = SimulateRequest.HttpGet(url);
            WeChatResult <MaterialCount> weChatResult = new WeChatResult <MaterialCount>(resultStr);

            if (weChatResult.errcode != WeChatErrorCode.SUCCESS)
            {
                SystemLogHelper.Warn(MethodBase.GetCurrentMethod(), $"获取素材总数GetMaterialCount,微信服务报错:{weChatResult}");
            }
            return(weChatResult);
        }
        /// <summary>
        /// 根据标签进行群发
        /// </summary>
        /// <param name="tagSendParam">标签群发参数</param>
        /// <returns>标签进行群发结果</returns>
        public WeChatResult <GroupSendResult> SendAll(TagSendParam tagSendParam)
        {
            string accessToken = connect.GetAccessToken();
            string url         = $"https://api.weixin.qq.com/cgi-bin/message/mass/sendall?access_token={accessToken}";
            string resultData  = SimulateRequest.HttpPost(url, tagSendParam);
            WeChatResult <GroupSendResult> weChatResult = new WeChatResult <GroupSendResult>(resultData);

            if (weChatResult.errcode != WeChatErrorCode.SUCCESS)
            {
                SystemLogHelper.Warn(GetType().FullName, $"根据标签进行群发SendAll,微信服务报错:{weChatResult}");
            }
            return(weChatResult);
        }
Exemple #23
0
        /// <summary>
        /// 新增永久图文素材
        /// </summary>
        /// <param name="articleNews">图文消息素材</param>
        /// <returns>图文素材MediaId</returns>
        public WeChatResult <Media_Msg> AddNews(ArticleNews articleNews)
        {
            string accessToken = connect.GetAccessToken();
            string url         = $"https://api.weixin.qq.com/cgi-bin/material/add_news?access_token={accessToken}";
            string resultStr   = SimulateRequest.HttpPost(url, articleNews);
            WeChatResult <Media_Msg> weChatResult = new WeChatResult <Media_Msg>(resultStr);

            if (weChatResult.errcode != WeChatErrorCode.SUCCESS)
            {
                SystemLogHelper.Warn(MethodBase.GetCurrentMethod(), $"新增永久图文素材AddNews,微信服务报错:{weChatResult}");
            }
            return(weChatResult);
        }
        /// <summary>
        /// 删除默认菜单,同时删除全部个性化菜单
        /// </summary>
        /// <returns>微信服务返回的删除结果</returns>
        public WeChatResult DeleteMenu()
        {
            string       accessToken  = connect.GetAccessToken();
            string       url          = "https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=" + accessToken;
            string       resultStr    = SimulateRequest.HttpGet(url);
            WeChatResult deleteResult = new WeChatResult(resultStr);

            if (deleteResult.errcode != WeChatErrorCode.SUCCESS)
            {
                SystemLogHelper.Warn(GetType().FullName, $"删除默认菜单DeleteMenu(),微信服务报错:{deleteResult}");
            }
            return(deleteResult);
        }
Exemple #25
0
        /// <summary>
        /// 删除永久素材
        /// </summary>
        /// <param name="mediaId">要删除的永久素材Id</param>
        /// <returns>微信服务返回的删除结果</returns>
        public WeChatResult DelMaterial(string mediaId)
        {
            string       accessToken  = connect.GetAccessToken();
            string       url          = "https://api.weixin.qq.com/cgi-bin/material/del_material?access_token=" + accessToken;
            string       resultStr    = SimulateRequest.HttpPost(url, new { media_id = mediaId });
            WeChatResult weChatResult = new WeChatResult(resultStr);

            if (weChatResult.errcode != WeChatErrorCode.SUCCESS)
            {
                SystemLogHelper.Warn(MethodBase.GetCurrentMethod(), $"删除永久素材DelMaterial,微信服务报错:{weChatResult}");
            }
            return(weChatResult);
        }
Exemple #26
0
        /// <summary>
        /// 推送订阅模板消息给到授权微信用户
        /// </summary>
        /// <param name="subscribeMsg">订阅模板消息</param>
        /// <returns>订阅模板消息推送结果</returns>
        public WeChatResult SendSubscribe(OnceSubscribeMsg subscribeMsg)
        {
            string       accessToken  = connect.GetAccessToken();
            string       url          = $"https://api.weixin.qq.com/cgi-bin/message/template/subscribe?access_token={accessToken}";
            string       resultData   = SimulateRequest.HttpPost(url, subscribeMsg);
            WeChatResult weChatResult = new WeChatResult(resultData);

            if (weChatResult.errcode != WeChatErrorCode.SUCCESS)
            {
                SystemLogHelper.Warn(GetType().FullName, $"推送订阅模板消息给到授权微信用户SendSubscribe,微信服务报错:{weChatResult}");
            }
            return(weChatResult);
        }
        /// <summary>
        /// 查找当前公众号使用的自定义菜单的配置,包括API设置的菜单和公众平台官网通过网站功能发布的菜单
        /// </summary>
        /// <returns>自定义菜单的配置JObject信息</returns>
        public WeChatResult <JObject> SearchCustomMenu()
        {
            string accessToken = connect.GetAccessToken();
            string url         = "https://api.weixin.qq.com/cgi-bin/get_current_selfmenu_info?access_token=" + accessToken;
            string resultStr   = SimulateRequest.HttpGet(url);
            WeChatResult <JObject> customMenuResult = new WeChatResult <JObject>(resultStr);

            if (customMenuResult.errcode != WeChatErrorCode.SUCCESS)
            {
                SystemLogHelper.Warn(GetType().FullName, $"查找当前公众号使用的自定义菜单的配置SearchCustomMenu(),微信服务报错:{customMenuResult}");
            }
            return(customMenuResult);
        }
        /// <summary>
        /// 查询群发消息发送状态
        /// </summary>
        /// <param name="msgId">群发消息后返回的消息id</param>
        /// <returns>发送状态查询结果</returns>
        public WeChatResult <GroupSendStatusResult> GetSendStatus(int msgId)
        {
            string accessToken = connect.GetAccessToken();
            string url         = $"https://api.weixin.qq.com/cgi-bin/message/mass/get?access_token={accessToken}";
            string resultData  = SimulateRequest.HttpPost(url, new { msg_id = msgId });
            WeChatResult <GroupSendStatusResult> weChatResult = new WeChatResult <GroupSendStatusResult>(resultData);

            if (weChatResult.errcode != WeChatErrorCode.SUCCESS)
            {
                SystemLogHelper.Warn(GetType().FullName, $"查询群发消息发送状态GetSendStatus,微信服务报错:{weChatResult}");
            }
            return(weChatResult);
        }
        public LoginModel(IMyUserService myUserService, ILogger <LoginModel> logger,
                          SystemLogHelper systemLogHelper, IHttpContextAccessor httpContextAccessor)
        {
#if DEBUG
            Username     = "******";
            Password     = "******";
            PasswordType = "";
#endif
            this.myUserService  = myUserService;
            this.logger         = logger;
            SystemLogHelper     = systemLogHelper;
            HttpContextAccessor = httpContextAccessor;
        }
        /// <summary>
        /// 根据OpenID列表群发
        /// </summary>
        /// <param name="tagSendParam">OpenID列表群发参数</param>
        /// <returns>OpenID列表群发结果</returns>
        public WeChatResult <GroupSendResult> SendAll(OpenIdSendParam openIdSendParam)
        {
            string accessToken = connect.GetAccessToken();
            string url         = $"https://api.weixin.qq.com/cgi-bin/message/mass/send?access_token={accessToken}";
            string resultData  = SimulateRequest.HttpPost(url, openIdSendParam);
            WeChatResult <GroupSendResult> weChatResult = new WeChatResult <GroupSendResult>(resultData);

            if (weChatResult.errcode != WeChatErrorCode.SUCCESS)
            {
                SystemLogHelper.Warn(MethodBase.GetCurrentMethod(), $"根据OpenID列表群发SendAll,微信服务报错:{weChatResult}");
            }
            return(weChatResult);
        }