微信公众号开发系列-四、获取接口调用凭证

获取access_token时序图

概述

获取接口调用凭证明质就是获取access_token。在微信接口开发中,许多服务的使用都离不开Access Token,Access Token至关于打开这些服务的钥匙,正常状况下会在7200秒内失效,重复获取将致使上次获取的Token失效,本文将首先介绍如何获取Access Token。git

按微信官方的说明,access_token是公众号的全局惟一接口调用凭据,公众号调用各接口时都需使用access_token。开发者须要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将致使上次获取的access_token失效。github

公众平台的API调用所需的access_token的使用及生成方式说明:redis

一、建议公众号开发者使用中控服务器统一获取和刷新access_token,其余业务逻辑服务器所使用的access_token均来自于该中控服务器,不该该各自去刷新,不然容易形成冲突,致使access_token覆盖而影响业务;数据库

二、目前access_token的有效期经过返回的expire_in来传达,目前是7200秒以内的值。中控服务器须要根据这个有效时间提早去刷新新access_token。在刷新过程当中,中控服务器可对外继续输出的老access_token,此时公众平台后台会保证在5分钟内,新老access_token均可用,这保证了第三方业务的平滑过渡;小程序

三、access_token的有效时间可能会在将来有调整,因此中控服务器不只须要内部定时主动刷新,还须要提供被动刷新access_token的接口,这样便于业务服务器在API调用获知access_token已超时的状况下,能够触发access_token的刷新流程。api

怎么获取access_token?

公众号和小程序都可以使用AppID和AppSecret调用接口来获取access_token。AppID和AppSecret可在“微信公众平台-开发-基本配置”页中得到(须要已经成为开发者,且账号没有异常状态)。调用接口时,请登陆“微信公众平台-开发-基本配置”提早将服务器IP地址添加到IP白名单中,点击查看设置方法,不然将没法调用成功。小程序无需配置IP白名单。浏览器

这儿须要特别说明的是:在调用全部微信接口时均使用https协议;还有就是若是第三方不使用中控服务器,而是使选择各个业务逻辑点各自去刷新access_taken,那么就有可能会产生冲突,致使服务不稳定。bash

获取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官方网站:www.rdiframework.net/

RDIFramework.NET官方博客:blog.rdiframework.net/

同时须要说明的,之后的全部技术文章以官方网站为准,欢迎你们收藏!

RDIFramework.NET框架由专业团队长期打造、一直在更新、一直在升级,请放心使用!

欢迎关注RDIFramework.net框架官方公众微信(微信号:guosisoft),及时了解最新动态。

扫描二维码当即关注

微信号:guosisoft
相关文章
相关标签/搜索