Example #1
0
        public void UploadTemporaryNewsTest()
        {
            var accessToken = AccessTokenContainer.GetToken(_appId);

            var file    = @"E:\1.jpg";
            var mediaId = MediaApi.UploadTemporaryMedia(accessToken, UploadMediaFileType.thumb, file).thumb_media_id;

            Assert.IsNotNull(mediaId);

            var new1 = new NewsModel()
            {
                author             = "test",
                content            = "test",
                content_source_url = "http://qy.weiweihi.com/Content/Images/app/qyhelper.png",
                digest             = "test",
                show_cover_pic     = "1",
                thumb_media_id     = mediaId,
                title = "test"
            };

            var new2 = new NewsModel()
            {
                author             = "test",
                content            = "test111",
                content_source_url = "http://qy.weiweihi.com/Content/Images/app/qyhelper.png",
                digest             = "test",
                show_cover_pic     = "1",
                thumb_media_id     = mediaId,
                title = "test"
            };

            var result = MediaApi.UploadTemporaryNews(accessToken, 10000, new1, new2);

            Assert.IsNotNull(result.media_id);
        }
        /// <summary>
        /// 处理语音请求
        /// </summary>
        /// <param name="requestMessage"></param>
        /// <returns></returns>
        public override IResponseMessageBase OnVoiceRequest(RequestMessageVoice requestMessage)
        {
            var responseMessage = CreateResponseMessage <ResponseMessageMusic>();
            //上传缩略图
            //var accessToken = Containers.AccessTokenContainer.TryGetAccessToken(appId, appSecret);
            var uploadResult = MediaApi.UploadTemporaryMedia(appId, UploadMediaFileType.image,
                                                             ServerUtility.ContentRootMapPath("~/Images/Logo.jpg"));

            //设置音乐信息
            responseMessage.Music.Title        = "天籁之音";
            responseMessage.Music.Description  = "播放您上传的语音";
            responseMessage.Music.MusicUrl     = "https://sdk.weixin.senparc.com/Media/GetVoice?mediaId=" + requestMessage.MediaId;
            responseMessage.Music.HQMusicUrl   = "https://sdk.weixin.senparc.com/Media/GetVoice?mediaId=" + requestMessage.MediaId;
            responseMessage.Music.ThumbMediaId = uploadResult.media_id;

            //推送一条客服消息
            try
            {
                CustomApi.SendText(appId, OpenId, "本次上传的音频MediaId:" + requestMessage.MediaId);
            }
            catch
            {
            }

            return(responseMessage);
        }
        //        /// <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);
        }
Example #4
0
        public void UploadForeverVideoTest()
        {
            var accessToken = AccessTokenContainer.GetToken(_appId);

            var file   = @"E:\Test.mp4";
            var result = MediaApi.UploadTemporaryMedia(accessToken, UploadMediaFileType.video, file);

            Assert.IsNotNull(result.media_id);
            mediaId = result.media_id;
        }
Example #5
0
        public void SendImageByGroupIdTest()
        {
            string file    = ""; //文件路径,以下以图片为例
            string groupId = ""; //分组Id

            var accessToken = AccessTokenContainer.GetAccessToken(_appId);
            var mediaId     = MediaApi.UploadTemporaryMedia(accessToken, UploadMediaFileType.image, file).media_id;

            var result = GroupMessageApi.SendGroupMessageByGroupId(accessToken, groupId, mediaId, GroupMessageType.image, false);

            Assert.IsTrue(result.msg_id.Length > 0);
        }
Example #6
0
        public void UploadTemporaryMediaTest()
        {
            var accessToken = AccessTokenContainer.GetToken(_appId);

            var type   = UploadMediaFileType.image;
            var file   = @"E:\1.jpg";
            var result = MediaApi.UploadTemporaryMedia(accessToken, type, file);

            Assert.AreEqual(type, result.type);
            Assert.IsNotNull(result.media_id);
            mediaId = result.media_id;
        }
Example #7
0
        //[TestMethod]
        public string SendImageByOpenIdTest()
        {
            string file = "";//文件路径,以下以图片为例

            string[] openIds = new string[] { _testOpenId };

            var accessToken = AccessTokenContainer.GetAccessToken(_appId);
            var mediaId     = MediaApi.UploadTemporaryMedia(accessToken, UploadMediaFileType.image, file).media_id;
            var result      = GroupMessageApi.SendGroupMessageByOpenId(accessToken, GroupMessageType.image, mediaId, Config.TIME_OUT, openIds);

            Assert.IsTrue(result.msg_id.Length > 0);

            return(result.msg_id);
        }
Example #8
0
        //[TestMethod]
        public string SendImageByOpenIdTest()
        {
            string file = "C:\\Users\\roman\\Pictures\\捕获.PNG";//文件路径,以下以图片为例

            string[] openIds = new string[] { _testOpenId, "oIskUw5ONFqLqb4XUyLHQ7Lu5t64" };

            var accessToken = AccessTokenContainer.GetAccessToken(_appId);
            var mediaId     = MediaApi.UploadTemporaryMedia(accessToken, UploadMediaFileType.image, file).media_id;
            var clientMsgId = DateTime.Now.Ticks.ToString();
            var result      = GroupMessageApi.SendGroupMessageByOpenId(accessToken, GroupMessageType.text, "你好lizejia", clientMsgId, Config.TIME_OUT, openIds);

            Assert.IsTrue(result.msg_id.Length > 0);

            return(result.msg_id);
        }
        /// <summary>
        /// 处理语音请求
        /// </summary>
        /// <param name="requestMessage"></param>
        /// <returns></returns>
        public override IResponseMessageBase OnVoiceRequest(RequestMessageVoice requestMessage)
        {
            var responseMessage = CreateResponseMessage <ResponseMessageMusic>();
            //上传缩略图
            var accessToken  = AccessTokenContainer.TryGetAccessToken(appId, appSecret);
            var uploadResult = MediaApi.UploadTemporaryMedia(accessToken, UploadMediaFileType.image,
                                                             Server.GetMapPath("~/Images/Logo.jpg"));

            //设置音乐信息
            responseMessage.Music.Title        = "天籁之音";
            responseMessage.Music.Description  = "播放您上传的语音";
            responseMessage.Music.MusicUrl     = "http://sdk.weixin.senparc.com/Media/GetVoice?mediaId=" + requestMessage.MediaId;
            responseMessage.Music.HQMusicUrl   = "http://sdk.weixin.senparc.com/Media/GetVoice?mediaId=" + requestMessage.MediaId;
            responseMessage.Music.ThumbMediaId = uploadResult.media_id;
            return(responseMessage);
        }
Example #10
0
        public void UploadTemporaryMediaTest()
        {
            var accessToken = AccessTokenContainer.GetAccessToken(_appId);

            var type = UploadMediaFileType.image;

#if NETSTANDARD2_0 || NETCOREAPP2_0 || NETCOREAPP2_1 || NETCOREAPP2_2
            var file = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "..\\..\\..\\qr.jpg");
#else
            var file = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "..\\..\\qr.jpg");
#endif

            var result = MediaApi.UploadTemporaryMedia(accessToken, type, file);

            Assert.AreEqual(type, result.type);
            Assert.IsNotNull(result.media_id);
            mediaId = result.media_id;
        }
        /// <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);
        }
Example #12
0
        public void DownloadToDirTest()
        {
            ////下载图片
            //var file = string.Format("qr-{0}.jpg", SystemTime.Now.Ticks);
            //using (FileStream fs = new FileStream(file, FileMode.OpenOrCreate))
            //{
            //    Get.Download(url, fs);//下载
            //    fs.Flush();//直接保存,无需处理指针
            //}

#if NETSTANDARD2_0 || NETCOREAPP2_0 || NETCOREAPP2_1 || NETCOREAPP2_2 || NETCOREAPP3_1
            var fileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "..\\..\\..\\qr.jpg");
#else
            var fileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "..\\..\\qr.jpg");
#endif

            //上传素材
            var result = MediaApi.UploadTemporaryMedia(base._appId, UploadMediaFileType.image, fileName);
            Console.WriteLine("MediaId:" + result.media_id);

            //下载
            var url = "https://sdk.weixin.senparc.com/images/v2/ewm_01.png";


#if NETSTANDARD2_0 || NETCOREAPP2_0 || NETCOREAPP2_1 || NETCOREAPP2_2 || NETCOREAPP3_1
            var filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "..\\..\\..\\");
#else
            var filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "..\\..\\");
#endif

            var downloadResult = Senparc.CO2NET.HttpUtility.Get.Download(CommonDI.CommonSP, url, filePath);
            Console.WriteLine(downloadResult);

            Assert.IsTrue(File.Exists(downloadResult));

            //完成之后通常需要强制修改文件名
#if NETSTANDARD2_0 || NETCOREAPP2_0 || NETCOREAPP2_1 || NETCOREAPP2_2 || NETCOREAPP3_1
            File.Move(downloadResult, downloadResult + "core20.renamed.jpg");
#else
            File.Move(downloadResult, downloadResult + ".net45.renamed.jpg");
#endif
        }
Example #13
0
        public VideoMediaIdResult GetVideoMediaIdResultTest()
        {
            var videoFilePath = ServerUtility.ContentRootMapPath("video-test.mp4");

            Console.WriteLine("Video Path:" + videoFilePath);

            //上传视频
            var uploadResult = MediaApi.UploadTemporaryMedia(_appId, UploadMediaFileType.video, videoFilePath);

            Console.WriteLine("Video Upload Result:" + uploadResult);

            string mediaId = uploadResult.media_id;//也可以通过对公众号发送视频获得

            var result = GroupMessageApi.GetVideoMediaIdResult(_appId, mediaId, "test", "test");

            Assert.IsNotNull(result);
            Console.WriteLine("GetVideoMediaIdResult" + result.ToJson());
            Assert.IsNotNull(result.media_id);
            Assert.IsTrue(result.media_id.Length > 0);
            return(result);
        }
Example #14
0
        public void DownloadToDirTest()
        {
            ////下载图片
            //var file = string.Format("qr-{0}.jpg", DateTime.Now.Ticks);
            //using (FileStream fs = new FileStream(file, FileMode.OpenOrCreate))
            //{
            //    Get.Download(url, fs);//下载
            //    fs.Flush();//直接保存,无需处理指针
            //}

            var fileName = @"E:\Senparc项目\WeiXinMPSDK\src\Senparc.Weixin.MP\Senparc.Weixin.MP.Test\qr.jpg";

            //上传素材
            var result = MediaApi.UploadTemporaryMedia(base._appId, UploadMediaFileType.image, fileName);

            Console.WriteLine("MediaId:" + result.media_id);

            //下载
            var url            = "http://sdk.weixin.senparc.com/images/v2/ewm_01.png";
            var filePath       = @"E:\Senparc项目\WeiXinMPSDK\src\Senparc.Weixin.MP\Senparc.Weixin.MP.Test\qr_" + DateTime.Now.ToString("HHmmss") + ".jpg";
            var downloadResult = Senparc.Weixin.HttpUtility.Get.Download(url, filePath);

            Console.WriteLine(downloadResult);
        }
Example #15
0
        public override IResponseMessageBase OnVoiceRequest(RequestMessageVoice requestMessage)
        {
            var responseMessage = CreateResponseMessage <ResponseMessageMusic>();
            //上传缩略图
            var uploadResult = MediaApi.UploadTemporaryMedia(appId, UploadMediaFileType.image,
                                                             Server.GetMapPath("~/Images/Logo.jpg"));

            //设置音乐信息
            responseMessage.Music.Title        = "天籁之音";
            responseMessage.Music.Description  = "播放您上传的语音";
            responseMessage.Music.MusicUrl     = "http://wx.wftx666.com/Media/GetVoice?mediaId=" + requestMessage.MediaId;
            responseMessage.Music.HQMusicUrl   = "http://wx.wftx666.com/Media/GetVoice?mediaId=" + requestMessage.MediaId;
            responseMessage.Music.ThumbMediaId = uploadResult.media_id;

            //推送一条客服消息
            try
            {
                CustomApi.SendText(appId, WeixinOpenId, "本次上传的音频MediaId:" + requestMessage.MediaId);
            }
            catch {
            }

            return(responseMessage);
        }
Example #16
0
        public override IResponseMessageBase OnEvent_ClickRequest(RequestMessageEvent_Click requestMessage)
        {
            IResponseMessageBase reponseMessage = null;

            //菜单点击,需要跟创建菜单时的Key匹配
            switch (requestMessage.EventKey)
            {
            case "OneClick":
            {
                //这个过程实际已经在OnTextOrEventRequest中完成,这里不会执行到。
                var strongResponseMessage = CreateResponseMessage <ResponseMessageText>();
                reponseMessage = strongResponseMessage;
                strongResponseMessage.Content = "您点击了底部按钮。\r\n为了测试微信软件换行bug的应对措施,这里做了一个——\r\n换行";
            }
            break;

            case "SubClickRoot_Text":
            {
                var strongResponseMessage = CreateResponseMessage <ResponseMessageText>();
                reponseMessage = strongResponseMessage;
                strongResponseMessage.Content = "您点击了子菜单按钮。";
            }
            break;

            case "SubClickRoot_News":
            {
                var strongResponseMessage = CreateResponseMessage <ResponseMessageNews>();
                reponseMessage = strongResponseMessage;
                strongResponseMessage.Articles.Add(new Article()
                    {
                        Title       = "您点击了子菜单图文按钮",
                        Description = "您点击了子菜单图文按钮,这是一条图文信息。",
                        PicUrl      = "http://www.w3ccloud.com/Images/qrcode.jpg",
                        Url         = "http://www.w3ccloud.com"
                    });
            }
            break;

            case "SubClickRoot_Music":
            {
                //上传缩略图
                var accessToken  = AccessTokenContainer.TryGetAccessToken(appId, appSecret);
                var uploadResult = MediaApi.UploadTemporaryMedia(accessToken, UploadMediaFileType.thumb,
                                                                 Server.GetMapPath("~/Images/Logo.jpg"));
                //设置音乐信息
                var strongResponseMessage = CreateResponseMessage <ResponseMessageMusic>();
                reponseMessage = strongResponseMessage;
                strongResponseMessage.Music.Title        = "天籁之音";
                strongResponseMessage.Music.Description  = "真的是天籁之音";
                strongResponseMessage.Music.MusicUrl     = "http://www.w3ccloud.com/Content/music1.mp3";
                strongResponseMessage.Music.HQMusicUrl   = "http://www.w3ccloud.com/Content/music1.mp3";
                strongResponseMessage.Music.ThumbMediaId = uploadResult.thumb_media_id;
            }
            break;

            case "SubClickRoot_Image":
            {
                //上传图片
                var accessToken  = AccessTokenContainer.TryGetAccessToken(appId, appSecret);
                var uploadResult = MediaApi.UploadTemporaryMedia(accessToken, UploadMediaFileType.image,
                                                                 Server.GetMapPath("~/Images/Logo.jpg"));
                //设置图片信息
                var strongResponseMessage = CreateResponseMessage <ResponseMessageImage>();
                reponseMessage = strongResponseMessage;
                strongResponseMessage.Image.MediaId = uploadResult.media_id;
            }
            break;

            case "SubClickRoot_Agent":    //代理消息
            {
                //获取返回的XML
                DateTime dt1 = DateTime.Now;
                reponseMessage = MessageAgent.RequestResponseMessage(this, agentUrl, agentToken, RequestDocument.ToString());
                //上面的方法也可以使用扩展方法:this.RequestResponseMessage(this,agentUrl, agentToken, RequestDocument.ToString());

                DateTime dt2 = DateTime.Now;

                if (reponseMessage is ResponseMessageNews)
                {
                    (reponseMessage as ResponseMessageNews)
                    .Articles[0]
                    .Description += string.Format("\r\n\r\n代理过程总耗时:{0}毫秒", (dt2 - dt1).Milliseconds);
                }
            }
            break;

            case "Member":    //托管代理会员信息
            {
                //原始方法为:MessageAgent.RequestXml(this,agentUrl, agentToken, RequestDocument.ToString());//获取返回的XML
                reponseMessage = this.RequestResponseMessage(agentUrl, agentToken, RequestDocument.ToString());
            }
            break;

            case "OAuth":    //OAuth授权测试
            {
                var strongResponseMessage = CreateResponseMessage <ResponseMessageNews>();
                strongResponseMessage.Articles.Add(new Article()
                    {
                        Title       = "OAuth2.0测试",
                        Description = "点击【查看全文】进入授权页面。\r\n注意:此页面仅供测试(是专门的一个临时测试账号的授权,并非Senparc.Weixin.MP SDK官方账号,所以如果授权后出现错误页面数正常情况),测试号随时可能过期。请将此DEMO部署到您自己的服务器上,并使用自己的appid和secret。",
                        Url         = "http://www.w3ccloud.com/oauth2",
                        PicUrl      = "http://www.w3ccloud.com/Images/qrcode.jpg"
                    });
                reponseMessage = strongResponseMessage;
            }
            break;

            case "Description":
            {
                var strongResponseMessage = CreateResponseMessage <ResponseMessageText>();
                strongResponseMessage.Content = GetWelcomeInfo();
                reponseMessage = strongResponseMessage;
            }
            break;

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

            case "SubClickRoot_ScancodePush":
            {
                var strongResponseMessage = CreateResponseMessage <ResponseMessageText>();
                reponseMessage = strongResponseMessage;
                strongResponseMessage.Content = "您点击了【微信扫码】按钮。";
            }
            break;

            default:
            {
                var strongResponseMessage = CreateResponseMessage <ResponseMessageText>();
                strongResponseMessage.Content = "您点击了按钮,EventKey:" + requestMessage.EventKey;
                reponseMessage = strongResponseMessage;
            }
            break;
            }

            return(reponseMessage);
        }
        /// <summary>
        /// 点击事件
        /// </summary>
        /// <param name="requestMessage">请求消息</param>
        /// <returns></returns>
        public override IResponseMessageBase OnEvent_ClickRequest(RequestMessageEvent_Click requestMessage)
        {
            IResponseMessageBase reponseMessage = null;

            //菜单点击,需要跟创建菜单时的Key匹配

            switch (requestMessage.EventKey)
            {
            case "OneClick":
            {
                //这个过程实际已经在OnTextOrEventRequest中命中“OneClick”关键字,并完成回复,这里不会执行到。
                var strongResponseMessage = CreateResponseMessage <ResponseMessageText>();
                reponseMessage = strongResponseMessage;
                strongResponseMessage.Content = "您点击了底部按钮。\r\n为了测试微信软件换行bug的应对措施,这里做了一个——\r\n换行";
            }
            break;

            case "SubClickRoot_Text":
            {
                var strongResponseMessage = CreateResponseMessage <ResponseMessageText>();
                reponseMessage = strongResponseMessage;
                strongResponseMessage.Content = "您点击了子菜单按钮。";
            }
            break;

            case "SubClickRoot_News":
            {
                var strongResponseMessage = CreateResponseMessage <ResponseMessageNews>();
                reponseMessage = strongResponseMessage;
                strongResponseMessage.Articles.Add(new Article()
                    {
                        Title       = "您点击了子菜单图文按钮",
                        Description = "您点击了子菜单图文按钮,这是一条图文信息。这个区域是Description内容\r\n可以使用\\r\\n进行换行。",
                        PicUrl      = "https://sdk.weixin.senparc.com/Images/qrcode.jpg",
                        Url         = "https://sdk.weixin.senparc.com"
                    });

                //随机添加一条图文,或只输出一条图文信息
                if (SystemTime.Now.Second % 2 == 0)
                {
                    strongResponseMessage.Articles.Add(new Article()
                        {
                            Title       = "这是随机产生的第二条图文信息,用于测试多条图文的样式",
                            Description = "这是随机产生的第二条图文信息,用于测试多条图文的样式",
                            PicUrl      = "https://sdk.weixin.senparc.com/Images/qrcode.jpg",
                            Url         = "https://sdk.weixin.senparc.com"
                        });
                }
            }
            break;

            case "SubClickRoot_Music":
            {
                //上传缩略图

#if NET45
                var filePath = "~/Images/Logo.thumb.jpg";
#else
                var filePath = "~/wwwroot/Images/Logo.thumb.jpg";
#endif

                var uploadResult = MediaApi.UploadTemporaryMedia(appId, UploadMediaFileType.thumb,
                                                                 ServerUtility.ContentRootMapPath(filePath));
                //PS:缩略图官方没有特别提示文件大小限制,实际测试哪怕114K也会返回文件过大的错误,因此尽量控制在小一点(当前图片39K)

                //设置音乐信息
                var strongResponseMessage = CreateResponseMessage <ResponseMessageMusic>();
                reponseMessage = strongResponseMessage;
                strongResponseMessage.Music.Title        = "天籁之音";
                strongResponseMessage.Music.Description  = "真的是天籁之音";
                strongResponseMessage.Music.MusicUrl     = "https://sdk.weixin.senparc.com/Content/music1.mp3";
                strongResponseMessage.Music.HQMusicUrl   = "https://sdk.weixin.senparc.com/Content/music1.mp3";
                strongResponseMessage.Music.ThumbMediaId = uploadResult.thumb_media_id;
            }
            break;

            case "SubClickRoot_Image":
            {
                //上传图片
                var filePath = "~/Images/Logo.jpg";

                var uploadResult = MediaApi.UploadTemporaryMedia(appId, UploadMediaFileType.image,
                                                                 ServerUtility.ContentRootMapPath(filePath));
                //设置图片信息
                var strongResponseMessage = CreateResponseMessage <ResponseMessageImage>();
                reponseMessage = strongResponseMessage;
                strongResponseMessage.Image.MediaId = uploadResult.media_id;
            }
            break;

            case "SendMenu":    //菜单消息
            {
                //注意:
                //1、此接口可以在任意地方调用(包括后台线程),此处演示为通过
                //2、一下"s:"前缀只是 Senparc.Weixin 的内部约定,可以使用 OnTextRequest事件中的 requestHandler.SelectMenuKeyword() 方法自动匹配到后缀(如101)

                var menuContentList = new List <SendMenuContent>()
                {
                    new SendMenuContent("101", "满意"),
                    new SendMenuContent("102", "一般"),
                    new SendMenuContent("103", "不满意")
                };
                //使用异步接口
                CustomApi.SendMenuAsync(appId, OpenId, "请对 Senparc.Weixin SDK 给出您的评价", menuContentList, "感谢您的参与!");

                reponseMessage = new ResponseMessageNoResponse();        //不返回任何消息
            }
            break;

            case "SubClickRoot_Agent":    //代理消息
            {
                //获取返回的XML
                var dt1 = SystemTime.Now;
                reponseMessage = MessageAgent.RequestResponseMessage(this, agentUrl, agentToken, RequestDocument.ToString());
                //上面的方法也可以使用扩展方法:this.RequestResponseMessage(this,agentUrl, agentToken, RequestDocument.ToString());

                var dt2 = SystemTime.Now;

                if (reponseMessage is ResponseMessageNews)
                {
                    (reponseMessage as ResponseMessageNews)
                    .Articles[0]
                    .Description += string.Format("\r\n\r\n代理过程总耗时:{0}毫秒", (dt2 - dt1).Milliseconds);
                }
            }
            break;

            case "Member":    //托管代理会员信息
            {
                //原始方法为:MessageAgent.RequestXml(this,agentUrl, agentToken, RequestDocument.ToString());//获取返回的XML
                reponseMessage = this.RequestResponseMessage(agentUrl, agentToken, RequestDocument.ToString());
            }
            break;

            case "OAuth":    //OAuth授权测试
            {
                var strongResponseMessage = CreateResponseMessage <ResponseMessageNews>();

                strongResponseMessage.Articles.Add(new Article()
                    {
                        Title       = "OAuth2.0测试",
                        Description = "选择下面两种不同的方式进行测试,区别在于授权成功后,最后停留的页面。",
                        //Url = "https://sdk.weixin.senparc.com/oauth2",
                        //PicUrl = "https://sdk.weixin.senparc.com/Images/qrcode.jpg"
                    });

                strongResponseMessage.Articles.Add(new Article()
                    {
                        Title       = "OAuth2.0测试(不带returnUrl),测试环境可使用",
                        Description = "OAuth2.0测试(不带returnUrl)",
                        Url         = "https://sdk.weixin.senparc.com/oauth2",
                        PicUrl      = "https://sdk.weixin.senparc.com/Images/qrcode.jpg"
                    });

                var returnUrl = "/OAuth2/TestReturnUrl";
                strongResponseMessage.Articles.Add(new Article()
                    {
                        Title       = "OAuth2.0测试(带returnUrl),生产环境强烈推荐使用",
                        Description = "OAuth2.0测试(带returnUrl)",
                        Url         = "https://sdk.weixin.senparc.com/oauth2?returnUrl=" + returnUrl.UrlEncode(),
                        PicUrl      = "https://sdk.weixin.senparc.com/Images/qrcode.jpg"
                    });

                reponseMessage = strongResponseMessage;
            }
            break;

            case "Description":
            {
                var strongResponseMessage = CreateResponseMessage <ResponseMessageText>();
                strongResponseMessage.Content = GetWelcomeInfo();
                reponseMessage = strongResponseMessage;
            }
            break;

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

            case "SubClickRoot_ScancodePush":
            {
                var strongResponseMessage = CreateResponseMessage <ResponseMessageText>();
                reponseMessage = strongResponseMessage;
                strongResponseMessage.Content = "您点击了【微信扫码】按钮。";
            }
            break;

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

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

            case "GetNewMediaId":    //获取新的MediaId
            {
                var strongResponseMessage = CreateResponseMessage <ResponseMessageText>();
                try
                {
                    var result = MediaApi.UploadForeverMedia(appId, ServerUtility.ContentRootMapPath("~/Images/logo.jpg"));
                    strongResponseMessage.Content = result.media_id;
                }
                catch (Exception e)
                {
                    strongResponseMessage.Content = "发生错误:" + e.Message;
                    WeixinTrace.SendCustomLog("调用UploadForeverMedia()接口发生异常", e.Message);
                }
            }
            break;

            default:
            {
                var strongResponseMessage = CreateResponseMessage <ResponseMessageText>();
                strongResponseMessage.Content = "您点击了按钮,EventKey:" + requestMessage.EventKey;
                reponseMessage = strongResponseMessage;
            }
            break;
            }

            return(reponseMessage);
        }
Example #18
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);
        }
        /// <summary>
        /// 处理文字请求
        /// </summary>
        /// <returns></returns>
        public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage)
        {
            //TODO:这里的逻辑可以交给Service处理具体信息,参考OnLocationRequest方法或/Service/LocationSercice.cs

            //这里可以进行数据库记录或处理

            //发送一条客服消息回复用户

            var contentUpper = requestMessage.Content.ToUpper();

            if (contentUpper == "LINK")
            {
                //发送客服消息
                Senparc.Weixin.WxOpen.AdvancedAPIs.CustomApi.SendLink(appId, OpenId, "欢迎使用 Senparc.Weixin SDK", "感谢大家的支持!\r\n\r\n盛派永远在你身边!",
                                                                      "https://weixin.senparc.com", "https://sdk.weixin.senparc.com/images/book-cover-front-small-3d-transparent.png");
            }
            else if (contentUpper == "CARD")
            {
                //上传封面临时素材
                var uploadResult = MediaApi.UploadTemporaryMedia(appId, UploadMediaFileType.image, ServerUtility.ContentRootMapPath("~/Images/Logo.thumb.jpg"));

                //发送客服消息
                Senparc.Weixin.WxOpen.AdvancedAPIs.CustomApi.SendMiniProgramPage(appId, OpenId, "欢迎使用 Senparc.Weixin SDK", "pages/websocket/websocket",
                                                                                 uploadResult.media_id);
            }
            else if (contentUpper == "客服")
            {
                Senparc.Weixin.WxOpen.AdvancedAPIs.CustomApi.SendText(appId, OpenId, "您即将进入客服");
                var responseMessage = base.CreateResponseMessage <ResponseMessageTransfer_Customer_Service>();
                return(responseMessage);
            }
            else
            {
                var result = new StringBuilder();
                result.AppendFormat("您刚才发送了文字信息:{0}\r\n\r\n", requestMessage.Content);

                if (CurrentMessageContext.RequestMessages.Count > 1)
                {
                    result.AppendFormat("您刚才还发送了如下消息({0}/{1}):\r\n", CurrentMessageContext.RequestMessages.Count,
                                        CurrentMessageContext.StorageData);
                    for (int i = CurrentMessageContext.RequestMessages.Count - 2; i >= 0; i--)
                    {
                        var    historyMessage = CurrentMessageContext.RequestMessages[i];
                        string content        = null;
                        if (historyMessage is RequestMessageText)
                        {
                            content = (historyMessage as RequestMessageText).Content;
                        }
                        else if (historyMessage is RequestMessageEvent_UserEnterTempSession)
                        {
                            content = "[进入客服]";
                        }
                        else
                        {
                            content = string.Format("[非文字信息:{0}]", historyMessage.GetType().Name);
                        }

                        result.AppendFormat("{0} 【{1}】{2}\r\n",
                                            historyMessage.CreateTime.ToString("HH:mm:ss"),
                                            historyMessage.MsgType.ToString(),
                                            content
                                            );
                    }
                    result.AppendLine("\r\n");
                }

                //处理微信换行符识别问题
                var msg = result.ToString().Replace("\r\n", "\n");

                //发送客服消息
                Senparc.Weixin.WxOpen.AdvancedAPIs.CustomApi.SendText(appId, OpenId, msg);

                //也可以使用微信公众号的接口,完美兼容:
                //Senparc.Weixin.MP.AdvancedAPIs.CustomApi.SendText(appId, WeixinOpenId, msg);
            }

            return(new SuccessResponseMessage());

            //和公众号一样回复XML是无效的:
            //            return new SuccessResponseMessage()
            //            {
            //                ReturnText = string.Format(@"<?xml version=""1.0"" encoding=""utf-8""?>
            //<xml>
            //    <ToUserName><![CDATA[{0}]]></ToUserName>
            //    <FromUserName><![CDATA[{1}]]></FromUserName>
            //    <CreateTime>1357986928</CreateTime>
            //    <MsgType><![CDATA[text]]></MsgType>
            //    <Content><![CDATA[TNT2]]></Content>
            //</xml>",requestMessage.FromUserName,requestMessage.ToUserName)
            //            };
        }
Example #20
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);
                }
            }
        }