You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过微博API获取Refresh Token实现令牌自动刷新?

微博OAuth无Refresh Token问题的解决方案

我之前对接微博OAuth时也踩过这个坑,刚好能给你理清楚原因和解决办法:

核心原因:微博OAuth的两种授权有效期模式

微博的OAuth 2.0实现和标准流程有点不一样,它分两种授权令牌:

  • 短期授权令牌:有效期只有2小时,这种会返回refresh_token,方便你后续刷新获取新的access_token
  • 长期授权令牌:有效期长达5年(你返回里的expires_in=157679999秒,算下来刚好差不多5年),这种令牌本身有效期足够长,所以API不会返回refresh_token

你现在拿到的就是长期授权令牌,所以自然看不到refresh_token字段啦。

如何获取带Refresh Token的短期令牌?

如果你的业务场景确实需要频繁刷新令牌(比如不想用5年有效期的令牌),可以这么调整:

  1. 修改授权请求的参数
    在调用getAuthorizeURL的时候,追加duration=short参数,明确请求短期授权:

    $code_url = $o->getAuthorizeURL(WEIBO_APP_CALLBACK_URL) . '&duration=short';
    

    这样用户授权后,你拿到的就是有效期2小时的令牌,同时会返回refresh_token。

  2. 检查应用后台设置
    登录微博开放平台,进到你的应用详情页,找“高级信息”里的“OAuth2.0授权设置”,确认“授权有效期”是不是设成了“短期授权(默认2小时)”。如果后台设的是长期授权,就算你加了参数可能还是会返回长期令牌。

针对你的CRON任务的更优方案

其实看你的需求——CRON任务定期获取用户动态存数据库,长期授权令牌反而更适合你啊!5年有效期足够用很久了,你完全可以把这个令牌存到数据库里,定期计算过期时间(用strtotime('now') + $token['expires_in']就行),等快过期的时候再引导用户重新授权一次就好,根本不用折腾刷新令牌的事儿。

关于你用的libweibo SDK

这个SDK的getAccessToken方法是符合微博API规范的,拿到长期令牌时确实不会返回refresh_token,你不用改SDK代码,选对授权模式就行。

小验证:你可以算一下157679999秒是多久——除以3600是约43800小时,再除以24是约1825天,刚好差不多5年,这就实锤是长期令牌了。

内容的提问来源于stack exchange,提问作者Paul Bonneau

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:54:55