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); } }); }
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); }
// /// <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); }
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); }
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无效); } }
/// <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); }
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); } } }
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> 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); } } }