經過前面8篇關於微信開發相關文章的學習,咱們已經對微信經常使用開發有了一個比較深刻的瞭解。前面的文章都是基於某一特定公衆號的,在現實業務中同一單位個體運營着不至一個公衆號,此時就須要對多個公衆號集中管理,隨意切換。本篇文章主要介紹多公衆號集中管理的方法、表設計、設置默認公衆號、生成指定格式的URL資源服務器、刷新Access_Token等。git
咱們知道操做微信公衆號時微信服務器都會返回相應的信息到咱們本身的中轉服務器上,涉及多個微信公衆號管理時,咱們就須要知道是那個公衆號返回的數據以及咱們要操做的是那個公衆號。咱們經過集中設計一個公衆號管理的界面就能夠完成對多公衆號的管理,下面咱們介紹具體的方法供你們參考。github
在進行表設計以前,咱們先回憶一下咱們在申請公衆號時須要填寫的必要信息,以下圖所示 。
api
在上圖中,咱們能夠看出界面上咱們標記的5個數據項是必須的,分別爲公衆號(OFFICIAL_ID)、應用ID(APP_ID)、應用密鑰(APP_SECRET)、服務器地址(API_URL)、令牌(TOKEN)。咱們能夠根據咱們實際業務擴展其餘的字段方便使用。公衆號管理參考表設計以下圖所示。
瀏覽器
上面的表設計咱們對申請各類類型公衆號所需的字段都進行了處理。要作到多公衆號管理,咱們能夠利用主鍵來切分公衆號,這個主鍵ID就須要放到咱們公衆號接口配置信息中的URL中,以下圖所示。
緩存
咱們只須要在咱們的微信開發服務端獲得這個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,是咱們服務器的響應微信請求的地址。
假設咱們本身的服務器域名是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有效期只有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}
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),及時瞭解最新動態。
掃描二維碼當即關注