Пример #1
0
        private void SendSpreadPoster(string openid)
        {
            if (_user == null)
            {
                return;
            }
            AsyncHelper.RunSync(async() =>
            {
                _accessToken = await _wechatCommonManager.GetAccessTokenAsync(_tenant.Id);

                try
                {
                    SpreadPosterManager spreadPosterManager = IocManager.Instance.Resolve <SpreadPosterManager>();
                    string path       = await spreadPosterManager.GetDefaultSpreadPosterAsync(_user.ToUserIdentifier());
                    string serverPath = HttpContext.Current.Server.MapPath(path);
                    UploadTemporaryMediaResult uploadTemporaryMediaResult = await MediaApi.UploadTemporaryMediaAsync(
                        _accessToken,
                        UploadMediaFileType.image,
                        serverPath);
                    _customerServiceMessageHelper.SendImage(_accessToken, openid, uploadTemporaryMediaResult.media_id);
                }
                catch (Exception exception)
                {
                    _customerServiceMessageHelper.SendText(_accessToken, openid, exception.Message);
                }
            });
        }
Пример #2
0
        public void HttpPostTest()
        {
            return;//已经通过,但需要连接远程测试,太耗时,常规测试时暂时忽略。

            /*
             * 说明:在测试之前请确保url可用
             * 当前默认URL为Sample项目,可以使用Ctrl+F5打开Sample项目,确保可以访问
             */

            //随便找一个存在的测试图片
            var file = "..\\..\\..\\..\\Senparc.Weixin.MP.Sample\\Senparc.Weixin.MP.Sample\\Images\\qrcode.jpg";

            var url = "http://localhost:18666/TestUploadMediaFile/?token={0}&type={1}&contentLength={2}";

            using (FileStream fs = new FileStream(file, FileMode.Open))
            {
                url = string.Format(url, "TOKEN", UploadMediaFileType.image.ToString(), fs.Length);
            }

            //获取字符串结果
            var actualResult = RequestUtility.HttpPost(url, new CookieContainer(), formData: null, encoding: null);

            Assert.IsNotNull(actualResult);
            Console.WriteLine(actualResult);

            //比较强类型示例的结果
            UploadTemporaryMediaResult resultEntity = Post.GetResult <UploadTemporaryMediaResult>(actualResult);

            Assert.IsNotNull(resultEntity);
            Assert.AreEqual(UploadMediaFileType.image, resultEntity.type);
            Assert.AreEqual("MEDIA_ID", resultEntity.media_id);
            Assert.AreEqual(123456789, resultEntity.created_at);
        }
Пример #3
0
        //        /// <summary>
        //        /// 取得用户组
        //        /// </summary>
        //        /// <returns></returns>
        //        public JsonResult GetGroupList()
        //        {
        //            Log.Info("≤============", null, null);
        //            string accessToken = string.Empty;
        //            try
        //            {
        //                accessToken = AccessTokenContainer.TryGetAccessToken(AppId, AppSecret);
        //                Log.Info("取得用户组", accessToken, null);
        //            }
        //            catch (Exception ex)
        //            {
        //                Log.Info("Execute:执行微信处理过程", ex.Message, "Exception");
        //            }
        //            finally
        //            {
        //                Log.Info("============≥", null, null);
        //            }
        //            GroupsJson groupJson = GroupsApi.Get(accessToken);
        //            return Json(groupJson.groups, JsonRequestBehavior.AllowGet);
        //        }
        #endregion

        #region MyRegion 取得所有微信关注的粉丝
        //        /// <summary>
        //        /// 取得所有微信关注的粉丝
        //        /// </summary>
        //        /// <returns></returns>
        //                public JsonResult GetUserList()
        //                {
        //
        //                    var accessToken = AccessTokenContainer.TryGetAccessToken(AppId, AppSecret);
        //                    OpenIdResultJson openIdResultJson = null;
        //                    string nextOpenid = string.Empty;
        //                    List<UserInfoJson> list = new List<UserInfoJson>();
        //
        //                    do
        //                    {
        //                        openIdResultJson = UserApi.Get(accessToken, nextOpenid);
        //
        //                        nextOpenid = openIdResultJson.next_openid;
        //
        //                        if (openIdResultJson.data != null)
        //                        {
        //                            foreach (string openid in openIdResultJson.data.openid)
        //                            {
        //                                UserInfoJson userJson = UserApi.Info(accessToken, openid);
        //                                list.Add(userJson);
        //                            }
        //                        }
        //
        //                    } while (openIdResultJson != null && !string.IsNullOrEmpty(openIdResultJson.next_openid));
        //
        //                    return Json(list, JsonRequestBehavior.AllowGet);
        //                }
        #endregion

        #region    材
        /// <summary>
        /// 上传临时素材-上传一张图片为例
        /// </summary>
        /// <returns></returns>
        public UploadTemporaryMediaResult UploadTemporaryMedia()
        {
            var    accessToken = AccessTokenContainer.TryGetAccessToken(AppId, AppSecret);
            string imgUrl      = Server.MapPath("~/logo.png");
            UploadTemporaryMediaResult mediaResult = MediaApi.UploadTemporaryMedia(accessToken, UploadMediaFileType.image, imgUrl);

            return(mediaResult);
        }
Пример #4
0
        public static UploadMediaResult MockTempMediaResult(string type, string mediaId = null)
        {
            var uploadResult = new UploadTemporaryMediaResult()
            {
                MediaId      = mediaId ?? "mediaId",
                ErrorCode    = 0,
                ErrorMessage = "ok",
                ThumbMediaId = "thumbMediaId",
                CreatedAt    = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(),
                Type         = type,
            };

            return(uploadResult);
        }
Пример #5
0
        public void PostGetJsonTest()
        {
            return;//已经通过,但需要连接远程测试,太耗时,常规测试时暂时忽略。

            var url = "http://api.weixin.qq.com/cgi-bin/media/upload?access_token=TOKEN&type=image";

            try
            {
                //这里因为参数错误,系统会返回错误信息
                UploadTemporaryMediaResult resultFail = Post.PostGetJson <UploadTemporaryMediaResult>(url, cookieContainer: null, formData: null, encoding: null);
                Assert.Fail();//上一步就应该已经抛出异常
            }
            catch (ErrorJsonResultException ex)
            {
                //实际返回的信息(错误信息)
                Assert.AreEqual(ex.JsonResult.errcode, ReturnCode.获取access_token时AppSecret错误或者access_token无效);
            }
        }
Пример #6
0
        /// <summary>
        /// 群发消息
        /// </summary>
        /// <param name="type">
        /// 群发类型Text = 0,
        /// News = 1,
        /// Music = 2,
        /// Image = 3,
        /// Voice = 4,
        /// Video = 5
        /// <param name="groupId">要发送的用户分组ID 发给所有的时候可以不输入</param>
        /// <returns>返回消息ID</returns>
        public string SendGroupMessageAll(int type, int groupId = -1)
        {
            var        accessToken = AccessTokenContainer.TryGetAccessToken(AppId, AppSecret);
            SendResult result      = null;
            bool       isToAll     = (groupId == -1);
            string     imgFilePath = Server.MapPath("~/logo.png");

            switch ((ResponseMsgType)type)
            {
            case ResponseMsgType.Text:
                result = GroupMessageApi.SendGroupMessageByGroupId(accessToken, groupId.ToString(),
                                                                   "测试的群发文本内容---来自北盟网校", GroupMessageType.text, isToAll);
                break;

            case ResponseMsgType.Image:
                UploadTemporaryMediaResult mediaImage =
                    MediaApi.UploadTemporaryMedia(accessToken, UploadMediaFileType.image, imgFilePath);
                result = GroupMessageApi.SendGroupMessageByGroupId(accessToken, groupId.ToString(),
                                                                   mediaImage.media_id, GroupMessageType.image, isToAll);
                break;

            case ResponseMsgType.News:
                UploadTemporaryMediaResult mediaResultImage =
                    MediaApi.UploadTemporaryMedia(accessToken, UploadMediaFileType.image, imgFilePath);
                NewsModel[] newsModels = new NewsModel[5];
                for (int i = 0; i < 5; i++)
                {
                    newsModels[i]                    = new NewsModel();
                    newsModels[i].title              = "标题" + i;
                    newsModels[i].author             = "作者";
                    newsModels[i].thumb_media_id     = mediaResultImage.media_id;
                    newsModels[i].show_cover_pic     = "http://weixin.bamn.cn/logo.png";
                    newsModels[i].content            = "内容";
                    newsModels[i].content_source_url = "http://www.bamn.cn";
                    newsModels[i].digest             = "描述";
                }
                var mediaResultNews = MediaApi.UploadTemporaryNews(accessToken, 10000, newsModels);
                result = GroupMessageApi.SendGroupMessageByGroupId(accessToken, groupId.ToString(),
                                                                   mediaResultNews.media_id, GroupMessageType.mpnews, isToAll);
                break;
            }

            return(result.errcode + "-" + result.errmsg);
        }
Пример #7
0
        public void HttpPostTest()
        {
            //return;//已经通过,但需要连接远程测试,太耗时,常规测试时暂时忽略。

            /*
             * 说明:在测试之前请确保url可用
             * 当前默认URL为Sample项目,可以使用Ctrl+F5打开Sample项目,确保可以访问
             */

            //随便找一个存在的测试图片
            var file = "..\\..\\..\\..\\Senparc.Weixin.MP.Sample\\Senparc.Weixin.MP.Sample\\Images\\qrcode.jpg";

            var url = "http://localhost:65395/Media/TestUploadMediaFile/?token={0}&type={1}&contentLength={2}";

            {
                //同步方法测试
                FileStream fs = new FileStream(file, FileMode.Open);

                url = string.Format(url, "TOKEN", UploadMediaFileType.image.ToString(), fs.Length);

                //获取字符串结果
                var actualResult = RequestUtility.HttpPost(url, new CookieContainer(), fs, encoding: null);
                Assert.IsNotNull(actualResult);
                Console.WriteLine(actualResult);

                //比较强类型示例的结果
                UploadTemporaryMediaResult resultEntity = Post.GetResult <UploadTemporaryMediaResult>(actualResult);
                Assert.IsNotNull(resultEntity);
                Assert.AreEqual(UploadMediaFileType.image, resultEntity.type);
                Assert.AreEqual("MEDIA_ID", resultEntity.media_id);
                Assert.AreEqual(123456789, resultEntity.created_at);
            }

            {
                //异步方法测试
                var finished = false;
                Task.Factory.StartNew(async() =>
                {
                    Console.WriteLine("开始异步方法测试");

                    FileStream fs = new FileStream(file, FileMode.Open);

                    url = string.Format(url, "TOKEN", UploadMediaFileType.image.ToString(), fs.Length);

                    //获取字符串结果
                    var actualResult = await RequestUtility.HttpPostAsync(url, new CookieContainer(), fs, encoding: null);
                    Assert.IsNotNull(actualResult);
                    Console.WriteLine(actualResult);

                    //比较强类型示例的结果
                    UploadTemporaryMediaResult resultEntity = Post.GetResult <UploadTemporaryMediaResult>(actualResult);
                    Assert.IsNotNull(resultEntity);
                    Assert.AreEqual(UploadMediaFileType.image, resultEntity.type);
                    Assert.AreEqual("MEDIA_ID", resultEntity.media_id);
                    Assert.AreEqual(123456789, resultEntity.created_at);
                    finished = true;
                });

                while (!finished)
                {
                    Thread.Sleep(10);
                }
            }
        }
Пример #8
0
        public override IResponseMessageBase OnEvent_ClickRequest(RequestMessageEvent_Click requestMessage)
        {
            IResponseMessageBase base2 = null;

            switch (requestMessage.EventKey)
            {
            case "lobby":
                return(this.GetUrlResponse(requestMessage.FromUserName));

            case "OneClick":
            {
                ResponseMessageText text = base.CreateResponseMessage <ResponseMessageText>();
                base2        = text;
                text.Content = "您点击了底部按钮。\r\n为了测试微信软件换行bug的应对措施,这里做了一个——\r\n换行";
                return(base2);
            }

            case "SubClickRoot_Text":
            {
                ResponseMessageText text2 = base.CreateResponseMessage <ResponseMessageText>();
                base2         = text2;
                text2.Content = "您点击了子菜单按钮。";
                return(base2);
            }

            case "SubClickRoot_News":
            {
                ResponseMessageNews news = base.CreateResponseMessage <ResponseMessageNews>();
                base2 = news;
                Article item = new Article
                {
                    Title       = "您点击了子菜单图文按钮",
                    Description = "您点击了子菜单图文按钮,这是一条图文信息。",
                    PicUrl      = "http://sdk.weixin.senparc.com/Images/qrcode.jpg",
                    Url         = "http://sdk.weixin.senparc.com"
                };
                news.Articles.Add(item);
                return(base2);
            }

            case "SubClickRoot_Music":
            {
                UploadTemporaryMediaResult result = MediaApi.UploadTemporaryMedia(AccessTokenContainer.TryGetAccessToken(this.appId, this.appSecret, false), UploadMediaFileType.thumb, Server.GetMapPath("~/Images/Logo.jpg"), 0x2710);
                ResponseMessageMusic       music  = base.CreateResponseMessage <ResponseMessageMusic>();
                base2                    = music;
                music.Music.Title        = "天籁之音";
                music.Music.Description  = "真的是天籁之音";
                music.Music.MusicUrl     = "http://sdk.weixin.senparc.com/Content/music1.mp3";
                music.Music.HQMusicUrl   = "http://sdk.weixin.senparc.com/Content/music1.mp3";
                music.Music.ThumbMediaId = result.thumb_media_id;
                return(base2);
            }

            case "SubClickRoot_Image":
            {
                UploadTemporaryMediaResult result2 = MediaApi.UploadTemporaryMedia(AccessTokenContainer.TryGetAccessToken(this.appId, this.appSecret, false), UploadMediaFileType.image, Server.GetMapPath("~/Images/Logo.jpg"), 0x2710);
                ResponseMessageImage       image   = base.CreateResponseMessage <ResponseMessageImage>();
                base2 = image;
                image.Image.MediaId = result2.media_id;
                return(base2);
            }

            case "OAuth":
            {
                ResponseMessageNews news2    = base.CreateResponseMessage <ResponseMessageNews>();
                Article             article2 = new Article
                {
                    Title       = "OAuth2.0测试",
                    Description = "选择下面两种不同的方式进行测试,区别在于授权成功后,最后停留的页面。"
                };
                news2.Articles.Add(article2);
                Article article3 = new Article
                {
                    Title       = "OAuth2.0测试(不带returnUrl),测试环境可使用",
                    Description = "OAuth2.0测试(不带returnUrl)",
                    Url         = "http://sdk.weixin.senparc.com/oauth2",
                    PicUrl      = "http://sdk.weixin.senparc.com/Images/qrcode.jpg"
                };
                news2.Articles.Add(article3);
                string  url      = "/OAuth2/TestReturnUrl";
                Article article4 = new Article
                {
                    Title       = "OAuth2.0测试(带returnUrl),生产环境强烈推荐使用",
                    Description = "OAuth2.0测试(带returnUrl)",
                    Url         = "http://sdk.weixin.senparc.com/oauth2?returnUrl=" + url.UrlEncode(),
                    PicUrl      = "http://sdk.weixin.senparc.com/Images/qrcode.jpg"
                };
                news2.Articles.Add(article4);
                return(news2);
            }

            case "Description":
            {
                ResponseMessageText text3 = base.CreateResponseMessage <ResponseMessageText>();
                text3.Content = this.GetWelcomeInfo();
                return(text3);
            }

            case "SubClickRoot_PicPhotoOrAlbum":
            {
                ResponseMessageText text4 = base.CreateResponseMessage <ResponseMessageText>();
                base2         = text4;
                text4.Content = "您点击了【微信拍照】按钮。系统将会弹出拍照或者相册发图。";
                return(base2);
            }

            case "SubClickRoot_ScancodePush":
            {
                ResponseMessageText text5 = base.CreateResponseMessage <ResponseMessageText>();
                base2         = text5;
                text5.Content = "您点击了【微信扫码】按钮。";
                return(base2);
            }

            case "ConditionalMenu_Male":
            {
                ResponseMessageText text6 = base.CreateResponseMessage <ResponseMessageText>();
                base2         = text6;
                text6.Content = "您点击了个性化菜单按钮,您的微信性别设置为:男。";
                return(base2);
            }

            case "ConditionalMenu_Femle":
            {
                ResponseMessageText text7 = base.CreateResponseMessage <ResponseMessageText>();
                base2         = text7;
                text7.Content = "您点击了个性化菜单按钮,您的微信性别设置为:女。";
                return(base2);
            }
            }
            ResponseMessageText text8 = base.CreateResponseMessage <ResponseMessageText>();

            text8.Content = "您点击了按钮,EventKey:" + requestMessage.EventKey;
            return(text8);
        }
Пример #9
0
        /// <summary>
        /// 检查用户登录
        /// </summary>
        private void CheckLogin()
        {
            var entities = FormulaHelper.GetEntities <CommonEntities>();

            while (true)
            {
                try
                {
                    #region 发送登录二维码给粉丝
                    foreach (var item in fansQueue.Where(c => c.State == 0))
                    {
                        try
                        {
                            #region 获取图片并保存到本地
                            CookieContainer cc        = item.Cookies;
                            string          sessionid = item.SessionID;
                            var             img       = WxService.GetQRCode(ref cc, ref sessionid);
                            item.Cookies   = cc;
                            item.SessionID = sessionid;
                            string filename = string.Format("{0}.jpg", DateTime.Now.ToString("yyyMMddHHmmss"));
                            img.Save(string.Format("{0}{1}", QrPhysicsPath, filename), ImageFormat.Jpeg);
                            #endregion

                            #region   到微信临时素材库
                            UploadTemporaryMediaResult wximgresult = null;
                            try
                            {
                                wximgresult = MediaApi.UploadTemporaryMedia(accesstoken, UploadMediaFileType.image, string.Format("{0}{1}", QrPhysicsPath, filename));
                            }
                            catch (Exception ex)
                            {
                                LogWriter.Error(ex, string.Format("openid为{0}的登录图片第一次上传失败", item.OpenID));
                                UpdateAccessToken();
                                try
                                {
                                    wximgresult = MediaApi.UploadTemporaryMedia(accesstoken, UploadMediaFileType.image, string.Format("{0}{1}", QrPhysicsPath, filename));
                                }
                                catch (Exception ex2)
                                {
                                    LogWriter.Error(ex2, string.Format("openid为{0}的登录图片第二次上传失败", item.OpenID));
                                    UpdateNewAccessToken();
                                    try
                                    {
                                        wximgresult = MediaApi.UploadTemporaryMedia(accesstoken, UploadMediaFileType.image, string.Format("{0}{1}", QrPhysicsPath, filename));
                                    }
                                    catch (Exception ex3)
                                    {
                                        LogWriter.Error(ex3, string.Format("openid为{0}的登录图片第三次上传失败", item.OpenID));
                                        item.WxErrorCount++;
                                        continue;
                                    }
                                }
                            }
                            #endregion

                            #region 发送消息给用户
                            if (!string.IsNullOrEmpty(wximgresult.media_id))
                            {
                                try
                                {
                                    SendWxImg(item.OpenID, wximgresult.media_id);
                                    SendWxMsg(item.OpenID, LoginMessage);
                                }
                                catch
                                {
                                    item.WxErrorCount++;
                                    throw;
                                }
                            }
                            #endregion

                            #region 更新用户状态
                            item.State      = 1;
                            item.SendQRTime = DateTime.Now;
                            var ety = entities.Set <FansLogin>().Find(item.LoginID);
                            if (ety != null)
                            {
                                ety.SessionID  = sessionid;
                                ety.IsSendQR   = true;
                                ety.SendQRTime = DateTime.Now;
                                entities.SaveChanges();
                            }
                            #endregion
                        }
                        catch (Exception ex)
                        {
                            LogWriter.Error(ex);
                        }
                    }
                    #endregion

                    #region 检查超时登录登录状态
                    foreach (var item in fansQueue.Where(c => (c.State == 1 || c.State == 2) && c.SendQRTime.AddMinutes(5) <= DateTime.Now))
                    {
                        FinishFans(item, LoginOutTimeMessage);
                    }
                    lock (queuelock)
                    {
                        var count = fansQueue.RemoveAll(c => c.State == 5);
                        while (fansQueue.Count < CheckFriendsMax && waitFansQueue.Any())
                        {
                            var item = waitFansQueue.Peek();
                            fansQueue.Add(new FansData()
                            {
                                LoginID   = item.LoginID,
                                OpenID    = item.OpenID,
                                ApplyTime = item.ApplyTime,
                                State     = 0,
                                Cookies   = new CookieContainer(),
                            });

                            LogWriter.Info(string.Format("waitadd {0}", JsonConvert.SerializeObject(new
                            {
                                LoginID   = item.LoginID,
                                OpenID    = item.OpenID,
                                ApplyTime = item.ApplyTime,
                                State     = 0,
                            })));
                            waitFansQueue.Dequeue();
                        }
                    }
                    #endregion

                    #region 检查登录状态
                    foreach (var item in fansQueue.Where(c => c.State == 1 || c.State == 2))
                    {
                        CookieContainer cc           = item.Cookies;
                        string          passticket   = item.PassTicket;
                        string          skey         = item.SKey;
                        var             login_result = WxService.LoginCheck(ref cc, item.SessionID);
                        if (login_result is Image)
                        {
                            item.State = 2;
                        }
                        else if (login_result is string)
                        {
                            WxService.GetSidUid(ref cc, login_result as string, ref passticket, ref skey);
                            item.State     = 3;
                            item.LoginTime = DateTime.Now;
                            #region 更新用户状态
                            var ety = entities.Set <FansLogin>().Find(item.LoginID);
                            if (ety != null)
                            {
                                ety.PassTicket = passticket;
                                ety.Skey       = skey;
                                ety.IsLogin    = true;
                                ety.LoginTime  = DateTime.Now;
                                entities.SaveChanges();
                            }
                            #endregion
                        }
                        item.Cookies    = cc;
                        item.PassTicket = passticket;
                        item.SKey       = skey;
                    }
                    foreach (var item in fansQueue.Where(c => new int[] { 1, 2, 3 }.Contains(c.State) && c.WxErrorCount > InterfaceMaxError))
                    {
                        FinishFans(item, "");
                    }
                    #endregion
                }
                catch (Exception ex)
                {
                    LogWriter.Error(ex);
                }
                finally
                {
                    Thread.Sleep(CheckLoginTime);
                }
            }
        }