微信公眾號開發C#系列-9、多公眾號集中管理


1、概述

通過前面8篇關於微信開發相關文章的學習,我們已經對微信常用開發有了一個比較深入的了解。前面的文章都是基於某一特定公眾號的,在現實業務中同一單位個體運營着不至一個公眾號,此時就需要對多個公眾號集中管理,隨意切換。本篇文章主要介紹多公眾號集中管理的方法、表設計、設置默認公眾號、生成指定格式的URL資源服務器、刷新Access_Token等。

2、公眾號集中管理的方法

我們知道操作微信公眾號時微信服務器都會返回相應的信息到我們自己的中轉服務器上,涉及多個微信公眾號管理時,我們就需要知道是那個公眾號返回的數據以及我們要操作的是那個公眾號。我們通過集中設計一個公眾號管理的界面就可以完成對多公眾號的管理,下面我們介紹具體的方法供大家參考。

3、多公眾號管理表設計

在進行表設計之前,我們先回憶一下我們在申請公眾號時需要填寫的必要信息,如下圖所示 。
微信公眾號相關核心數據項

在上圖中,我們可以看出界面上我們標記的5個數據項是必須的,分別為公眾號(OFFICIAL_ID)、應用ID(APP_ID)、應用密鑰(APP_SECRET)、服務器地址(API_URL)、令牌(TOKEN)。我們可以根據我們實際業務擴展其他的字段方便使用。公眾號管理參考表設計如下圖所示。
微信公眾號參考表設計

上面的表設計我們對申請各種類型公眾號所需的字段都進行了處理。要做到多公眾號管理,我們可以利用主鍵來切分公眾號,這個主鍵ID就需要放到我們公眾號接口配置信息中的URL中,如下圖所示。
公眾號配置URL中的ID設置參考

我們只需要在我們的微信開發服務端得到這個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}

更新所有TOKEN

7、微信公眾號管理相關界面參考

微信主眾號管理主界面

微信公眾號管理編輯界面

參考文章

微信公眾平台技術文檔-官方

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM