首页 > 编程语言 >微信公众号开发C#系列-4、获取接口调用凭证

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

时间:2023-06-13 16:04:45浏览次数:59  
标签:调用 C# 微信 接口 entity access token


微信公众号开发C#系列-4、获取接口调用凭证_RDIFramework.NET


本文目录

  • 概述
  • 怎么获取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就是我们公众号的掊入信息,如下图所示:

微信公众号开发C#系列-4、获取接口调用凭证_服务器_02


因为得到access_token的接口支持Get请求,因为我们可以直接用浏览器访问这个接口得到access_token看一下效果,如下图所示:

微信公众号开发C#系列-4、获取接口调用凭证_RDIFramework.NET_03


正常情况下,微信会返回下述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、获取接口调用凭证_服务器_04

参考文章

微信公众平台技术文档-官方

Senparc.Weixin SDK + 官网示例源代码

RDIFramework.NET — 基于.NET的快速信息化系统开发框架 — 系列目录

RDIFramework.NET ━ .NET快速信息化系统开发框架 ━ 工作流程组件介绍

RDIFramework.NET框架SOA解决方案(集Windows服务、WinForm形式与IIS形式发布)-分布式应用

RDIFramework.NET代码生成器全新V3.5版本发布-重大升级


一路走来数个年头,感谢RDIFramework.NET框架的支持者与使用者,大家可以通过下面的地址了解详情。

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

同时需要说明的,以后的所有技术文章以官方网站为准,欢迎大家收藏!

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

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

扫描二维码立即关注

微信公众号开发C#系列-4、获取接口调用凭证_服务器_05


标签:调用,C#,微信,接口,entity,access,token
From: https://blog.51cto.com/guosisoft/6470963

相关文章

  • C#如何进行多线程编程
    C#如何进行多线程编程由于多线程编程非常复杂,这个小例子只能算是一个入门线的知识点吧首先建一个应用程序项目,命名为ThreadExample,在窗体上放一个文本框(textBox1) ,一个标签(lblResult),再放两个按钮,分别命名为btnStart、btnStop。窗体代码:namespaceThreadExample{......
  • C++ Builder 初学问与答(二)
     2.文本输入组件11)问:如果要实现文本输入,在C++Builder中应该怎么办? 答:C++Builder常用文本输入组件来实现,常用的文本输入组件有Edit、MaskEdit、Memo和RichEdit。他们的主要不同在于Edit和MaskEdit用于输入单行文本,而Memo和RichEdit可以输入多行文本。此外Label组件也可用来进行......
  • C#连接MySql数据库的方法
     用MySQLDriverCS连接MySQL数据库   先下载和安装MySQLDriverCS,地址:   http://sourceforge.net/projects/mysqldrivercs/   在安装文件夹下面找到MySQLDriver.dll,然后将MySQLDriver.dll添加引用到项目中   注:我下载的是版本是MySQLDriverCS-n-EasyQueryTools-4.0......
  • C++ Builder 初学问与答(一)
    一直以来都想写一点为BCB初学者快速入门的东西,前不久写了几篇《闲谈BCB》想把自己学习BCB中如何来解决难点的方法说给大家,没想到被骂得不成样子。本想不写了,但觉得这些东西留下来能做什么呢?还是用另一种方法来重新演译我的思维吧,最近有些忙,那几篇没有写完的文章,我也会尽快写完的,至......
  • WinForm下DataGridView导出Excel的实现
    WinForm下DataGridView导出Excel的实现 1.说明:导出的效率说不上很高,但至少是可以接收的.参考网上很多高效导出Excel的方法,实现到时能够实现的,导出速度也很快,不过缺陷在与不能很好的进行单元格的格式化,比如上图中的"拼音码"字段中的值"000000000012120",在导出后就显示"1212......
  • 使用C#的WebService实现客户端软件的更新
    由于项目原因,要实施的客户离作者太远,考虑提供软件的在线升级功能.我们如何实现呢!先讲下思路.思路:先实现WEB端的开发,主要考虑使用WEBService技术,提供远程服务的调用函数,返回一个文件的字节内容,然后写一个升级程序客户端,分发给客户使用的机器中,(可以随客户的软件一起安装).......
  • 基于.NET的Web Service技术的分布式异构数据库的集成
    摘要:本文分析了WebService的特点,提出了一种基于Microsoft.NET的WebService技术访问分布异构数据库的体系结构,并采用.NET技术实现了原型系统。在原型系统中,使用WebService将分布于Internet上的不同的数据库系统中的数据集成,向访问数据库的应用程序提供统一的数据操作接口,实现......
  • Apache Http Server 路径穿越漏洞复现(CVE-2021-41773)
    ApacheHttpServer路径穿越漏洞复现ApacheHttpServer路径穿越漏洞概述ApacheHttpServer简介ApacheHTTPServer(简称Apache)是Apache软件基金会的一个开放源码的网页服务器软件,可以在大多数电脑操作系统中运行。由于其跨平台和安全性,被广泛使用,是最流行的Web服务器......
  • 【pyqt】报错TypeError: decorated slot has no signature compatible with RecorderP
    一、场景  运行pyqt报错TypeError:decoratedslothasnosignaturecompatiblewithRecorderPlayerProxy.sig_mode_update[object] 二、代码@Slot(int)defupdate_mode(self,mode):...... 三、解决方法  将int去除即可  参考链接:p......
  • NVIDIA Maxine Video Effects SDK 編程指南 - 实践小记
    NVIDIAMaxineVideoEffectsSDK編程指南 -实践小记本篇博客重点只说VideoEffect的部分,此外还有AudioEffect的部分、还有AR部分,不在本篇范围内。本文由重庆Debug原创NVIDIAMaxineVideoEffects支持基于AI的视觉效果,这些效果可以输入标准网络摄像头画面数据,同时也可以......