|
|
@@ -4,21 +4,49 @@ declare(strict_types=1);
|
|
|
namespace SixShop\Wechat\Cron;
|
|
|
|
|
|
use app\api\controller\Wechat;
|
|
|
+use EasyWeChat\Kernel\Contracts\AccessToken as AccessTokenInterface;
|
|
|
use SixShop\Core\Attribute\Cron;
|
|
|
+use SixShop\System\Job\ClosureJob;
|
|
|
use SixShop\Wechat\Service\MiniApp;
|
|
|
+use think\facade\Cache;
|
|
|
use think\facade\Log;
|
|
|
+use function Symfony\Component\String\s;
|
|
|
|
|
|
class AccessTokenCron
|
|
|
{
|
|
|
+ /**
|
|
|
+ * 提前 60 秒执行
|
|
|
+ */
|
|
|
+ private const int LEAD_TIME = 60;
|
|
|
+
|
|
|
+ private AccessTokenInterface $accessToken;
|
|
|
+
|
|
|
+ private string $cacheKey;
|
|
|
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
|
|
|
{
|
|
|
- $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);
|
|
|
}
|
|
|
}
|