您现在的位置是:首页 >其他 >php 接入扣子(coze)获取 Oauth Access Token 网站首页其他

php 接入扣子(coze)获取 Oauth Access Token

小虎哥-技术博客 2026-04-21 00:01:05
简介php 接入扣子(coze)获取 Oauth Access Token

在扣子官网文档里没有提供php版sdk,以下代码实现获取Oauth Access Token。

<?php

class CozeLogic
{
    public function get_access_token()
    {
        $apiUrl = "https://api.coze.cn/api/permission/oauth2/token";
        $postData = [
            'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // 固定值
            'duration_seconds' => 86399, // 申请的 AccessToken 有效期,单位为秒,默认 900 秒,即 15 分钟。最大可设置为 86399 秒,即 24 小时。
        ];
        $headers = [
            'Content-Type: application/json',
            'Authorization: Bearer ' . $this->get_jwt()
        ];
        $response = $this->httpRequest($apiUrl, 'POST', json_encode($postData, JSON_UNESCAPED_UNICODE), $headers, 300);
        $result = json_decode($response, true);
        if (!empty($result['access_token'])) {
            return [
                'code' => 1, 
                'access_token' => $result['access_token'],
            ];
        }

        return [
            'code' => 0, 
            'msg' => empty($result['error_message']) ? "获取访问令牌失败" : "获取访问令牌失败,错误码: {$result['error_code']},错误信息: {$result['error_message']}",
        ];
    }

    public function get_jwt()
    {
        // OAuth 应用的公钥指纹
        $public_key_id = 'OAuth 应用的公钥指纹';
        // OAuth 应用的 ID,必须是字符串类型
        $app_id = '应用的ID';
        // Header 参数
        $header = [
            'alg' => 'RS256', // 固定为RS256
            'typ' => 'JWT', // 固定为 JWT
            'kid' => strval($public_key_id) // OAuth 应用的公钥指纹
        ];
        /**
         * 访问令牌的会话标识。目前仅限在会话隔离场景下使用,即将 session_name 指定为用户在业务侧的 UID,以此区分不同业务侧用户的对话历史。
         * 若未指定 session_name,不同用户的对话历史可能会掺杂在一起。
         */
        $session_name = empty($_COOKIE['coze_session_name']) ? '' : $_COOKIE['coze_session_name'];
        if (empty($session_name)) {
            $session_name = (int) session('users_id'); // 根据业务改成等于用户的uid
        }
        if (empty($session_name)) {
            $session_name = session_id();
        }
        setcookie('coze_session_name', $session_name);
        // Payload 参数
        $payload = [
            'iss' => strval($app_id), // OAuth 应用的 ID
            'aud' => 'api.coze.cn', //扣子 API 的Endpoint
            'iat' => time(), // JWT开始生效的时间,秒级时间戳
            'exp' => time() + 86400, // JWT过期时间,秒级时间戳
            'jti' => (string) $this->get_rand_str(48, 0, 0), // 随机字符串,防止重放攻击
            'session_name' => strval($session_name),  // 必须是字符串类型
        ];
        $e
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。