微信公眾號開發C#系列-4、獲取接口調用憑證


獲取access_token時序圖

概述

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

按微信官方的說明,access_token是公眾號的全局唯一接口調用憑據,公眾號調用各接口時都需使用access_token。開發者需要進行妥善保存。access_token的存儲至少要保留512個字符空間。access_token的有效期目前為2個小時,需定時刷新,重復獲取將導致上次獲取的access_token失效。

公眾平台的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就是我們公眾號的掊入信息,如下圖所示:

appID與appsecret

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

瀏覽器直接訪問獲取access_token

正常情況下,微信會返回下述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接口直接獲取憑證的方式,大家可供參考,得到的憑證我是存在了數據庫中,同時支持多公眾號統一維護,詳細可參考后面的文章會介紹微信公眾號統一管理以及定時刷新公眾號憑證。

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

代碼調試獲取access_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


免責聲明!

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



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