微信公众号开发C#系列-九、多公众号集中管理

一、概述

经过前面8篇关于微信开发相关文章的学习,咱们已经对微信经常使用开发有了一个比较深刻的了解。前面的文章都是基于某一特定公众号的,在现实业务中同一单位个体运营着不至一个公众号,此时就须要对多个公众号集中管理,随意切换。本篇文章主要介绍多公众号集中管理的方法、表设计、设置默认公众号、生成指定格式的URL资源服务器、刷新Access_Token等。git

二、公众号集中管理的方法

咱们知道操做微信公众号时微信服务器都会返回相应的信息到咱们本身的中转服务器上,涉及多个微信公众号管理时,咱们就须要知道是那个公众号返回的数据以及咱们要操做的是那个公众号。咱们经过集中设计一个公众号管理的界面就能够完成对多公众号的管理,下面咱们介绍具体的方法供你们参考。github

三、多公众号管理表设计

在进行表设计以前,咱们先回忆一下咱们在申请公众号时须要填写的必要信息,以下图所示 。
微信公众号相关核心数据项api

在上图中,咱们能够看出界面上咱们标记的5个数据项是必须的,分别为公众号(OFFICIAL_ID)、应用ID(APP_ID)、应用密钥(APP_SECRET)、服务器地址(API_URL)、令牌(TOKEN)。咱们能够根据咱们实际业务扩展其余的字段方便使用。公众号管理参考表设计以下图所示。
微信公众号参考表设计浏览器

上面的表设计咱们对申请各类类型公众号所需的字段都进行了处理。要作到多公众号管理,咱们能够利用主键来切分公众号,这个主键ID就须要放到咱们公众号接口配置信息中的URL中,以下图所示。
公众号配置URL中的ID设置参考缓存

咱们只须要在咱们的微信开发服务端获得这个ID值就能知道当前操做的公众号信息,这是多公众号管理设计中的精髓。具体参考本文后面的生成指定格式的URL资源服务器的讲解。服务器

四、默认公众号设置

默认公众号就是当前操做的公众号,全部涉及公众号的操做都以默认公众号为基础。在上一节咱们的表设计中有一个IS_DEFAULT当前操做公众号的字段,只要设置为1就是默认公众号。特别注意的是全部操做公众号中只容许有一个默认公众号,设置为一个公众号为默认公众号后,其余的公众号都要取消默认公众号的设置。
要设置默认公众号只须要调用咱们框架提供的接口:微信

RDIFrameworkService.Instance.WeixinBasicService.SetDefaultOfficialAccount(UserInfo userInfo, string id);

设置好默认公众号后,咱们能够经过下面的接口获得当前操做的公众号:微信开发

RDIFrameworkService.Instance.WeixinBasicService.GetCurrentOfficialAccountEntity(UserInfo userInfo);

代码参考app

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

设置默认公众号界面

五、生成指定格式的URL资源服务器

在阅读本节以前,建议参考了解一下咱们的微信公众号开发系列-二、微信公众平台接入指南对微信的接入有了一个比较全面的了解。接入服务器地址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);
}

六、刷新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

七、微信公众号管理相关界面参考

微信主众号管理主界面

微信公众号管理编辑界面

参考文章

微信公众平台技术文档-官方

Senparc.Weixin SDK + 官网示例源代码

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),及时了解最新动态。

扫描二维码当即关注

微信号:guosisoft

相关文章
相关标签/搜索