Procházet zdrojové kódy

feat(wechat): 优化小程序 AccessToken 刷新机制

- 调整定时任务执行频率为每两小时一次
- 增加 AccessToken 刷新日志记录,包括有效期和更新状态
- 引入提前 60 秒执行的计划任务以确保 Token 有效性
- 使用 ClosureJob 实现延迟刷新功能
- 记录计划执行时间和刷新结果以便调试追踪
runphp před 4 měsíci
rodič
revize
c25b5c7499
1 změnil soubory, kde provedl 32 přidání a 4 odebrání
  1. 32 4
      src/Cron/AccessTokenCron.php

+ 32 - 4
src/Cron/AccessTokenCron.php

@@ -4,21 +4,49 @@ declare(strict_types=1);
 namespace SixShop\Wechat\Cron;
 namespace SixShop\Wechat\Cron;
 
 
 use app\api\controller\Wechat;
 use app\api\controller\Wechat;
+use EasyWeChat\Kernel\Contracts\AccessToken as AccessTokenInterface;
 use SixShop\Core\Attribute\Cron;
 use SixShop\Core\Attribute\Cron;
+use SixShop\System\Job\ClosureJob;
 use SixShop\Wechat\Service\MiniApp;
 use SixShop\Wechat\Service\MiniApp;
+use think\facade\Cache;
 use think\facade\Log;
 use think\facade\Log;
+use function Symfony\Component\String\s;
 
 
 class AccessTokenCron
 class AccessTokenCron
 {
 {
+    /**
+     * 提前 60 秒执行
+     */
+    private const int LEAD_TIME = 60;
+
+    private AccessTokenInterface $accessToken;
+
+    private string $cacheKey;
     public function __construct(private MiniApp $miniApp)
     public function __construct(private MiniApp $miniApp)
     {
     {
+        $this->accessToken = $this->miniApp->getAccessToken();
+        $this->cacheKey = Cache::getCachekey($this->accessToken->getKey());
     }
     }
 
 
-    #[Cron('1 12 * * * *', 'wechat.refreshMiniAppAccessToken')]
+    #[Cron('* * */2 * * *', 'wechat.refreshMiniAppAccessToken')]
     public function refreshMiniAppAccessToken(): void
     public function refreshMiniAppAccessToken(): void
     {
     {
-        $accessToken = $this->miniApp->getAccessToken();
-        $accessToken->refresh();
-        Log::debug('刷新小程序 AccessToken');
+        $oldToken = $this->accessToken->getToken();
+        $newToken = $this->accessToken->refresh();
+        $expireIn = Cache::ttl($this->cacheKey);
+        Log::debug('定时刷新小程序 AccessToken 成功,有效期:{expireIn} 秒, 结果:{result},计划执行时间:{time}', [
+            'expireIn' => $expireIn,
+            'result' => $oldToken === $newToken ? '未更新' : '已更新',
+            'time' => date('Y-m-d H:i:s', time() + $expireIn - self::LEAD_TIME )
+        ]);
+        ClosureJob::dispatch(function ()  {
+            $accessToken = app(MiniApp::class)->getAccessToken();
+            $oldToken = $accessToken->getToken();
+            $newToken = $accessToken->refresh();
+            Log::debug('计划刷新小程序 AccessToken 成功,结果:{result}', [
+                'expireIn' => $expireIn,
+                'result' => $oldToken === $newToken ? '未更新' : '已更新',
+            ]);
+        })->delay($expireIn - self::LEAD_TIME);
     }
     }
 }
 }