首页 > 编程语言 >微信公众号开发C#系列-9、多公众号集中管理

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

时间:2023-06-13 16:06:30浏览次数:60  
标签:return string C# 微信 默认 公众 Token



本文目录

  • 1、概述
  • 2、公众号集中管理的方法
  • 3、多公众号管理表设计
  • 4、默认公众号设置
  • 5、生成指定格式的URL资源服务器
  • 6、刷新Access_Token
  • 7、微信公众号管理相关界面参考
  • 参考文章


1、概述

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

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

我们知道操作微信公众号时微信服务器都会返回相应的信息到我们自己的中转服务器上,涉及多个微信公众号管理时,我们就需要知道是那个公众号返回的数据以及我们要操作的是那个公众号。我们通过集中设计一个公众号管理的界面就可以完成对多公众号的管理,下面我们介绍具体的方法供大家参考。

3、多公众号管理表设计

在进行表设计之前,我们先回忆一下我们在申请公众号时需要填写的必要信息,如下图所示 。

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


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

微信公众号开发C#系列-9、多公众号集中管理_快速开发框架_02


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

微信公众号开发C#系列-9、多公众号集中管理_.NET_03


我们只需要在我们的微信开发服务端得到这个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());
    }
}

微信公众号开发C#系列-9、多公众号集中管理_.NET_04

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}

微信公众号开发C#系列-9、多公众号集中管理_RDIFramework.NET_05

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

微信公众号开发C#系列-9、多公众号集中管理_.NET_06


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

标签:return,string,C#,微信,默认,公众,Token
From: https://blog.51cto.com/guosisoft/6470940

相关文章

  • 微信公众号开发C#系列-8、自定义菜单及菜单响应事件的处理
    本文目录1、概述2、自定义菜单的规则3、自定义菜单接口可实现按钮类型的种类4、创建菜单4.1、创建菜单的接口4.2、使用Senparc.Weixin.MPSDK创建自定义菜单4.3、查询已创建的菜单4.4、删除已创建的菜单5、菜单响应事件的处理5.1、点击菜单拉取消息时的事件推送5.2、击菜单跳转链......
  • 微信公众号开发C#系列-6、消息管理-普通消息接受处理
    1、概述通过前面章节的学习,我们已经对微信的开发有了基本的掌握与熟悉,基本可以上手做复杂的应用了。本篇我们将详细讲解微信消息管理中普通消息的接收与处理。当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上。接收普通消息微信官方文档参考:......
  • 微信公众号开发C#系列-5、用户和用户组管理-支持同步
    本文目录1、概述2、本地存放微信粉丝与分组的表结构3、主要接口实现方式3.1、同步指定用户到本地3.2、一键同步所有用户到本地4、关注与取消关注时自动同步本地用户情况4.1、订阅(关注)时的处理4.2、取消关注时的处理5、用户分组管理5.1、创建分组5.2、修改分组5.3、删除分组5.4、查......
  • 微信公众号开发C#系列-4、获取接口调用凭证
    本文目录概述怎么获取access_token?实现方式参考文章概述获取接口调用凭证实质就是获取access_token。在微信接口开发中,许多服务的使用都离不开AccessToken,AccessToken相当于打开这些服务的钥匙,正常情况下会在7200秒内失效,重复获取将导致上次获取的Token失效,本文将首先介绍如何......
  • C#如何进行多线程编程
    C#如何进行多线程编程由于多线程编程非常复杂,这个小例子只能算是一个入门线的知识点吧首先建一个应用程序项目,命名为ThreadExample,在窗体上放一个文本框(textBox1) ,一个标签(lblResult),再放两个按钮,分别命名为btnStart、btnStop。窗体代码:namespaceThreadExample{......
  • C++ Builder 初学问与答(二)
     2.文本输入组件11)问:如果要实现文本输入,在C++Builder中应该怎么办? 答:C++Builder常用文本输入组件来实现,常用的文本输入组件有Edit、MaskEdit、Memo和RichEdit。他们的主要不同在于Edit和MaskEdit用于输入单行文本,而Memo和RichEdit可以输入多行文本。此外Label组件也可用来进行......
  • C#连接MySql数据库的方法
     用MySQLDriverCS连接MySQL数据库   先下载和安装MySQLDriverCS,地址:   http://sourceforge.net/projects/mysqldrivercs/   在安装文件夹下面找到MySQLDriver.dll,然后将MySQLDriver.dll添加引用到项目中   注:我下载的是版本是MySQLDriverCS-n-EasyQueryTools-4.0......
  • C++ Builder 初学问与答(一)
    一直以来都想写一点为BCB初学者快速入门的东西,前不久写了几篇《闲谈BCB》想把自己学习BCB中如何来解决难点的方法说给大家,没想到被骂得不成样子。本想不写了,但觉得这些东西留下来能做什么呢?还是用另一种方法来重新演译我的思维吧,最近有些忙,那几篇没有写完的文章,我也会尽快写完的,至......
  • WinForm下DataGridView导出Excel的实现
    WinForm下DataGridView导出Excel的实现 1.说明:导出的效率说不上很高,但至少是可以接收的.参考网上很多高效导出Excel的方法,实现到时能够实现的,导出速度也很快,不过缺陷在与不能很好的进行单元格的格式化,比如上图中的"拼音码"字段中的值"000000000012120",在导出后就显示"1212......
  • 使用C#的WebService实现客户端软件的更新
    由于项目原因,要实施的客户离作者太远,考虑提供软件的在线升级功能.我们如何实现呢!先讲下思路.思路:先实现WEB端的开发,主要考虑使用WEBService技术,提供远程服务的调用函数,返回一个文件的字节内容,然后写一个升级程序客户端,分发给客户使用的机器中,(可以随客户的软件一起安装).......