Toggle navigation
首页
产品中心
全新RDIF.vNext低代码框架
镇店
.NET C/S开发框架
.NET Web敏捷开发框架
.NET 快速开发框架(全新EasyUI版本)
.NET 代码生成器
.NET WebAPI服务端开发框架
客户案例
付款方式
国思学堂
技术文章
新闻资讯
下载
关于
首页
技术文章
.NET(Core)
正文
原创
2019-04-22
浏览 (
10837
)
微信公众号开发C#系列-9、多公众号集中管理
## 1、概述 ## 通过前面8篇关于微信开发相关文章的学习,我们已经对微信常用开发有了一个比较深入的了解。前面的文章都是基于某一特定公众号的,在现实业务中同一单位个体运营着不至一个公众号,此时就需要对多个公众号集中管理,随意切换。本篇文章主要介绍多公众号集中管理的方法、表设计、设置默认公众号、生成指定格式的URL资源服务器、刷新Access_Token等。 ## 2、公众号集中管理的方法 ## 我们知道操作微信公众号时微信服务器都会返回相应的信息到我们自己的中转服务器上,涉及多个微信公众号管理时,我们就需要知道是那个公众号返回的数据以及我们要操作的是那个公众号。我们通过集中设计一个公众号管理的界面就可以完成对多公众号的管理,下面我们介绍具体的方法供大家参考。 ## 3、多公众号管理表设计 ## 在进行表设计之前,我们先回忆一下我们在申请公众号时需要填写的必要信息,如下图所示 。 ![微信公众号相关核心数据项](http://doc.rdiframework.net/blog/article/20190421104403158.png-pw) 在上图中,我们可以看出界面上我们标记的5个数据项是必须的,分别为公众号(OFFICIAL_ID)、应用ID(APP_ID)、应用密钥(APP_SECRET)、服务器地址(API_URL)、令牌(TOKEN)。我们可以根据我们实际业务扩展其他的字段方便使用。公众号管理参考表设计如下图所示。 ![微信公众号参考表设计](http://doc.rdiframework.net/blog/article/20190421104429893.png-pw) 上面的表设计我们对申请各种类型公众号所需的字段都进行了处理。要做到多公众号管理,我们可以利用主键来切分公众号,这个主键ID就需要放到我们公众号接口配置信息中的URL中,如下图所示。 ![公众号配置URL中的ID设置参考](http://doc.rdiframework.net/blog/article/20190421104631607.png-pw) 我们只需要在我们的微信开发服务端得到这个ID值就能知道当前操作的公众号信息,这是多公众号管理设计中的精髓。具体参考本文后面的**生成指定格式的URL资源服务器**的讲解。 ## 4、默认公众号设置 ## 默认公众号就是当前操作的公众号,所有涉及公众号的操作都以默认公众号为基础。在上一节我们的表设计中有一个**IS_DEFAULT**当前操作公众号的字段,只要设置为1就是默认公众号。特别注意的是所有操作公众号中**只允许有一个默认公众号**,设置为一个公众号为默认公众号后,其他的公众号都要取消默认公众号的设置。 要设置默认公众号只需要调用我们框架提供的接口: RDIFrameworkService.Instance.WeixinBasicService.SetDefaultOfficialAccount(UserInfo userInfo, string id); 设置好默认公众号后,我们可以通过下面的接口得到当前操作的公众号: RDIFrameworkService.Instance.WeixinBasicService.GetCurrentOfficialAccountEntity(UserInfo userInfo); 代码参考 /// <summary> /// 设置当前公众号为默认操作公众号 /// </summary> /// <param name="key">主键值</param> /// <returns></returns> [AjaxOnly] [HttpPost] [ManagerPermission(PermissionMode.Enforce)] public virtual ActionResult SetDefault(string key) { int returnValue = 0; try { if (!string.IsNullOrEmpty(key)) { returnValue += RDIFrameworkService.Instance.WeixinBasicService.SetDefaultOfficialAccount(ManageProvider.Provider.Current(), key); } return Content(returnValue > 0 ? new JsonMessage { Success = true, Data = "1", Type = ResultType.Success, Message = RDIFramework.Utilities.RDIFrameworkMessage.MSG3010 }.ToString() : new JsonMessage { Success = false, Data = "0", Type = ResultType.Warning, Message = RDIFramework.Utilities.RDIFrameworkMessage.MSG3020 }.ToString()); } catch (Exception ex) { return Content(new JsonMessage { Success = false, Data = "-1", Type = ResultType.Error, Message = RDIFramework.Utilities.RDIFrameworkMessage.MSG3020 + ex.Message }.ToString()); } } ![设置默认公众号界面](http://doc.rdiframework.net/blog/article/20190421104659962.png-pw) ## 5、生成指定格式的URL资源服务器 ## 在阅读本节之前,建议参考了解一下我们的[微信公众号开发系列-2、微信公众平台接入指南](http://www.guosisoft.com/article/detail/205)对微信的接入有了一个比较全面的了解。接入服务器地址URL是开发者用来接收微信消息和事件的接口URL,是我们服务器的响应微信请求的地址。 假设我们自己的服务器域名是www.rdiframework.net,准备用/WeiXin/WeChat/来接收消息,就填写: http://www.rdiframework.net/WeiXin/WeChat/ 上面的这个地址针对一个公众号时可以,但如果对多公众号管理来说就不能这样用了,我们可以指定一个ID来区分公众号的来源: http://www.rdiframework.net/WeiXin/WeChat/?id=******** 在我们的的微信服务端接入代码中加上对这个ID的处理即可。 处理Get请求代码参考如下: [HttpGet] [ActionName("Index")] public Task<ActionResult> Get(string signature, string timestamp, string nonce, string echostr) { string currentOfficialId = Request["id"]; return Task.Factory.StartNew(() => { if (string.IsNullOrEmpty(currentOfficialId)) { return "非法路径请求!"; } WeixinOfficialAccountEntity weixinOfficialAccountEntity = RDIFrameworkService.Instance.WeixinBasicService.GetOfficialAccountEntity(currentOfficialId); if (CheckSignature.Check(signature, timestamp, nonce, weixinOfficialAccountEntity.Token)) { return echostr; //返回随机字符串则表示验证通过 } else { return "failed:" + signature + "," + CheckSignature.GetSignature(timestamp, nonce, weixinOfficialAccountEntity.Token) + "。" + "如果你在浏览器中看到这句话,说明此地址可以被作为微信公众账号后台的Url,请注意保持Token一致。"; } }).ContinueWith<ActionResult>(task => Content(task.Result)); } 处理Post请求代码参考如下: /// <summary> /// 最简化的处理流程 /// </summary> [HttpPost] [ActionName("Index")] public Task<ActionResult> Post(PostModel postModel) { string currentOfficialId = Request["id"]; return Task.Factory.StartNew<ActionResult>(() => { //没有参数,带有id才能知道是访问哪个公众号 if (string.IsNullOrEmpty(currentOfficialId)) { return new WeixinResult("非法路径请求!"); } WeixinOfficialAccountEntity weixinOfficialAccountEntity = RDIFrameworkService.Instance.WeixinBasicService.GetOfficialAccountEntity(currentOfficialId); if (!CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, weixinOfficialAccountEntity.Token)) { return new WeixinResult("参数错误!"); } postModel.Token = weixinOfficialAccountEntity.Token; postModel.EncodingAESKey = weixinOfficialAccountEntity.OfficialKey; //根据自己后台的设置保持一致 postModel.AppId = weixinOfficialAccountEntity.AppId; //根据自己后台的设置保持一致 var messageHandler = new CustomMessageHandler(Request.InputStream, postModel, currentOfficialId, 10); messageHandler.Execute(); //执行微信处理过程 return new FixWeixinBugWeixinResult(messageHandler); }).ContinueWith<ActionResult>(task => task.Result); } ## 6、刷新Access_Token ## 由于Access Token有效期只有7200秒,而每天调用获取的次数只有2000次,所以需要将Access Token进行缓存来保证不触发超过最大调用次数。另外在微信公众平台中,绝大多数高级接口都需要Access Token授权才能进行调用,开发者需要使用中控服务器统一进行缓存与更新,以避免各自刷新而混乱。 获得Token:我们可以直接使用Senparc.WeiXin SDK的方法。 Senparc.Weixin.MP.CommonAPIs.CommonApi.GetToken(model.AppId, model.AppSecret).access_token; 通过传入AppId和Appsecret,微信服务器将给你一个可访问的Token。 虽然他帮我们封装了,但是不用他的方法,我们也可以直接调用微信的接口方法: var url = string.Format("https://api.weixin.qq.com/cgi-bin/token?grant_type={0}&appid={1}&secret={2}", grant_type.AsUrlData(), appid.AsUrlData(), secret.AsUrlData()); AccessTokenResult result = Get.GetJson<AccessTokenResult>(url); return result; 这个接口,只有几个参数,具体参数可以查看帮助文档 传送门 成功返回: {"access_token":"ACCESS_TOKEN","expires_in":7200} ![更新所有TOKEN](http://doc.rdiframework.net/blog/article/20190421104750565.png-pw) ## 7、微信公众号管理相关界面参考 ## ![微信主众号管理主界面](http://doc.rdiframework.net/blog/article/20190421104816033.png-pw) ![微信公众号管理编辑界面](http://doc.rdiframework.net/blog/article/20190421104831918.png-pw) ## 参考文章 ## [微信公众平台技术文档-官方](https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432) [Senparc.Weixin SDK + 官网示例源代码](https://github.com/JeffreySu/WeiXinMPSDK) [RDIFramework.NET — 基于.NET的快速信息化系统开发框架 — 系列目录](http://www.guosisoft.com/article/detail/190) [RDIFramework.NET ━ .NET快速信息化系统开发框架 ━ 工作流程组件介绍](http://www.guosisoft.com/article/detail/169) [RDIFramework.NET框架SOA解决方案(集Windows服务、WinForm形式与IIS形式发布)-分布式应用](http://www.guosisoft.com/article/detail/189) [RDIFramework.NET代码生成器全新V3.5版本发布-重大升级](http://www.guosisoft.com/article/detail/199) ----- 一路走来数个年头,感谢RDIFramework.NET框架的支持者与使用者,大家可以通过下面的地址了解详情。 RDIFramework.NET官方网站:http://www.rdiframework.net/ RDIFramework.NET官方博客:http://blog.rdiframework.net/ 同时需要说明的,以后的所有技术文章以官方网站为准,欢迎大家收藏! RDIFramework.NET框架由专业团队长期打造、一直在更新、一直在升级,请放心使用! 欢迎关注RDIFramework.net框架官方公众微信(微信号:guosisoft),及时了解最新动态。 扫描二维码立即关注 ![微信号:guosisoft](http://doc.rdiframework.net/weixin.png)
正文到此结束
本文标签:
.NET
微信开发
数据库
挨踢业界
RDIF.NET
版权声明:
本站原创文章,由
guosisoft.com
发布,遵循
CC 4.0 by-sa
版权协议,转载请附上原文出处链接和本声明。
上一篇
微信公众号开发C#系列-8、自定义菜单及菜单响应事件的处理
下一篇
微信公众号开发C#系列-10、长链接转短链接
热门推荐
{{article.title}}
热门指数:
浏览({{article.lookCount + 5000}})
相关文章
{{article.title}}
该篇文章的评论功能暂时被站长关闭
说给你听
本文目录
文章标签
RDIF.NET
其他
微信开发
.NET
消息交互
.NetCore
项目管理
常用工具
工作流
Web前端
数据库
挨踢业界
随机文章
JavaScript初学者应知的24条最佳实践(译)
信息系统项目管理系列之九:项目质量管理
ORACLE常见问题一千问[801至900](不怕学不成、就怕心不诚!)
信息系统项目管理系列之七:项目时间管理
[推荐]ORACLE SQL:经典查询练手第三篇(不懂装懂,永世饭桶!)
RDIFramework.NET平台代码生成器V3.1.6125.27586全新发布-更新于20161029(提供下载)
.NET快速信息化系统开发框架 V3.2->Web版本模块管理界面新增模块排序功能
.NET Core部署到linux(CentOS)最全解决方案,常规篇
VS2010+以上版本网站发布IIS详细步骤
RDIFramework.NET V3.3 Web框架主界面新增横向菜单功能
微信公众号开发C#系列-5、用户和用户组管理-支持同步
[推荐]ORACLE SQL:经典查询练手(不懂装懂,永世饭桶!)
ORACLE PL/SQL编程之八:把触发器说透
ORACLE常见问题一千问[501至600](不怕学不成、就怕心不诚!)
微信公众号开发C#系列-8、自定义菜单及菜单响应事件的处理
值得一看的35个Redis常用问题总结
RDIFramework.NET代码生成器全新V5.0版本发布
RDIFramework.NET框架基于Quartz.Net实现任务调度详解及效果展示
RDIFramework.NET ━ .NET快速信息化系统开发框架 ━ 工作流程组件Web业务平台
ORACLE常见问题一千问[401至500](不怕学不成、就怕心不诚!)
网站信息
文章总数:599 篇
标签总数:8 个
分类总数:8 个
留言数量:1385 条
在线人数:
89
人
运行天数:1321天
最后更新:2023-05-18
QQ:406590790
13005007127