天天看點

微信公衆号開發C#系列-4、擷取接口調用憑證

微信公衆号開發C#系列-4、擷取接口調用憑證

擷取接口調用憑證明質就是擷取access_token。在微信接口開發中,許多服務的使用都離不開Access Token,Access Token相當于打開這些服務的鑰匙,正常情況下會在7200秒内失效,重複擷取将導緻上次擷取的Token失效,本文将首先介紹如何擷取Access Token。

按微信官方的說明,access_token是公衆号的全局唯一接口調用憑據,公衆号調用各接口時都需使用access_token。開發者需要進行妥善儲存。access_token的存儲至少要保留512個字元空間。access_token的有效期目前為2個小時,需定時重新整理,重複擷取将導緻上次擷取的access_token失效。

微信公衆号開發C#系列-4、擷取接口調用憑證

概述

公衆平台的API調用所需的access_token的使用及生成方式說明:

1、建議公衆号開發者使用中控伺服器統一擷取和重新整理access_token,其他業務邏輯伺服器所使用的access_token均來自于該中控伺服器,不應該各自去重新整理,否則容易造成沖突,導緻access_token覆寫而影響業務;

2、目前access_token的有效期通過傳回的expire_in來傳達,目前是7200秒之内的值。中控伺服器需要根據這個有效時間提前去重新整理新access_token。在重新整理過程中,中控伺服器可對外繼續輸出的老access_token,此時公衆平台背景會保證在5分鐘内,新老access_token都可用,這保證了第三方業務的平滑過渡;

3、access_token的有效時間可能會在未來有調整,是以中控伺服器不僅需要内部定時主動重新整理,還需要提供被動重新整理access_token的接口,這樣便于業務伺服器在API調用獲知access_token已逾時的情況下,可以觸發access_token的重新整理流程。

怎麼擷取access_token?

公衆号和小程式均可以使用AppID和AppSecret調用接口來擷取access_token。AppID和AppSecret可在“微信公衆平台-開發-基本配置”頁中獲得(需要已經成為開發者,且帳号沒有異常狀态)。調用接口時,請登入“微信公衆平台-開發-基本配置”提前将伺服器IP位址添加到IP白名單中,點選檢視設定方法,否則将無法調用成功。小程式無需配置IP白名單。

這兒需要特别說明的是:在調用所有微信接口時均使用https協定;還有就是如果第三方不使用中控伺服器,而是使選擇各個業務邏輯點各自去重新整理access_taken,那麼就有可能會産生沖突,導緻服務不穩定。

擷取Access Token接口的網址如下:

https請求方式: GET
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=[APPID]&secret=[APPSECRET]
           

方括号内的參數APPID與APPSECRET就是我們公衆号的掊入資訊,如下圖所示:

微信公衆号開發C#系列-4、擷取接口調用憑證

因為得到access_token的接口支援Get請求,因為我們可以直接用浏覽器通路這個接口得到access_token看一下效果,如下圖所示:

微信公衆号開發C#系列-4、擷取接口調用憑證

正常情況下,微信會傳回下述JSON資料包給公衆号:

{"access_token":"ACCESS_TOKEN","expires_in":7200}

錯誤時微信會傳回錯誤碼資訊,JSON資料包實示例如下(該示例為AppID無效錯誤):

{"errcode":40013,"errmsg":"invalid appid"}

可以看到傳回的是一個Json格式的字元串,同時包含了過期的時間為7200秒,也就是2個小時内失效,之後需要重新請求前面的URL擷取新的Token。

實際應用過程中我們一般建議統一的接口來定時重新整理微信access_token,以保證整個微信應用的正常運作。隻要2小時内統一重新整理一下即可。同時對于擷取到的憑證一般統一儲存,可以存在資料庫中,也可以放redis或配置檔案中。

注意:使用access_token的時候要注意此接口是有調用頻率限制的,當超過了每日最大的調用頻率微信伺服器就會對目前公衆号做接口限制,具體詳情請閱讀官方文檔(微信公衆号接口頻率限制說明)

實作方式

擷取access_token的參考代碼如下:

List<KeyValuePair<string, object>> parmeters = new List<KeyValuePair<string, object>>
  {
      new KeyValuePair<string, object>(WeixinOfficialAccountTable.FieldDeleteMark, 0)
  };
  var listOfficialAccount = BaseEntity.GetList<WeixinOfficialAccountEntity>(RDIFrameworkService.Instance.WeixinBasicService.GetOfficialAccountDTByValues(parmeters));
  if (listOfficialAccount != null && listOfficialAccount.Count() > 0)
  {
      foreach (WeixinOfficialAccountEntity entity in listOfficialAccount)
      {
          try
          {
              if (entity.Category == (int)WeChatSubscriberEnum.EnterpriseSubscriber)
              {
                  if (!string.IsNullOrEmpty(entity.AppId) && !string.IsNullOrEmpty(entity.AppSecret))
                  {
                      //方法一:使用Senparc.WeiXin SDK的方法
                      entity.AccessToken = Senparc.Weixin.QY.CommonAPIs.CommonApi.GetToken(entity.AppId, entity.AppSecret).access_token;
                      //方式二,直接調用微信的接口方法
                      //var url = string.Format("https://api.weixin.qq.com/cgi-bin/token?grant_type={0}&appid={1}&secret={2}", "client_credential".AsUrlData(), entity.AppId.AsUrlData(), entity.AppSecret.AsUrlData());
                      //AccessTokenResult result = Get.GetJson<AccessTokenResult>(url);
                      //entity.AccessToken = result.access_token;

                      entity.ModifiedOn = DateTime.Now;
                      returnValue += RDIFrameworkService.Instance.WeixinBasicService.UpdateOfficialAccount(entity);
                  }
              }
              else
              {
                  if (!string.IsNullOrEmpty(entity.AppId) && !string.IsNullOrEmpty(entity.AppSecret))
                  {
                      //方法一:使用Senparc.WeiXin SDK的方法
                      entity.AccessToken = Senparc.Weixin.MP.CommonAPIs.CommonApi.GetToken(entity.AppId, entity.AppSecret).access_token;
                      //方式二,直接調用微信的接口方法
                      //var url = string.Format("https://api.weixin.qq.com/cgi-bin/token?grant_type={0}&appid={1}&secret={2}", "client_credential".AsUrlData(), entity.AppId.AsUrlData(), entity.AppSecret.AsUrlData());
                      //AccessTokenResult result = Get.GetJson<AccessTokenResult>(url);
                      //entity.AccessToken = result.access_token; 
                      entity.ModifiedOn = DateTime.Now;
                      returnValue += RDIFrameworkService.Instance.WeixinBasicService.UpdateOfficialAccount(entity);
                  }
              }
          }
          catch (Exception ex)
          {

          }
      }
  }
           

上面的代碼我們封裝了企業訂閱号、媒體訂閱号、個人訂閱号、測試号的憑證調用。同時使用的Senparc.WeiXin SDK接口直接擷取憑證的方式,大家可供參考,得到的憑證我是存在了資料庫中,同時支援多公衆号統一維護,詳細可參考後面的文章會介紹微信公衆号統一管理以及定時重新整理公衆号憑證。

調試擷取到的憑證效果如下:

微信公衆号開發C#系列-4、擷取接口調用憑證

參考文章

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

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

掃描二維碼立即關注

微信公衆号開發C#系列-4、擷取接口調用憑證

作者:

RDIFramework.NET

出處:http://www.cnblogs.com/huyong/

Email:[email protected]

QQ:406590790

微信:13005007127(同手機号)

架構官網:http://www.rdiframework.net/

架構官網部落格:http://blog.rdiframework.net/

架構其他部落格:http://blog.csdn.net/chinahuyong

http://www.cnblogs.com/huyong

RDIFramework.NET,基于全新.NET Framework與.NET Core的快速資訊化系統開發、整合架構,為企業快速建構垮平台、企業級的應用提供了強大支援。

關于作者:系統架構師、資訊系統項目管理師、DBA。專注于微軟平台項目架構、管理和企業解決方案,多年項目開發與管理經驗,曾多次組織并開發多個大型項目,在面向對象、面向服務以及資料庫領域有一定的造詣。現主要從事基于

RDIFramework.NET

架構的技術開發、咨詢工作,主要服務于金融、醫療衛生、鐵路、電信、物流、物聯網、制造、零售等行業。

如有問題或建議,請多多賜教!

本文版權歸作者和CNBLOGS部落格共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,如有問題,可以通過微信、郵箱、QQ等聯系我,非常感謝。