/// <summary> /// 获取AccessToken /// </summary> /// <param name="corpId"></param> /// <param name="corpSecret"></param> /// <param name="getNewToken"></param> /// <returns></returns> public static string GetToken(string corpId, string corpSecret, bool getNewToken = false) { var appKey = AccessTokenContainer.BuildingKey(corpId, corpSecret); var result = AccessTokenContainer.GetToken(appKey, getNewToken); return(result); }
public static AccessTokenResult GetToken(string corpId, string corpSecret) { #region 主动调用的频率限制 /* * 当你获取到AccessToken时,你的应用就可以成功调用企业号后台所提供的各种接口以管理或访问企业号后台的资源或给企业号成员发消息。 * * 为了防止企业应用的程序错误而引发企业号服务器负载异常,默认情况下,每个企业号调用接口都有一定的频率限制,当超过此限制时,调用对应接口会收到相应错误码。 * * 以下是当前默认的频率限制,企业号后台可能会根据运营情况调整此阈值: * * 基础频率 * 每企业调用单个cgi/api不可超过1000次/分,30000次/小时 * * 每ip调用单个cgi/api不可超过2000次/分,60000次/小时 * * 每ip获取AccessToken不可超过300次/小时 * * 发消息频率 * 每企业不可超过200次/分钟;不可超过帐号上限数*30人次/天 * * 创建帐号频率 * 每企业创建帐号数不可超过帐号上限数*3/月 */ #endregion return(ApiHandlerWapper.TryCommonApi(accessToken => { var url = string.Format(Config.ApiWorkHost + "/cgi-bin/gettoken?corpid={0}&corpsecret={1}", corpId.AsUrlData(), corpSecret.AsUrlData()); return CommonJsonSend.Send <AccessTokenResult>(null, url, null, CommonJsonSendType.GET); }, AccessTokenContainer.BuildingKey(corpId, corpSecret))); }
public override IWorkResponseMessageBase OnEvent_ChangeContactUpdateUserRequest(RequestMessageEvent_Change_Contact_User_Update requestMessage) { //发送消息 Senparc.Weixin.Work.AdvancedAPIs.ChatApi.SendChatSimpleMessage(AccessTokenContainer.BuildingKey(_workSetting.WeixinCorpId, _workSetting.WeixinCorpSecret), "001", ChatMsgType.text, $"用户信息已被修改:{requestMessage.ToJson(true)}", 1); //Senparc.Weixin.Work.AdvancedAPIs.ChatApi.SendChatSimpleMessage(AccessTokenContainer.BuildingKey(_workSetting), "001", Work.ChatMsgType.text, $"用户信息已被修改:{requestMessage.ToJson(true)}", 1); return(base.OnEvent_ChangeContactUpdateUserRequest(requestMessage)); }
public async Task CreateMenuTest() { ButtonGroup bg = new ButtonGroup(); //单击 bg.button.Add(new SingleClickButton() { name = "单击测试", key = "OneClick", type = MenuButtonType.click.ToString(),//默认已经设为此类型,这里只作为演示 }); //二级菜单 var subButton = new SubButton() { name = "二级菜单" }; subButton.sub_button.Add(new SingleClickButton() { key = "SubClickRoot_Text", name = "返回文本" }); subButton.sub_button.Add(new SingleClickButton() { key = "SubClickRoot_News", name = "返回图文" }); subButton.sub_button.Add(new SingleClickButton() { key = "SubClickRoot_Music", name = "返回音乐" }); subButton.sub_button.Add(new SingleViewButton() { url = "https://weixin.senparc.com", name = "Url跳转" }); subButton.sub_button.Add(new SinglePicPhotoOrAlbumButton() { key = "SubClickRoot_Pic_Photo_Or_Album", name = "微信拍照" }); bg.button.Add(subButton); var workWeixinSetting = Config.SenparcWeixinSetting.WorkSetting; var appKey = AccessTokenContainer.BuildingKey(workWeixinSetting); int agentId; if (!int.TryParse(workWeixinSetting.WeixinCorpAgentId, out agentId)) { throw new WeixinException("WeixinCorpAgentId 必须为整数!"); } var result = await CommonApi.CreateMenuAsync(appKey, agentId, bg); Assert.IsNotNull(result); Assert.AreEqual("ok", result.errmsg); }
public static async Task <JsApiTicketResult> GetTicketAsync(string corpId, string corpSecret) { return(await ApiHandlerWapper.TryCommonApiAsync(async accessToken => { var url = string.Format(Config.ApiWorkHost + "/cgi-bin/get_jsapi_ticket?access_token={0}", accessToken.AsUrlData()); return await CommonJsonSend.SendAsync <JsApiTicketResult>(null, url, null, CommonJsonSendType.GET).ConfigureAwait(false); }, AccessTokenContainer.BuildingKey(corpId, corpSecret)).ConfigureAwait(false)); }
public static JsApiTicketResult GetTicket(string corpId, string corpSecret) { return(ApiHandlerWapper.TryCommonApi(accessToken => { var url = string.Format(Config.ApiWorkHost + "/cgi-bin/get_jsapi_ticket?access_token={0}", accessToken.AsUrlData()); JsApiTicketResult result = CommonJsonSend.Send <JsApiTicketResult>(null, url, null, CommonJsonSendType.GET); return result; }, AccessTokenContainer.BuildingKey(corpId, corpSecret))); }
public override IWorkResponseMessageBase OnTextRequest(RequestMessageText requestMessage) { var responseMessage = this.CreateResponseMessage<ResponseMessageText>(); responseMessage.Content = "您发送了消息:" + requestMessage.Content; //发送一条客服消息 var weixinSetting = Config.SenparcWeixinSetting.WorkSetting; var appKey = AccessTokenContainer.BuildingKey(weixinSetting.WeixinCorpId, weixinSetting.WeixinCorpSecret); MassApi.SendText(appKey, weixinSetting.WeixinCorpAgentId, "这是一条客服消息,对应您发送的消息:" + requestMessage.Content, OpenId); return responseMessage; }
/// <summary> /// 【异步方法】获取调用微信JS接口的临时票据 /// </summary> /// <param name="corpId"></param> /// <param name="corpSecret"></param> /// <param name="isAgentConfig">是否为“应用jsapi_ticket”,如果是某个特定应用,则输入 true(用于计算 agentConfig 的签名),否则为 false。参考:<see href="https://developer.work.weixin.qq.com/document/path/90506#14924"/></param> /// <returns></returns> public static async Task <JsApiTicketResult> GetTicketAsync(string corpId, string corpSecret, bool isAgentConfig) { return(await ApiHandlerWapper.TryCommonApiAsync(async accessToken => { //https://developer.work.weixin.qq.com/document/10029#%E8%8E%B7%E5%8F%96%E5%BA%94%E7%94%A8%E7%9A%84jsapi_ticket var url = isAgentConfig ? $"{Config.ApiWorkHost}/cgi-bin/ticket/get?access_token={accessToken.AsUrlData()}&type=agent_config" : $"{Config.ApiWorkHost}/cgi-bin/get_jsapi_ticket?access_token={accessToken.AsUrlData()}"; return await CommonJsonSend.SendAsync <JsApiTicketResult>(null, url, null, CommonJsonSendType.GET).ConfigureAwait(false); }, AccessTokenContainer.BuildingKey(corpId, corpSecret)).ConfigureAwait(false)); }
// GET: SendMessage public void SendTest(string content, string toParty) { String corpId = ConfigurationManager.AppSettings["CorpId"]; //企业ID String secret = ConfigurationManager.AppSettings["Secret"]; String agentId = ConfigurationManager.AppSettings["AgentId"]; String accessToken = AccessTokenContainer.BuildingKey(corpId, secret); int safe = 0; String toUser = ConfigurationManager.AppSettings["toUser"]; String toTag = ConfigurationManager.AppSettings["toTag"]; int timeOut = 10000; MassResult massResult = MassApi.SendText(accessToken, agentId, content, toUser, toParty, toTag, safe, timeOut); }
public static IApplicationBuilder UserWork(this IApplicationBuilder app, IHostEnvironment env) { var register = Senparc.CO2NET.AspNet.RegisterServices.RegisterService.Start(env, senparcSetting).UseSenparcGlobal(); register.UseSenparcWeixin(senparcWeixinSetting, senparcSetting);//.RegisterWorkAccount(senparcWeixinSetting.Value, "企业微信"); var workSetting = app.ApplicationServices.GetService <IOptions <WorkSetting> >().Value; workSetting.ContactsAccessTokenKey = AccessTokenContainer.BuildingKey(workSetting.CorpId, workSetting.ContactsSecret); AccessTokenContainer.RegisterAsync(workSetting.CorpId, workSetting.ContactsSecret, "Contacts"); workSetting.MsgAccessTokenKey = AccessTokenContainer.BuildingKey(workSetting.CorpId, workSetting.MsgSecret); AccessTokenContainer.RegisterAsync(workSetting.CorpId, workSetting.MsgSecret, "Msg"); workSetting.LoginAccessTokenKey = AccessTokenContainer.BuildingKey(workSetting.CorpId, workSetting.LoginSecret); AccessTokenContainer.RegisterAsync(workSetting.CorpId, workSetting.LoginSecret, "Login"); return(app); }
public void GetAppInfoAsyncTest() { var finishedCount = 0; { Task.Factory.StartNew(async() => { //使用AppKey测试 //常规AccessToken测试 var appKey = AccessTokenContainer.BuildingKey(_corpId, base._corpSecret); var result = await AppApi.GetAppInfoAsync(appKey, 2); Assert.IsNotNull(result.agentid); Assert.AreEqual(result.agentid, "2"); Console.WriteLine("1.Ticket:" + DateTime.Now.Ticks); Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(result)); finishedCount++; }); while (finishedCount < 1) { } } { Task.Factory.StartNew(async() => { //常规AccessToken测试 var accessToken = AccessTokenContainer.GetToken(_corpId, base._corpSecret); var result = await AppApi.GetAppInfoAsync(accessToken, 2); Assert.IsNotNull(result.agentid); Assert.AreEqual(result.agentid, "2"); Console.WriteLine("2.Ticket:" + DateTime.Now.Ticks); Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(result)); finishedCount++; }); while (finishedCount < 2) { } } }
public List <string> GetStaffs() { int fetchChild = 0; int status = 0; int? maxJsonLength = null; String accessToken = AccessTokenContainer.BuildingKey(corpId, secret); GetDepartmentMemberResult gdmr = Senparc.Weixin.QY.AdvancedAPIs.MailListApi.GetDepartmentMember(accessToken, adminToDepartment, fetchChild, status, maxJsonLength); List <UserList_Simple> listSimple = gdmr.userlist; List <String> names = new List <string>(); foreach (UserList_Simple us in listSimple) { String name = us.name; names.Add(name); } return(names); }
/// <summary> /// 接口调用方式一:使用 AppKey /// </summary> /// <returns></returns> public async Task <IActionResult> TryApiByAppKey() { // 获取注册信息 var workWeixinSetting = Config.SenparcWeixinSetting.WorkSetting; // 获取 AppKey var appKey = AccessTokenContainer.BuildingKey(workWeixinSetting); //发送请求 try { //发送文字提醒 var result = await Senparc.Weixin.Work.AdvancedAPIs.MassApi.SendTextAsync(appKey, "001", "这是一条来企业微信的消息"); return(Content("OK")); } catch (ErrorJsonResultException ex) { return(Content($"出错啦:{ex.Message}")); } }
public void GetAppInfoTest() { { //使用AppKey测试 //常规AccessToken测试 var appKey = AccessTokenContainer.BuildingKey(_corpId, base._corpSecret); var result = AppApi.GetAppInfo(appKey, 2); Assert.IsNotNull(result.agentid); Assert.AreEqual(result.agentid, "2"); Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(result)); } { //常规AccessToken测试 var accessToken = AccessTokenContainer.GetToken(_corpId, base._corpSecret); var result = AppApi.GetAppInfo(accessToken, 2); Assert.IsNotNull(result.agentid); Assert.AreEqual(result.agentid, "2"); Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(result)); } }
/// <summary> /// OAuthScope.snsapi_userinfo方式回调 /// </summary> /// <param name="code"></param> /// <param name="returnUrl">用户最初尝试进入的页面</param> /// <returns></returns> public async Task <ActionResult> BaseCallback(string code, string returnUrl) { if (string.IsNullOrEmpty(code)) { return(Content("您拒绝了授权!")); } try { var appKey = AccessTokenContainer.BuildingKey(_workWeixinSetting); var accessToken = await AccessTokenContainer.GetTokenAsync(_corpId, _corpSecret); //获取用户信息 测试链接:https://open.work.weixin.qq.com/wwopen/devtool/interface?doc_id=10019 var oauthResult = await OAuth2Api.GetUserIdAsync(accessToken, code); var userId = oauthResult.UserId; GetMemberResult result = await MailListApi.GetMemberAsync(appKey, userId); if (result.errcode != ReturnCode_Work.请求成功) { return(Content("错误:" + result.errmsg)); } ViewData["returnUrl"] = returnUrl; /* 注意: * 实际适用场景,此处应该跳转到 returnUrl,不要停留在 Callback页面上。 * 因为当用户刷新此页面 URL 时,实际 code 等参数已失效,用户会受到错误信息。 */ return(View(result)); } catch (Exception ex) { return(Content("错误:" + ex.Message)); } }
/// <summary> /// 发送文本消息 /// </summary> /// <param name="corpId">企业ID</param> /// <param name="corpSecret">企业应用秘钥</param> /// <param name="agentId">企业应用ID</param> /// <param name="content">文本内容</param> /// <param name="toUser"></param> /// <param name="toParty"></param> /// <param name="toTag"></param> /// <param name="safe"></param> /// <param name="timeOut"></param> /// <returns></returns> public static MessageResult SendText(string corpId, string corpSecret, int agentId, string content, string toUser = null, string toParty = null, string toTag = null, int safe = 0, int timeOut = Config.TIME_OUT) { var appKey = AccessTokenContainer.BuildingKey(corpId, corpSecret); return(SendText(appKey, agentId, content, toUser, toParty, toTag, safe, timeOut)); }
/// <summary> /// 注册应用凭证信息,此操作只是注册,不会马上获取Token,并将清空之前的Token。 执行此注册过程,会连带注册ProviderTokenContainer。 /// </summary> /// <param name="corpId">企业ID</param> /// <param name="corpSecret">企业应用秘钥</param> /// <returns></returns> public static string BuildingKey(string corpId, string corpSecret) { return(AccessTokenContainer.BuildingKey(corpId, corpSecret)); }