首页 > 编程知识 正文

tools论坛邀请码,accesstoken公众号次数

时间:2023-05-03 10:14:47 阅读:142192 作者:3572

《微信公众平台开发:通用接口说明》介绍了获取访问token的方法。

实际开发需要所有高级接口提供AccessToken,因此varaccesstoken=accesstokencontainer.trygetaccesstoken ()

或者,在zydch全局注册appId和appSecret后,varaccesstoken=accesstokencontainer.getaccesstoken (_ appid );

然后,使用此accessToken填充高级接口的方法。 例如,您可以获取菜单,例如varresult=common API.get menu (access token )。

通常,这已经是一个简洁的API调用过程。 但是,我不想就这样停下来,所以我打算把大部分API调用缩短为一行。

在这样做的同时,除了让代码简单外,我还有两个愿望。

允许API自动处理更改的访问令牌(如果多个服务器同时处理同一个微信公众号,例如负载平衡,访问令牌可能会在外部更新,从而禁用本机访问令牌) 然后,最终重新取得正确的API结果并返回。

不更改当前的API调用方法,完全向后兼容。

调用代码

更改后,我们可以直接在这样的行上调用API。 一次只提供一个appid。 varresult=common API.get menu (appid );

在当前运行之前,必须像以前一样全局注册appId和app secret:accesstokencontainer.register (_ appid,_appSecret )。 //全局只要注册一次即可,例如可以加入到Global的Application_Start )方法中。

您将看到原始的accessToken更改为appId,并且新版本支持输入accessToken。 这样可以省去获取访问token的过程。 具体过程说明如下。

SDK源代码实现流程

以前,SDK提供了sen parc.weixin.MP/accesstokenhandlerwapper.do ()方法来自动处理“意外”过期的AccessToken。 在此次升级中,将AccessTokenHandlerWapper.cs重命名为ApiHandlerWapper.cs,放弃该方法,并添加TryCommonApi )方法,如下所示namespacesenparc.weixin.monapi ) )。

{

///

AccessToken无效或过期的自动处理类

///

publicstaticclassapihandlerwapper

{

///

如果在使用//AccessToken时遇到AccessToken错误,请重新获取AccessToken,然后重试。

//使用此方法前请先访问accesstokencontainer.register (_ appid,_appSecret ); 或jsapiticketcontainer.register (appid,_appSecret ); 方法注册过账户信息。 不注册的话会出错。

///

///

///

///访问令牌或AppId。 如果为null,则自动获取第一个已注册的appId/appSecret以获取访问令牌。

//保留默认true,不要输入。

///

publicstaticttrycommonapi (func fun,string accessTokenOrAppId=null,bool retryIfFaild=true ) where T : WxJsonResult

{

string appid=空;

string accessToken=null;

accesstokenorappid (if )=null

{

appid=accesstokencontainer.getfirstordefaultappid (;

if(appid==null ) )。

{

throw new WeixinException ('还没有注册的AppId。 请先使用AccessTokenContainer.Register完成注册((全局执行一次即可) )。 );

}

}

else if (API utility.is appid (accesstokenorappid ) )

{

if (! AccessTokenContainer.C

heckRegistered(accessTokenOrAppId))

{

throw new WeixinException("此appId尚未注册,请先使用AccessTokenContainer.Register完成注册(全局执行一次即可)!");

}

appId = accessTokenOrAppId;

}

else

{

//accessToken

accessToken = accessTokenOrAppId;

}

T result = null;

try

{

if (accessToken == null)

{

var accessTokenResult = AccessTokenContainer.GetAccessTokenResult(appId, false);

accessToken = accessTokenResult.access_token;

}

result = fun(accessToken);

}

catch (ErrorJsonResultException ex)

{

if (!retryIfFaild

&& appId != null

&& ex.JsonResult.errcode == ReturnCode.获取access_token时AppSecret错误或者access_token无效)

{

//尝试重新验证

var accessTokenResult = AccessTokenContainer.GetAccessTokenResult(appId, true);

accessToken = accessTokenResult.access_token;

result = TryCommonApi(fun, appId, false);

}

}

return result;

}

}

}

对应API的源代码原来是这样的:///

/// 获取当前菜单,如果菜单不存在,将返回null

///

///

///

public static GetMenuResult GetMenu(string accessToken)

{

var url = string.Format("https://api.weixin.qq.com/cgi-bin/menu/get?access_token={0}", accessToken);

var jsonString = HttpUtility.RequestUtility.HttpGet(url, Encoding.UTF8);

//var finalResult = GetMenuFromJson(jsonString);

GetMenuResult finalResult;

JavaScriptSerializer js = new JavaScriptSerializer();

try

{

var jsonResult = js.Deserialize(jsonString);

if (jsonResult.menu == null || jsonResult.menu.button.Count == 0)

{

throw new WeixinException(jsonResult.errmsg);

}

finalResult = GetMenuFromJsonResult(jsonResult);

}

catch (WeixinException ex)

{

finalResult = null;

}

return finalResult;

}

现在使用TryCommonApi()方法之后:///

/// 获取当前菜单,如果菜单不存在,将返回null

///

/// AccessToken或AppId。当为AppId时,如果AccessToken错误将自动获取一次。当为null时,获取当前注册的第一个AppId。

///

public static GetMenuResult GetMenu(string accessTokenOrAppId)

{

return ApiHandlerWapper.TryCommonApi(accessToken =>

{

var url = string.Format("https://api.weixin.qq.com/cgi-bin/menu/get?access_token={0}", accessToken);

var jsonString = HttpUtility.RequestUtility.HttpGet(url, Encoding.UTF8);

//var finalResult = GetMenuFromJson(jsonString);

GetMenuResult finalResult;

JavaScriptSerializer js = new JavaScriptSerializer();

try

{

var jsonResult = js.Deserialize(jsonString);

if (jsonResult.menu == null || jsonResult.menu.button.Count == 0)

{

throw new WeixinException(jsonResult.errmsg);

}

finalResult = GetMenuFromJsonResult(jsonResult);

}

catch (WeixinException ex)

{

finalResult = null;

}

return finalResult;

}, accessTokenOrAppId);

}

我们可以观察到有这样几处变化:

1. 原先的accessToken变量名称改为了accessTokenOrAppId(新版本中所有相关接口都将如此变化)。

修改之后,这个参数可以输入accessToken(向下兼容),也可以输入appId(无需再获取accessToken),SDK会根据字符串长度自动判断属于哪种类型的参数。提供的参数有3种可能:

a) appId。使用appId需要事先对appId和appSecret进行全局注册(上文已说过),当调用API的过程中发现缓存的AccessToken过期时,SDK会自动刷新AccessToken,并重新尝试一次API请求,确保返回正确的结果。如果appId没有被注册过,会抛出异常。

b) accessToken。这种情况下将使用原始的请求方式,如果accessToken无效,将直接抛出异常,不会重试。

c) null。当accessTokenOrAppId参数为null时,SDK会自动获取全局注册的第一个appId。如果某个应用只针对一个确定的微信号开发,可以使用这种方法。当全局没有注册任何appId时,将抛出异常。

2. 原方法内的访问API的代码没有做任何修改,只是被嵌套到了return ApiHandlerWapper.TryCommonApi(accessToken =>{...},accessTokenOrAppId)的方法中,以委托的形式出现,目的是为了在第一次可能的请求失败之后,SDK可以自动执行一次一模一样的代码。

此功能已经在Senparc.Weixin.MP v12.1中发布。

更多微信公众平台开发:AccessToken自动管理机制相关文章请关注PHP中文网!

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。