0

微信第三方平台调用OAuthApi.GetAccessToken方法报40001错误

微信开发 · lqas · 查看 493 次 · 于 115天前

redis第三方平台

我通过第三方平台获取微信用户信息时报错。
-----------------------------------------------------------------------------------------
错误信息: 信 POST 请求发生错误!错误代码:40001,说明:invalid credential, access_token is invalid or not latest hint: [LGBdtinre-R5ypRa]
-----------------------------------------------------------------------------------------
调用代码
componentAccessToken = ComponentContainer.TryGetComponentAccessToken(component_AppId, component_Secret);
result = OAuthApi.GetAccessToken(weixinAppid, component_AppId, componentAccessToken, code);
-----------------------------------------------------------------------------------------
通过重新获取componentAccessToken或这清空盛派缓存 可以恢复正常
componentAccessToken = ComponentContainer.TryGetComponentAccessToken(component_AppId, component_Secret,null,true);
-------------------------------------------------------------------------------------------
库版本:
<package id="Senparc.CO2NET" version="1.3.110" targetFramework="net452" />
 <package id="Senparc.CO2NET.APM" version="0.9.110" targetFramework="net452" />
 <package id="Senparc.CO2NET.AspNet" version="0.3.110" targetFramework="net452" />
 <package id="Senparc.CO2NET.Cache.CsRedis" version="0.3.110" targetFramework="net452" />
 <package id="Senparc.CO2NET.Cache.CsRedis.RedLock" version="0.3.110" targetFramework="net452" />
 <package id="Senparc.CO2NET.Cache.Redis" version="3.9.110" targetFramework="net452" />
 <package id="Senparc.CO2NET.Cache.Redis.RedLock" version="2.5.110" targetFramework="net452" />
 <package id="Senparc.NeuChar" version="1.2.108" targetFramework="net452" />
 <package id="Senparc.NeuChar.App" version="0.8.108" targetFramework="net452" />
 <package id="Senparc.NeuChar.AspNet" version="0.2.108" targetFramework="net452" />
 <package id="Senparc.Weixin" version="6.7.502" targetFramework="net452" />
 <package id="Senparc.Weixin.AspNet" version="0.1.502" targetFramework="net452" />
 <package id="Senparc.Weixin.Cache.CsRedis" version="0.1.502" targetFramework="net452" />
 <package id="Senparc.Weixin.Cache.Redis" version="2.8.502" targetFramework="net452" />
 <package id="Senparc.Weixin.MP" version="16.10.502.1" targetFramework="net452" />
 <package id="Senparc.Weixin.MP.MVC" version="7.5.502" targetFramework="net452" />
 <package id="Senparc.Weixin.Open" version="4.7.502.2" targetFramework="net452" />
-----------------------------------------------------------------------------------------------------------------
注册盛派语句:
//盛派微信组件注册
           //设置全局 Debug 状态
           var isGLobalDebug = IsTestEnv;
           //全局设置参数,将被储存到 Senparc.CO2NET.Config.SenparcSetting
           var senparcSetting = SenparcSetting.BuildFromWebConfig(isGLobalDebug);
           senparcSetting.Cache_Redis_Configuration = redisConnectionString;
           //CO2NET 全局注册,必须!!
          IRegisterService register = RegisterService.Start(senparcSetting).UseSenparcGlobal();
           #region 配置和使用 Redis          -- DPBMARK Redis
           //配置全局使用Redis缓存(按需,独立)
           var redisConfigurationStr = senparcSetting.Cache_Redis_Configuration;
           var useRedis = !string.IsNullOrEmpty(redisConfigurationStr) && redisConfigurationStr != "Redis配置";
           if (useRedis)//这里为了方便不同环境的开发者进行配置,做成了判断的方式,实际开发环境一般是确定的,这里的if条件可以忽略
           {
               /* 说明:
                * 1、Redis 的连接字符串信息会从 Config.SenparcSetting.Cache_Redis_Configuration 自动获取并注册,如不需要修改,下方方法可以忽略
               /* 2、如需手动修改,可以通过下方 SetConfigurationOption 方法手动设置 Redis 链接信息(仅修改配置,不立即启用)
                */
               //csredis
               Senparc.CO2NET.Cache.CsRedis.Register.SetConfigurationOption(redisConfigurationStr);
               Senparc.Weixin.Cache.CsRedis.Register.UseSenparcWeixinCacheCsRedis(register);
               //以下会立即将全局缓存设置为 Redis
               Senparc.CO2NET.Cache.CsRedis.Register.UseKeyValueRedisNow();//键值对缓存策略(推荐)
           }
           //如果这里不进行Redis缓存启用,则目前还是默认使用内存缓存
           #endregion                        // DPBMARK_END
           /* 微信配置开始
           * 建议按照以下顺序进行注册
           */
           //设置微信 Debug 状态
           var isWeixinDebug = IsTestEnv;
           //全局设置参数,将被储存到 Senparc.Weixin.Config.SenparcWeixinSetting
           var senparcWeixinSetting = SenparcWeixinSetting.BuildFromWebConfig(isWeixinDebug);
           //也可以通过这种方法在程序任意位置设置微信的 Debug 状态:
           //Senparc.Weixin.Config.IsDebug = isWeixinDebug;
           //微信全局注册,必须!!          
           register.UseSenparcWeixin(senparcWeixinSetting, senparcSetting);
           register.RegisterThreads();
           register.ChangeDefaultCacheNamespace("ISPA_Senparc");
           #region 注册日志(按需,建议)
           register.RegisterTraceLog(ConfigWeixinTraceLog);//配置TraceLog
           #endregion
           //注册第三方平台
           senparcWeixinSetting = GetComponentAppidAndSecret(senparcWeixinSetting);
           RegisterWeixinThirdParty(register, senparcWeixinSetting);

-----------------------------------------------------------------------
注册第三方平台方法
/// <summary>
       /// 注册微信第三方平台
       /// </summary>
       private static void RegisterWeixinThirdParty(IRegisterService register, SenparcWeixinSetting senparcWeixinSetting)
       {
           #region 注册微信第三方平台(按需)  -- DPBMARK Open
           //注册第三方平台(可注册多个)
           register.RegisterOpenComponent(senparcWeixinSetting,
                //getComponentVerifyTicketFunc
                async componentAppId =>
                {
                    //获取ticket
                    return RedisCache.GetVerifyTicketByRedis(componentAppId);
                },
                //getAuthorizerRefreshTokenFunc
                async (componentAppId, auhtorizerId) =>
                {
                    //获取客户公众号的刷新token
                    var service = new WxOpenAuthorizationService(new DbCommonContext(MvcApplication.GetCenterDBConnStr()));
                    var _model = service.FirstOrDefault(u=>u.ComponentAppid == componentAppId && u.AuthorizerAppId == auhtorizerId);
                    if (_model != null)
                    {
                        return _model.AuthorizerRefreshToken ?? "";
                    }
                    else {
                        return "";
                    }
                },
               //authorizerTokenRefreshedFunc
               async (componentAppId, auhtorizerId, refreshResult) =>
               {
                   //保存客户公众号刷新token
                   var service = new WxOpenAuthorizationService(new DbCommonContext(MvcApplication.GetCenterDBConnStr()));
                   var _model = service.FirstOrDefault(u => u.ComponentAppid == componentAppId && u.AuthorizerAppId == auhtorizerId);
                   if (_model != null)
                   {
                       _model.AuthorizerRefreshToken = refreshResult.authorizer_refresh_token;
                       service.Update(_model,null);
                       service.Commit();
                   }                  
               }, "iSPA第三方平台");
           #endregion                          
       }
---------------------------------------------------------------------------------------------------------------------------------
您尚未登录,请:网站登录 or 微信登录
共收到 7 条回复
0

Senparc 115天前

那要看你的Redis的Cache的命名空间(我们缓存库可以设置),是否相同,如果不同的话,相当于在多个电脑独立执行。

0

lqas 115天前

是否是我注册redis缓存的地方有问题呢

0

lqas 115天前

我是用redis作为缓存,且redis服务都用同一个,正常是不存在缓存不一致的问题, 我调用的方法里面看着也没有一直刷新AccessToken的方法。

0

Senparc 115天前

比如多个地方部署了,或者你自己程序里面一直在刷新。

0

lqas 115天前

调用什么方法会产生重复刷新呢?
------------------------------------
获取公众号jsapi_ticket
Senparc.Weixin.Open.Containers.AuthorizerContainer.TryGetJsApiTicketAsync(component_AppId, appid);
-----------------------
生成微信二维码
var acctoken = Senparc.Weixin.Open.Containers.AuthorizerContainer.TryGetAuthorizerAccessToken(component_AppId, appid);
var qr = Senparc.Weixin.MP.AdvancedAPIs.QrCodeApi.Create(acctoken, expireSeconds, expireSeconds, qrtype, qrinfo.SceneStr);
var qrurl = Senparc.Weixin.MP.AdvancedAPIs.QrCodeApi.GetShowQrCodeUrl(qr.ticket);
------------------------------
公众号授权回调:
queryAuthResult = await ComponentContainer.GetQueryAuthResultAsync(component_AppId, auth_code);
var authorizerInfoResult = AuthorizerContainer.GetAuthorizerInfoResult(component_AppId,
               queryAuthResult.authorization_info.authorizer_appid);
------------------------------
网页授权回调
private OAuthAccessTokenResult GetWxUserInfo(ICurrentInfo currentInfo, string code,StringBuilder sb,bool isGetNewToken=false)
       {
           OAuthAccessTokenResult result;
           string componentAccessToken = "";
           if(isGetNewToken)
              componentAccessToken = ComponentContainer.TryGetComponentAccessToken(component_AppId, component_Secret,null,true);
           else
              componentAccessToken = ComponentContainer.TryGetComponentAccessToken(component_AppId, component_Secret);
           if (currentInfo.Source == "")
           {
               var weixinAppid = GetHotelWeiXinAppid(currentInfo.HotelId);
               result = OAuthApi.GetAccessToken(weixinAppid, component_AppId, componentAccessToken, code);
           }
           else
           {
               result = OAuthApi.GetAccessToken(jydrhAppid, component_AppId, componentAccessToken, code);
           }
           return result;
       }
-----------------------------------
第三方平台verify_ticket接收
/// <summary>
       /// verify_ticket接收
       /// </summary>
       /// <param name="postModel"></param>
       /// <returns></returns>
       public ActionResult ComTicket(Senparc.Weixin.Open.Entities.Request.PostModel postModel)
       {
           try
           {
               postModel.Token = component_Token;
               postModel.EncodingAESKey = component_EncodingAESKey;//根据自己后台的设置保持一致
               postModel.AppId = component_AppId;//根据自己后台的设置保持一致
               var messageHandler = new CustomThirdPartyMessageHandler(Request.InputStream, postModel);//初始化
               messageHandler.Execute();//执行
               return Content(messageHandler.ResponseMessageText);
           }
           catch (Exception ex)
           {
               return Content("error:" + ex.Message);
           }
       }

public override string OnComponentVerifyTicketRequest(RequestMessageComponentVerifyTicket requestMessage)
       {
           //记录ComponentVerifyTicket(也可以存入数据库或其他可以持久化的地方)
           if (!RedisCache.SetVerifyTicketByRedis(requestMessage.AppId, requestMessage.ComponentVerifyTicket))
           {
               //再试一次
               RedisCache.SetVerifyTicketByRedis(requestMessage.AppId, requestMessage.ComponentVerifyTicket);
           }
           return base.OnComponentVerifyTicketRequest(requestMessage);
       }
--------------------------------------
事件接收
public async Task<ActionResult> WxCallback(Senparc.Weixin.MP.Entities.Request.PostModel postModel)
       {
           //此处的URL格式类型为:https://sdk.weixin.senparc.com/Open/Callback/$APPID$, 在RouteConfig中进行了配置,你也可以用自己的格式,只要和开放平台设置的一致。
           //处理微信普通消息,可以直接使用公众号的MessageHandler。此处的URL也可以直接填写公众号普通的URL,如本Demo中的/Weixin访问地址。
           postModel.Token = component_Token;
           postModel.EncodingAESKey = component_EncodingAESKey; //根据自己后台的设置保持一致
           postModel.AppId = component_AppId; //根据自己后台的设置保持一致
           var maxRecordCount = 2;
           MessageHandler<CustomMessageContext> messageHandler = null;
           try
           {
               messageHandler = new CustomMessageHandler(Request.InputStream, postModel, maxRecordCount);
               CancellationToken tokenSource = new CancellationToken();
               await messageHandler.ExecuteAsync(tokenSource); //执行
               return new FixWeixinBugWeixinResult(messageHandler);
           }
           catch (Exception ex)
           {
               return Content(ex.Message);
           }
       }
---------------------------------------------------------
以上是我用到了盛派sdk的地方,也没有自己封装微信接口去调用,不知是我代码哪里有问题。


0

Senparc 115天前

不是SDK的问题,一般是有其他地方在重复刷新accesstoken

0

lqas 115天前

问题持续了几个月,期间多次升级最新库也无法解决


热门话题 更多 >>

微信 sample 生成器 点 运行 报错

wazalf67 12 个回复 • 查看 813 次 • 172天前

Senparc.CO2NET.Cache.CsRedis使用问题

DOUDING 10 个回复 • 查看 285 次 • 55天前

net core更新了过后就无法使用了

cqzxc 8 个回复 • 查看 310 次 • 88天前

WeiXinMPSDK-master 编译报错

jezta 7 个回复 • 查看 221 次 • 63天前

Value cannot be null. Parameter name: services

abcd631664138 7 个回复 • 查看 5060 次 • 47天前

返回81001

一级杠精 7 个回复 • 查看 351 次 • 143天前

第三方平台管理订阅消息模板

mojinxun 6 个回复 • 查看 280 次 • 90天前

AccessTokenContainer.Register()方法总是等10秒。

qq362220083 5 个回复 • 查看 285 次 • 104天前

WeChatSampleBuilder.exe win10下无法打开

yangabc12 5 个回复 • 查看 111 次 • 41天前

“UseSenparcGlobal”方法没有采用 3 个参数的重载

Neil 5 个回复 • 查看 402 次 • 131天前

消息链接如何 发个特定用户预览?

yangyuxuan 5 个回复 • 查看 406 次 • 162天前

TenPayV3InfoCollection尚未注册Mch

nishizx 5 个回复 • 查看 1530 次 • 170天前

QQ群
  • 1群:300313885 (2000人群 已满)
  • 2群:293958349 (1000人群 已满)
  • 3群:342319110 (2000人群 已满)
  • 4群:372212092 (500人群 已满)
  • 5群:377815480 (1000人群 已满)
  • 6群:425898825 (1000人群 已满)
  • 7群:482942254 (500人群 已满)
  • 8群:106230270 (500人群 已满)
  • 9群:539061281 (500人群 已满)
  • 10群(分布式缓存):246860933 Senparc.Weixin.Cache SDK 10群
  • 11群:553198593 (500人群 已满)
  • 12群(微信小程序):108830388 Senparc微信小程序 12群
  • 13群(开放平台):183424136 (500人群 已满)
  • 14群(视频学员):588231256 Senparc.Weixin SDK 14群
  • 15群(公众号/综合):289181996 Senparc.Weixin SDK 15群
  • 16群(开放平台):860626938 (500人群 已满)
  • 17群(开放平台):770615466 [17群 开放平台]SenparcSDK
  • NCF 技术交流群:147054579 SCF 开发交流群
微信开发宝典:《微信开发深度解析》

由 Senparc.Weixin SDK 作者耗时两年完成的微信开发图书《微信开发深度解析:公众号、小程序高效开发秘籍》已经出版!

历经2年精心雕琢,难得的“理论 + 实战案例 + 趟坑经验”总结,
从需求分析、策划,到账号申请、验证,再到全面的 API 及开发工具,
覆盖所有开发微信公众号(含订阅号、服务号和小程序)所需关键技能!

视频教程:《微信公众号+小程序快速开发》

由盛派课堂(盛派旗下独立教育品牌)制作,《微信开发深度解析》作者苏震巍先生主讲的《微信公众号+小程序快速开发》视频课程开课啦!

课程采用“理论+实战”的教学形式,结合部分《微信开发深度解析》内容,独立于书本,包含了更多的操作演示和案例展示,帮助大家从多个维度学习微信开发以及.NET开发过程中的诸多技巧。
课程包含两大部分:
1. 微信开发基础技能
2. 公众号及小程序案例实战
共计60课时,配有番外篇,目前视频已在网易云课堂上线。