PHP API如何使用access_token开放接口有效期

在使用PHP访问API时,access_token 通常用于身份验证和授权。access_token 的有效期取决于API提供者的设置,可能从几分钟到几小时不等。一旦 access_token 过期,你需要重新获取一个新的 access_token

以下是一个基本的流程,展示了如何在PHP中使用 access_token 访问API,并处理 access_token 过期的情况:

  1. 获取 access_token
    通常,你需要通过OAuth2.0流程获取 access_token。这通常涉及重定向用户到认证服务器,用户登录并授权后,认证服务器会重定向回你的应用,并附带一个授权码(code)。然后,你可以使用这个授权码去获取 access_token

  2. 存储 access_token 和其过期时间
    获取 access_token 后,你需要存储它及其过期时间(通常是一个时间戳)。

  3. 访问API
    在访问API时,检查 access_token 是否有效。如果无效,则重新获取一个新的 access_token

  4. 处理 access_token 过期
    如果 access_token 过期,捕获异常,并重新获取新的 access_token,然后重试请求。

以下是一个示例代码,展示了上述流程:

<?php  class ApiClient  
{  private $clientId;  private $clientSecret;  private $redirectUri;  private $tokenUrl;  private $apiUrl;  private $accessToken;  private $tokenExpires;  public function __construct($clientId, $clientSecret, $redirectUri, $tokenUrl, $apiUrl)  {  $this->clientId = $clientId;  $this->clientSecret = $clientSecret;  $this->redirectUri = $redirectUri;  $this->tokenUrl = $tokenUrl;  $this->apiUrl = $apiUrl;  }  // 获取新的 access_token  private function getNewAccessToken($code)  {  $url = $this->tokenUrl;  $data = [  'client_id' => $this->clientId,  'client_secret' => $this->clientSecret,  'redirect_uri' => $this->redirectUri,  'code' => $code,  'grant_type' => 'authorization_code'  ];  $options = [  'http' => [  'header'  => "Content-type: application/x-www-form-urlencoded\r\n",  'method'  => 'POST',  'content' => http_build_query($data),  ],  ];  $context  = stream_context_create($options);  $result = file_get_contents($url, false, $context);  if ($result === FALSE) {  throw new Exception("Error occurred during fetching access token.");  }  $response = json_decode($result, true);  if (!isset($response['access_token']) || !isset($response['expires_in'])) {  throw new Exception("Invalid response received.");  }  $this->accessToken = $response['access_token'];  $this->tokenExpires = time() + $response['expires_in'];  }  // 刷新 access_token(如果需要)  private function refreshAccessToken()  {  $url = $this->tokenUrl;  $data = [  'client_id' => $this->clientId,  'client_secret' => $this->clientSecret,  'grant_type' => 'refresh_token',  'refresh_token' => $this->getRefreshToken() // 假设你有一个方法来获取或存储 refresh_token  ];  $options = [  'http' => [  'header'  => "Content-type: application/x-www-form-urlencoded\r\n",  'method'  => 'POST',  'content' => http_build_query($data),  ],  ];  $context  = stream_context_create($options);  $result = file_get_contents($url, false, $context);  if ($result === FALSE) {  throw new Exception("Error occurred during refreshing access token.");  }  $response = json_decode($result, true);  if (!isset($response['access_token']) || !isset($response['expires_in'])) {  throw new Exception("Invalid response received.");  }  $this->accessToken = $response['access_token'];  $this->tokenExpires = time() + $response['expires_in'];  }  // 获取有效的 access_token  private function getValidAccessToken()  {  if (!isset($this->accessToken) || time() > $this->tokenExpires) {  // 在这里,你可能需要处理获取新的授权码或刷新令牌的逻辑  // 假设我们有一个授权码  $code = 'your_authorization_code_here'; // 你需要获取或存储这个值  $this->getNewAccessToken($code);  }  return $this->accessToken;  }  // 调用API  public function callApi($endpoint, $data = [])  {  $url = $this->apiUrl . $endpoint;  $headers = [  'Authorization: Bearer ' . $this->getValidAccessToken(),  'Content-Type: application/json'  ];  $options = [  'http' => [  'header'  => implode("\r\n", $headers),  'method'  => 'POST',  'content' => json_encode($data),  ],  ];  $context  = stream_context_create($options);  $result = file_get_contents($url, false, $context);  if ($result === FALSE) {  // 如果失败,检查是否是 token 过期,并尝试刷新  try {  $this->refreshAccessToken();  $headers[0] = 'Authorization: Bearer ' . $this->accessToken;  $options['http']['header'] = implode("\r\n", $headers);  $context = stream_context_create($options);  $result = file_get_contents($url, false, $context);  } catch (Exception $e) {  throw new Exception("API call failed: " . $e->getMessage());  }  }  return json_decode($result, true);  }  
}  // 使用示例  
$clientId = 'your_client_id';  
$clientSecret = 'your_client_secret';  
$redirectUri = 'your_redirect_uri';  
$tokenUrl = 'https://api.example.com/oauth/token';  
$apiUrl = 'https://api.example.com/v1/';  $apiClient = new ApiClient($clientId, $clientSecret, $redirectUri, $tokenUrl, $apiUrl);  try {  $response = $apiClient->callApi('endpoint', ['param1' => 'value1']);  print_r($response);  
} catch (Exception $e) {  echo "Error: " . $e->getMessage();  
}

注意

  1. 示例代码中的 getNewAccessToken 方法假设你有一个授权码(code)来获取 access_token。在实际应用中,你可能需要处理重定向和获取授权码的逻辑。
  2. refreshAccessToken 方法假设你有一个 refresh_token 来刷新 access_token。这取决于API提供者的实现。
  3. 示例代码中的错误处理是基本的,你可能需要根据实际需求进行扩展。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/470044.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

超子物联网HAL库笔记:定时器[外部模式]篇

超子物联网 HAL库学习 汇总入口&#xff1a; 超子物联网HAL库笔记&#xff1a;[汇总] 写作不易&#xff0c;如果您觉得写的不错&#xff0c;欢迎给博主来一波点赞、收藏~让博主更有动力吧&#xff01; 一、资源介绍&#xff1a;STM32F103C8T6定时器资源介绍 高级定时器&#x…

谷歌浏览器的自动翻译功能如何开启

在当今全球化的网络环境中&#xff0c;能够流畅地浏览不同语言的网页是至关重要的。谷歌浏览器&#xff08;Google Chrome&#xff09;提供了一项强大的自动翻译功能&#xff0c;可以帮助用户轻松跨越语言障碍。本文将详细介绍如何开启和使用谷歌浏览器的自动翻译功能&#xff…

【大数据技术基础 | 实验十】Hive实验:部署Hive

文章目录 一、实验目的二、实验要求三、实验原理四、实验环境五、实验内容和步骤&#xff08;一&#xff09;安装部署&#xff08;二&#xff09;配置HDFS&#xff08;三&#xff09;启动Hive 六、实验结果&#xff08;一&#xff09;启动结果&#xff08;二&#xff09;Hive基…

使用 Vue 配合豆包MarsCode 实现“小恐龙酷跑“小游戏

作者&#xff1a;BLACK595 “小恐龙酷跑”&#xff0c;它是一款有趣的离线游戏&#xff0c;是Google给Chrome浏览器加的一个有趣的彩蛋。当我们浏览器断网时一只像素小恐龙便会出来提示断网。许多人认为这只是一个可爱的小图标&#xff0c; 但当我们按下空格后&#xff0c;小恐…

案例精选 | 河北省某检察院安全运营中异构日志数据融合的实践探索

河北省某检察院是当地重要的法律监督机构&#xff0c;肩负着维护法律尊严和社会公平正义的重要职责。该机构依法独立行使检察权&#xff0c;负责对犯罪行为提起公诉&#xff0c;并监督整个诉讼过程&#xff0c;同时积极参与社会治理&#xff0c;保护公民权益&#xff0c;推动法…

7天用Go从零实现分布式缓存GeeCache(学习)(3)

目录结构 ├── geecache │ ├── byteview.go │ ├── cache.go │ ├── consistenthash │ │ ├── consistenthash.go │ │ └── consistenthash_test.go │ ├── geecache.go │ ├── go.mod │ ├── http.go │ ├── lru │ …

力扣 LeetCode 142. 环形链表II(Day2:链表)

解题思路&#xff1a; 使用set判断是否重复添加&#xff0c;如果set加入不进去证明之前到达过该节点&#xff0c;有环 public class Solution {public ListNode detectCycle(ListNode head) {Set<ListNode> set new HashSet<>();ListNode cur head;while (cur …

CLion配置QT开发环境

一、将qmake工程转为cmake工程&#xff08;方法一&#xff1a;用工具转换并做适当修改&#xff09; 1、工具链接&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1grW2QY3sW8X2JaHWM_ePPw 提取码&#xff1a;7at4 工具源码:https://github.com/milahu/qmake2cmake 2、执行…

《AI 使生活更美好》

《AI 使生活更美好》 当我们步入科技腾飞的时代&#xff0c;人工智能&#xff08;AI&#xff09;如同一颗璀璨的新星&#xff0c;照亮了我们生活的每一个角落。它以惊人的速度改变着我们的世界&#xff0c;从医疗到教育&#xff0c;从交通到娱乐&#xff0c;AI 正以前所未有的力…

项目模块十七:HttpServer模块

一、项目模块设计思路 目的&#xff1a;实现HTTP服务器搭建 思想&#xff1a;设计请求路由表&#xff0c;记录请求方法与对应业务的处理函数映射关系。用户实现请求方法和处理函数添加到路由表&#xff0c;服务器只接受请求并调用用户的处理函数即可。 处理流程&#xff1a; …

ODOO学习笔记(1):ODOO的SWOT分析和技术优势是什么?

ODOO是一款开源的企业管理软件套件&#xff0c;广泛应用于企业管理中。它由比利时的Odoo S.A.公司开发&#xff0c;最初名为OpenERP&#xff0c;现在已经成为全球流行的ERP解决方案之一。ODOO集成了ERP、CRM、电子商务和CMS等多种功能模块&#xff0c;适用于各种规模的企业应用…

出海攻略,如何一键保存Facebook视频素材

提词宝&#xff1a;快速保存Facebook视频教程 目标人群与痛点 目标人群&#xff1a;经常在Facebook上浏览视频但不知道如何保存的用户&#xff0c;包括学生、内容创作者、营销从业者&#xff0c;以及需要保存重要视频素材的人。 痛点与场景&#xff1a; 看到喜欢的视频&…

【Playwright + Python】系列(十)利用 Playwright 完美处理 Dialogs 对话框

哈喽&#xff0c;大家好&#xff0c;我是六哥&#xff01;今天我来给大家分享一下如何使用playwight处理Dialogs对话框&#xff0c;面向对象为功能测试及零基础小白&#xff0c;这里我尽量用大白话的方式举例讲解&#xff0c;力求所有人都能看懂&#xff0c;建议大家先收藏&…

LLM - 使用 LLaMA-Factory 微调大模型 Qwen2-VL SFT(LoRA) 图像数据集 教程 (2)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/143725947 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 LLaMA-…

自动驾驶3D目标检测综述(一)

文章地址&#xff1a;[2206.09474] 3D Object Detection for Autonomous Driving: A Comprehensive Survey (arxiv.org) 这篇综述简单易懂&#xff0c;非常合适对自动驾驶和3D目标检测感兴趣的小白阅读&#xff0c;对相关算法进行初步理解。 目录 一、摘要 &#xff08;一&a…

回归分析学习

学习视频链接&#xff1a; 【回归分析,一套搞定】&#xff01;全网最通俗易懂的回归分析教程&#xff0c;我终于学明白了&#xff01;_哔哩哔哩_bilibili 相关分析&#xff1a;2个或两个以上的变量之间的相关程度及大小的统计方法&#xff1b; 回归分析&#xff1a;存在相关关…

LabVIEW 实现 find_nearest_neighbors 功能(二维平面上的最近邻查找)

1. 背景介绍 在数据分析和图像处理领域&#xff0c;经常需要查找给定点的最近邻居点。在LabVIEW中&#xff0c;计算二维平面上多个点之间的欧氏距离&#xff0c;并返回距离最近的几个点是一种常见操作。find_nearest_neighbors 函数用于实现这个功能。 2. 欧氏距离计算 在二维…

后端:Aop 面向切面编程

文章目录 1. Aop 初步学习面向切面编程&#xff0c;EnableAspectJAutoProxy2. AOP的核心概念3. 前置通知&#xff08;Before&#xff09;4. 后置通知&#xff08;After&#xff09;5. 返回通知&#xff08;AfterReturning&#xff09;6. 异常通知&#xff08;AfterThrowing&…

无插件H5播放器EasyPlayer.js网页web无插件播放器vue和react详细介绍

EasyPlayer.js H5播放器&#xff0c;是一款能够同时支持HTTP、HTTP-FLV、HLS&#xff08;m3u8&#xff09;、WS、WEBRTC、FMP4视频直播与视频点播等多种协议&#xff0c;支持H.264、H.265、AAC、G711A、Mp3等多种音视频编码格式&#xff0c;支持MSE、WASM、WebCodec等多种解码方…

管家婆财贸ERP BB045.销售批量收款

最低适用版本: 财贸系列 22.8 插件简要功能说明: 销售类单据支持批量收款,简化收款做单流程更多细节描述见下方详细文档插件操作视频: 进销存类定制插件--销售批量收款 插件详细功能文档: 1. 应用中心增加菜单【销售批量收款】 a. 参考23.0应用中心-移动管理-物联宝-【…