微信公众号开发C#系列-9、多公众号集中管理
1、概述
通过前面8篇关于微信开发相关文章的学习,我们已经对微信常用开发有了一个比较深入的了解。前面的文章都是基于某一特定公众号的,在现实业务中同一单位个体运营着不至一个公众号,此时就需要对多个公众号集中管理,随意切换。本篇文章主要介绍多公众号集中管理的方法、表设计、设置默认公众号、生成指定格式的URL资源服务器、刷新Access_Token等。
2、公众号集中管理的方法
我们知道操作微信公众号时微信服务器都会返回相应的信息到我们自己的中转服务器上,涉及多个微信公众号管理时,我们就需要知道是那个公众号返回的数据以及我们要操作的是那个公众号。我们通过集中设计一个公众号管理的界面就可以完成对多公众号的管理,下面我们介绍具体的方法供大家参考。
3、多公众号管理表设计
在进行表设计之前,我们先回忆一下我们在申请公众号时需要填写的必要信息,如下图所示 。
在上图中,我们可以看出界面上我们标记的5个数据项是必须的,分别为公众号(OFFICIAL_ID)、应用ID(APP_ID)、应用密钥(APP_SECRET)、服务器地址(API_URL)、令牌(TOKEN)。我们可以根据我们实际业务扩展其他的字段方便使用。公众号管理参考表设计如下图所示。
上面的表设计我们对申请各种类型公众号所需的字段都进行了处理。要做到多公众号管理,我们可以利用主键来切分公众号,这个主键ID就需要放到我们公众号接口配置信息中的URL中,如下图所示。
我们只需要在我们的微信开发服务端得到这个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());
}
}
5、生成指定格式的URL资源服务器
在阅读本节之前,建议参考了解一下我们的微信公众号开发系列-2、微信公众平台接入指南对微信的接入有了一个比较全面的了解。接入服务器地址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}
7、微信公众号管理相关界面参考
参考文章
RDIFramework.NET — 基于.NET的快速信息化系统开发框架 — 系列目录
RDIFramework.NET ━ .NET快速信息化系统开发框架 ━ 工作流程组件介绍
RDIFramework.NET框架SOA解决方案(集Windows服务、WinForm形式与IIS形式发布)-分布式应用
RDIFramework.NET代码生成器全新V3.5版本发布-重大升级
一路走来数个年头,感谢RDIFramework.NET框架的支持者与使用者,大家可以通过下面的地址了解详情。
RDIFramework.NET官方网站:http://www.rdiframework.net/
RDIFramework.NET官方博客:http://blog.rdiframework.net/
同时需要说明的,以后的所有技术文章以官方网站为准,欢迎大家收藏!
RDIFramework.NET框架由专业团队长期打造、一直在更新、一直在升级,请放心使用!
欢迎关注RDIFramework.net框架官方公众微信(微信号:guosisoft),及时了解最新动态。
扫描二维码立即关注
微信公众号开发C#系列-9、多公众号集中管理的更多相关文章
- 微信公众号开发C#系列-11、生成带参数二维码应用场景
1.概述 我们在微信公众号开发C#系列-7.消息管理-接收事件推送章节有对扫描带参数二维码事件的处理做了讲解.本篇主要讲解通过微信公众号开发平台提供的接口生成带参数的二维码及应用场景. 微信公众号平台 ...
- 微信公众号开发C#系列-7、消息管理-接收事件推送
1.概述 在微信用户和公众号产生交互的过程中,用户的某些操作会使得微信服务器通过事件推送的形式通知到开发者在开发者中心处设置的服务器地址,从而开发者可以获取到该信息.其中,某些事件推送在发生后,是允许 ...
- 微信公众号开发C#系列-1、微信公众平台注册
微信公众号简介 微信公众号分为服务号.订阅号.企业号,订阅号可以个人申请,服务号和企业号要有企业资质才可以. 我们所说的微信公众号开发主要指的是公众号的账号类型,公众号的账号类型分为订阅号.服务号.企 ...
- 微信公众号开发C#系列-12、微信前端开发利器:WeUI
1.前言 通过前面系列文章的学习与讲解,相信大家已经对微信的开发有了一个全新的认识.后端基本能够基于盛派的第三方sdk搞定大部分事宜,剩下的就是前端了.关于手机端的浏览器的兼容性问题相信一直是开发者们 ...
- 微信公众号开发C#系列-5、用户和用户组管理-支持同步
1.概述 眼前时下流行的经济有个叫粉丝经济,粉丝带动收益.一个好运营良好的公众号肯定会有一大批的粉丝团,如何挖掘粉丝来产生效益,是微信营销的关键.微信公众号后台本身提供了粉丝(用户)与用户分组的管理, ...
- 微信公众号开发C#系列-6、消息管理-普通消息接受处理
1.概述 通过前面章节的学习,我们已经对微信的开发有了基本的掌握与熟悉,基本可以上手做复杂的应用了.本篇我们将详细讲解微信消息管理中普通消息的接收与处理.当普通微信用户向公众账号发消息时,微信服务器将 ...
- 微信公众号开发C#系列-4、获取接口调用凭证
概述 获取接口调用凭证实质就是获取access_token.在微信接口开发中,许多服务的使用都离不开Access Token,Access Token相当于打开这些服务的钥匙,正常情况下会在7200秒 ...
- 微信公众号开发C#系列-2、微信公众平台接入指南
概述 微信公众平台消息接口的工作原理大概可以这样理解:从用户端到公众号端一个流程是这样的,用户发送消息到微信服务器,微信服务器将接收到的消息post到用户接入时填写的url中,在url处理程序中,首先 ...
- 微信公众号开发C#系列-10、长链接转短链接
1.概述 短网址的好处众多,便于记忆,占用字符少等,现在市面上出现了众多的将长网址转变为短网址的方法,但是由于他们都是小的公司在幕后运营,所以很不靠谱,面对随时关闭服务的可能,这样也导致我们将转换好了 ...
随机推荐
- JUnit 异常处理
java.lang.Exception: No tests found matching [{ExactMatcher:fDisplayName=testfindAll], {ExactMatcher ...
- ArcGIS API for JavaScript 入门教程[1] 渊源
->对于萌新,你可能需要了解一下这个东西是什么 ->对于已经知道要用这个东西的开发者,你可能需要了解一下它的底层机制 不针对大牛.龟速更新ing. 转载注明出处.博客园&CSDN& ...
- linux内核参数注释与优化
目录 1.linux内核参数注释 2.两种修改内核参数方法 3.内核优化参数生产配置 参数解释由网络上收集整理,常用优化参数对比了网上多个实际应用进行表格化整理,使查看更直观. 学习linux也有不少 ...
- 利用PowerUpSQL攻击SQL Server实例
这篇博客简述如何快速识别被第三方应用使用的SQL Server实例,该第三方软件用PowerUpSQL配置默认用户/密码配置.虽然我曾经多次提到过这一话题,但是我认为值得为这一主题写一篇简短的博客,帮 ...
- stm32的NVIC是什么?
NVIC的全称是Nested vectoredinterrupt controller,即嵌套向量中断控制器. 对于M3和M4内核的MCU,每个中断的优先级都是用寄存器中的8位来设置的.8位的话 ...
- Java开源生鲜电商平台-团购模块设计与架构(源码可下载)
Java开源生鲜电商平台-团购模块设计与架构(源码可下载) 说明:任何一个电商系统中,对于促销这块是必不可少的,毕竟这块是最吸引用户的,用户也是最爱的模块之一,理由很简单,便宜. 我的经验是无论是大的 ...
- Logistic回归二分类Winner or Losser----台大李宏毅机器学习作业二(HW2)
一.作业说明 给定训练集spam_train.csv,要求根据每个ID各种属性值来判断该ID对应角色是Winner还是Losser(0.1分类). 训练集介绍: (1)CSV文件,大小为4000行X5 ...
- 将AE开发的专题图制作功能发布为WPS
AE开发可以定制化实现ArcGIS的地理处理功能,并实际运用于其他方面的工作,有时候我们还希望将AE开发的功能发布为网络地理信息处理服务(WPS),从而能在Web端更自由便利地调用所需要的地学处理算法 ...
- Dubbo Mesh 在闲鱼生产环境中的落地实践
本文作者至简曾在 2018 QCon 上海站以<Service Mesh 的本质.价值和应用探索>为题做了一次分享,其中谈到了 Dubbo Mesh 的整体发展思路是“借力开源.反哺开源” ...
- 【转载】通俗易懂,什么是.NET?什么是.NET Framework?什么是.NET Core?
本文转载自:http://www.cnblogs.com/1996V/p/9037603.html [尊重作者原创,转载说明出处!感谢作者“小曾看世界”分享! ] 什么是.NET?什么是.NET Fr ...