首页 > 编程语言 >PHP对接抖音开发平台接口的详细教程

PHP对接抖音开发平台接口的详细教程

时间:2023-02-05 21:12:16浏览次数:41  
标签:教程 接口 refresh token 抖音 param PHP method

目录
  • 一、说明
  • 二、代码
  • 三、代码运行需知
  • 四、功能扩展
  • 五、接口调用需要注意的点
  • 六、接口文档中的 ‘坑'(以订单列表接口为例)
    • 1、请求参数、响应参数 代表的具体值不清晰

 

一、说明

抖音开放平台-开发指南

 

二、代码


<?PHP
namespace app\common\libs;

use app\common\exception\BaseException;


class DouYinapi
{
    private $host; //抖音接口API,API调用指南:https://op.jinritemai.com/docs/guide-docs/148/814
    private $appKey; //appKey
    private $appSecret; //appSecret
    private $accessToken; //访问令牌
    private $refreshToken; //刷新令牌
    private $versionNumber; //API协议版本,当前版本为 2
    private $versionNumberStr; //API协议版本,当前版本为 v2

    public function __construct()
    {
        $this->host = 'Https://openapi-fxg.jinritemai.com'; //接口访问地址
        $this->appKey = '你的抖音后台的appKey';
        $this->appSecret = '你的抖音后台的appSecret';

        $this->versionNumber = '2';
        $this->versionNumberStr = 'v' . $this->versionNumber;

        //获取access_token,refresh_token放到最后,如果其他的如versionNumber在后面设置则报错:"v不可为空",因为handleToken中调用了versionNumber,但versionNumber此时的值为NULL
        $result = self::handleToken(); //创建Token
//        $result = self::handleToken(false); //刷新Token:提示-"缺少code",需要建一张第三方表存抖音该店铺的access_token,refresh_token,expire_time信息
        $this->accessToken = $result['access_token']; //用于出创建token接口之外的其他接口
        $this->refreshToken = $result['refresh_token']; //用于刷新token接口
    }

    
    public function handleToken($createToken = true)
    {
        if ($createToken) { //调用创建token接口
            $param = [
                'code' => '',
                'grant_type' => 'authorization_self',
                'shop_id' => '你抖音店铺的ID', //店铺ID,仅自用型应用有效;若不传,则默认返回最早授权成功店铺对应的token信息
            ];
            $method = 'token.create';

        } else { //调用刷新Token方法
            $param = [
//                'app_id' => '', //应用key ,长度19位字母和数字组合的字符串,可不传
                'refresh_token' => $this->refreshToken, //注意:传真实的refreshToken值,而不是传REFRESH_TOKEN
                'grant_type' => 'refresh_token',
            ];
            $method = 'token.refresh';
        }

        $timestamp = time(); //接口请求前记录开始时间,防止过期时间$expireTime失效
        $result = self::fetch($method, $param);
        if ($result['code'] != 10000) { //请求失败
            throw new BaseException($result['message']);
        } else {
            $data = $result['data'];
            $accessToken = $data['access_token']; //accessToken
            $refreshToken = $data['refresh_token']; //refreshToken
            $expireTime = $timestamp + $data['expires_in']; //Token过期时间 = 当前时间 + 有效时间(秒s)

            return [
                'access_token' => $accessToken,
                'refresh_token' => $refreshToken,
            ];
        }
    }

    
    function fetch($method, $param, $accessToken = false, $paramJSONAddToUrl = true)
    {
        //当前时间戳
        $timestamp = time();

        //php中:如果数组为空转为json之后是[]。但接口可能是强类型语言编写的,需要传{}。所以$param为空时,需要把$paramJson设置为{}
        $paramJson = $param ? self::marshal($param) : '{}';

        //获取签名
        $sign = self::sign($method, $timestamp, $paramJson);

        //调用的方法.替换为/
        $methodPath = str_replace('.', '/', $method);

        //拼接url路径
        $url = $this->host . '/' . $methodPath .
            '?method=' . urlencode($method) .
            '&app_key=' . urlencode($this->appKey);

        if ($accessToken) {
            $url .= '&access_token=' .urlencode($this->accessToken);
        }

        $url .= '&timestamp=' . urlencode(strval($timestamp)) .
            '&v=' . urlencode($this->versionNumber) .
            '&sign=' . $sign;

        if ($paramJsonAddToUrl) {
            $url .= '&param_json=' . $paramJson;
        }

        $url .= '&sign_method=' . urlencode('hMac-sha256'); //官方接口为非必填,但是不加签名会验证失败

        //处理句柄数据
        $opts = array('http' =>
            array(
                'method' => 'POST',
                'header' => "Accept: */*\r\n" .
                    "Content-type: application/json;charset=UTF-8\r\n",
                'content' => $paramJson
            )
        );

        $context = stream_context_create($opts);
        $result = file_get_contents($url, false, $context);

        return json_decode($result,true);
    }

    //计算签名
    function sign($method, $timestamp, $paramJson)
    {
        $paramPattern = 'app_key' . $this->appKey . 'method' . $method . 'param_json' . $paramJson . 'timestamp' . $timestamp . $this->versionNumberStr;
        $signPattern = $this->appSecret . $paramPattern . $this->appSecret;

        return hash_hmac("sha256", $signPattern, $this->appSecret);
    }

    //序列化参数,入参必须为关联数组(键值对数组)
    function marshal(array $param)
    {
        self::rec_ksort($param); // 对关联数组中的kv,执行排序,需要递归
        $s = json_encode($param, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); // 重新序列化,确保所有key按字典序排序
        // 加入flag,确保斜杠不被escape,汉字不被escape
        return $s;
    }

    //关联数组排序,递归
    function rec_ksort(array &$arr)
    {
        $kstring = true;
        foreach ($arr as $k => &$v) {
            if (!is_string($k)) {
                $kstring = false;
            }
            if (is_array($v)) {
                self::rec_ksort($v); //这里的调用方式要和marshal中调用方式一致
            }
        }
        if ($kstring) {
            ksort($arr);
        }
    }
}

 

三、代码运行需知

  • __construct() 方法 $this->appKey 中加上你的真实appKey
  • __construct() 方法 $this->appSecret 中加上你的真实appSecret
  • handleToken() 方法 shop_id 中加上你真实的抖音店铺ID

 

四、功能扩展

  • 加一张数据表 third_shop(第三方店铺表):存放第三方店铺(比如:抖音)的信息,表的字段大致有:id;shop_name:店铺名;third_shop_id:第三方店铺的ID,source:店铺来源(抖音,京东,天猫);app_key,app_secret,access_token,refresh_token,expire_time:过期时间;status:状态(0-关闭;1-启用),create_time,update_time ...
  • 我们要对接抖音前,在third_shop中写好 id;shop_name:店铺名;third_shop_id:第三方店铺的ID,source:店铺来源(抖音,京东,天猫);app_key,app_secret;status:状态(0-关闭;1-启用),create_time,update_time ....
  • __construct()中先查询店铺的信息,如果 access_token为空 或者 expire_time过期时间 小于 当前时间,则需要重新生成 access_token,refresh_token,expire_time:过期时间handleToken() 中加上third_shop 表更新操作;否则取数据表中未过期的 access_token,refresh_token用于接口调用

 

五、接口调用需要注意的点

param为空的问题:param为空,$paramJson字符串的值为 {},而不是 []

rec_ksort递归调用的问题:rec_ksort中调用rec_ksort方式要和marshal中调用rec_ksort方式一致

paramJson何时传的问题:如果接口请求数据太大,GET请求可能会超出最大值,则 fetch()$paramJsonAddToUrl 可试着传 false

 

六、接口文档中的 ‘坑'(以订单列表接口为例)

 

1、请求参数、响应参数 代表的具体值不清晰

订单列表中 请求参数、响应参数main_status,每个数字代表什么意思,没有清楚的给出,如下图:

在这里插入图片描述

给了,在订单详情 接口的 响应参数 中,如下图:

在这里插入图片描述

页码从第0页开始(这个属于需要注意的点)

在这里插入图片描述

金额 是元 还是 分,不清晰

不给的话,那就默认为:

在这里插入图片描述

到此这篇关于PHP对接抖音开发平台接口的详细教程的文章就介绍到这了。

标签:教程,接口,refresh,token,抖音,param,PHP,method
From: https://www.cnblogs.com/dituirenwu/p/17093946.html

相关文章

  • PHP7中对十六进制字符串处理的问题详解
    本篇文章由PHP7教程栏目给大家介绍一下关于php7中"0xFFFFFFFF"和0xFFFFFFFF的问题。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。具体问题:$t1......
  • php生成唯一uid的解决方法详解
    目录一、生成唯一uuid二、生成唯一uid三、生成唯一uid的正确方法补充 一、生成唯一uuid看到某些人会用uuid去代替用户的uid从代码中可以看出,通过unique生成一个......
  • php操作ElasticSearch搜索引擎流程详解
    目录一、安装二、使用三、新建ES数据库四、创建表五、插入数据六、查询所有数据七、查询单条数据八、搜索九、测试代码〝古人学问遗无力,少壮功夫老始成〞......
  • PHP中 empty() 和 isset() 的区别介绍
    目录二者共同点二者区别1、对于未设置的变量的判断2、对于""(空字符串)的判断3、对于0(作为整数的0)的判断4、对于0.0(作为浮点数的0)的判断5、对于"0"......
  • php去掉一维数组的键值的实例方法
    在PHP中,数组的每个元素都是由键值对(key-value)组成,通过元素的键名来访问对应键的值。提示:“索引”和“键名”指的是同一样东西,“索引”多指数组数字形式的下标。有时......
  • php7 安装mysqli实例讲解
    php7怎么安装Mysqli?Centosphp7安装mysqli扩展心得在新配服务器时发现,php无法连接到mysql。通过phpinfo发现。根本没有显示mysqli的相关配置。经过一系列研究。总结了......
  • PHP实现JWT的Token登录认证
    1、Jwt简介JSONWEBToken(缩写JWT),是目前最流行的跨域认证解决方案。session登录认证方案:用户从客户端传递用户名、密码等信息,服务端认证后将信息存储在session中,将sessi......
  • PHP7 preg_replace 出错及解决办法
    问题描述:PHP7废弃了preg_replace?原本是中php5中处理url中后面参数替换清除的,代码如下$url=preg_replace('/([?&])src=[^&]+(&?)/e','"$2"==""?"":"$1"',$url);但......
  • php实现ffmpeg处理视频的实践
    最近有一个项目需要使用FFmpeg处理视频,这里我写了一个demo,方便我们来实现视频操作ffmpeg操作demo<?PHPnamespace common\helpers;use common\models\Config;use ......
  • php中的标量数据类型总结
    php的数据类型可以分为三大类,分别是标量数据类型、复合数据类型和特殊数据类型。其中,标量数据类型是数据结构的最基础单元,只能存储一个数据。在 php 中的标量数据类型分......