当前位置: 首页 > article >正文

thinkphp8.1 调用巨量广告API接口,刷新token

1、在mysql中建立表sys_token;

CREATE TABLE `sys_token` (`id` int UNSIGNED NOT NULL,`access_token` varchar(50) COLLATE utf8mb4_general_ci NOT NULL,`expires_in` datetime NOT NULL,`refresh_token` varchar(50) COLLATE utf8mb4_general_ci NOT NULL,`refresh_token_expires_in` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='API token';

备注:expires_in\refresh_token_expires_in 巨量引擎返回的是纯数字,单位:秒,需要你在tp里转换成年月日时分秒;在数据库里存储时,一定要用datetime类型;否则会很麻烦的;

2、第一次获取令牌时,官方会给你auth_code,你根据你的app_id,secret,auth_code获取令牌,并存入database中;

3、由于令牌的有效期是1天,刷新令牌有效期是30天;令牌过期了需要刷新令牌;

use think\response\Json;
use think\facade\Db;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;
use DateTime;
use DateInterval;class Index
{// 去掉 readonly 修饰符,因为需要在刷新 token 后修改它protected string $accessToken;public function __construct(){$data = Db::name('sys_token')->find(1);$expired_time = $data['expires_in']; // accessToken的过期时间$isExpired = (new DateTime() > new DateTime($expired_time));  // 判断是否过期if ($isExpired) {$this->getRefreshToken($data['refresh_token']); // 过期了刷新令牌} else {$this->accessToken = $data['access_token'];  // 已存在的 accessToken}}public function index(): string{// 在调用任意接口时,需要有访问令牌;return $this->accessToken;}public function getRefreshToken(string $refreshToken): Json{$client = new Client();$headers = ['Content-Type' => 'application/json',];// 请求体数据$body = ['app_id' => '你的app_id','secret' => '您的secret','refresh_token' => $refreshToken,];try {// 异步请求$response = $client->request('POST', 'https://api.oceanengine.com/open_api/oauth2/refresh_token/', ['headers' => $headers,'json' => $body,  // 使用 'json' 自动编码为 JSON]);// 获取响应体并输出$responseBody = $response->getBody()->getContents();$result = json_decode($responseBody, true);$expires_in_seconds = $result['data']['expires_in'];  // expires_in = 86052 秒$refresh_token_expires_in_seconds = $result['data']['refresh_token_expires_in'];  // refresh_token_expires_in = 2591652 秒// 获取当前时间并加上秒数$expires_in_formatted = (new DateTime())->add(new DateInterval("PT{$expires_in_seconds}S"))->format('Y-m-d H:i:s');$refresh_token_expires_in_formatted = (new DateTime())->add(new DateInterval("PT{$refresh_token_expires_in_seconds}S"))->format('Y-m-d H:i:s');$data = ['id'=>1,'access_token' => $result['data']['access_token'],'expires_in' => $expires_in_formatted,'refresh_token' => $result['data']['refresh_token'],'refresh_token_expires_in' => $refresh_token_expires_in_formatted];Db::name('sys_token')->update($data);// 将新获取的 accessToken 更新到实例的属性中$this->accessToken = $result['data']['access_token'];  // 使用新的 accessTokenreturn json(['code' => 0, 'msg' => '刷新token成功']);} catch (RequestException $e) {// 错误处理return json(['code' => 1, 'msg' => $e->getMessage()]);}}
}

测试环境:centOS stream 9、php8.3、thinkphp8.1; 欢迎大家指正........

http://www.lryc.cn/news/2402736.html

相关文章:

  • 物联网数据归档方案选择分析
  • 微服务架构下的服务注册与发现:Eureka 深度解析
  • Qt/C++学习系列之QButtonGroup的简单使用
  • CETOL 6σ v12.1 三维公差分析软件现已可供下载
  • 【JavaEE】Spring Boot项目创建
  • KAG与RAG在医疗人工智能系统中的多维对比分析
  • 车牌识别技术解决方案
  • C/C++ 面试复习笔记(4)
  • Unity 大型手游碰撞性能优化指南
  • Git仓库的创建
  • 从零到一:Maven 快速入门教程
  • DDD架构实战 领域层 事件驱动
  • c# List<string>.Add(s) 报错:UnsupportedOperationException
  • postman基础
  • python训练营day45
  • B+树知识点总结
  • Halcon透视矩阵
  • SpringCloud——OpenFeign
  • 007-nlohmann/json 项目应用-C++开源库108杰
  • 移动端测试岗位高频面试题及解析
  • gvim比较两个文件不同并合并差异
  • App使用webview套壳引入h5(二)—— app内访问h5,顶部被手机顶部菜单遮挡问题,保留顶部安全距离
  • Git GitHub Gitee
  • 《深度体验 Egg.js:打造企业级 Node.js 应用的全景指南》
  • 蓝桥杯2118 排列字母
  • Python应用break初解
  • PLSQLDeveloper配置OracleInstantClient连接Oracle数据库
  • 高股息打底+政策催化增强+永续经营兜底
  • 双电机差速控制的MATLAB Simulink仿真方案,使用PWM和PID调节实现360°转向与速度控制_可复现,有问题请联系博主
  • 【Oracle】触发器