设为首页收藏本站

安徽论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 9633|回复: 0

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

[复制链接]

63

主题

509

回帖

962

积分

高级会员

Rank: 4

积分
962
发表于 2022-3-26 10:56:13 | 显示全部楼层 |阅读模式
网站内容均来自网络,本站只提供信息平台,如有侵权请联系删除,谢谢!
目录


一、说明

抖音开放平台-开发指南

二、代码
  1. <?php
  2. namespace app\common\libs;

  3. use app\common\exception\BaseException;

  4. /**
  5. * Class DouYinApi
  6. * @package app\common\libs
  7. */
  8. class DouYinApi
  9. {
  10.     private $host; //抖音接口API,API调用指南:https://op.jinritemai.com/docs/guide-docs/148/814
  11.     private $appKey; //appKey
  12.     private $appSecret; //appSecret
  13.     private $accessToken; //访问令牌
  14.     private $refreshToken; //刷新令牌
  15.     private $versionNumber; //API协议版本,当前版本为 2
  16.     private $versionNumberStr; //API协议版本,当前版本为 v2

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

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

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

  30.     /**
  31.      * 处理(创建/刷新)Token的方法
  32.      * 开发指南 > 产品功能 > 授权介绍 -> 自用型应用店铺授权流程:https://op.jinritemai.com/docs/guide-docs/9/21
  33.      * @param bool $createToken 是否调用创建Token的方法
  34.      * @return array
  35.      * @throws BaseException
  36.      */
  37.     public function handleToken($createToken = true)
  38.     {
  39.         if ($createToken) { //调用创建token接口
  40.             $param = [
  41.                 'code' => '',
  42.                 'grant_type' => 'authorization_self',
  43.                 'shop_id' => '你抖音店铺的ID', //店铺ID,仅自用型应用有效;若不传,则默认返回最早授权成功店铺对应的token信息
  44.             ];
  45.             $method = 'token.create';

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

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

  63.             return [
  64.                 'access_token' => $accessToken,
  65.                 'refresh_token' => $refreshToken,
  66.             ];
  67.         }
  68.     }

  69.     /**
  70.      * 封装抖音接口公共方法
  71.      * PHP调用说明:https://op.jinritemai.com/docs/guide-docs/151/811
  72.      * @param $method 方法名:格式 token.create 方法中转为 token/create
  73.      * @param $param 请求接口需要的参数名
  74.      * @param bool $accessToken url中是否要加上access_token,默认否。
  75.      *              为什么不直接传accessToken的值:在本类中,可以获取到accessToken的值,直接传,但是如果在其他的地方调用就获取不到access_token的值,需要传true/false标识在本类中获取。
  76.      * @param bool $paramJsonAddToUrl 是否把paramJson放到 url 中,根据实际情况
  77.      *          例:实际过程中【订单批量解密接口】不需要放到url中(猜测是这个接口paramJson内容太多,会超出GET的最大内容)
  78.      *              订单批量解密接口:https://op.jinritemai.com/docs/api-docs/15/982
  79.      * @return false|mixed|string
  80.      */
  81.     function fetch($method, $param, $accessToken = false, $paramJsonAddToUrl = true)
  82.     {
  83.         //当前时间戳
  84.         $timestamp = time();

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

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

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

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

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

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

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

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

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

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

  116.         return json_decode($result,true);
  117.     }

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

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

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

  133.     //关联数组排序,递归
  134.     function rec_ksort(array &$arr)
  135.     {
  136.         $kstring = true;
  137.         foreach ($arr as $k => &$v) {
  138.             if (!is_string($k)) {
  139.                 $kstring = false;
  140.             }
  141.             if (is_array($v)) {
  142.                 self::rec_ksort($v); //这里的调用方式要和marshal中调用方式一致
  143.             }
  144.         }
  145.         if ($kstring) {
  146.             ksort($arr);
  147.         }
  148.     }
  149. }
复制代码
三、代码运行需知

       
    1. __construct()
    复制代码
    方法
    1. $this->appKey
    复制代码
    中加上你的真实appKey   
    1. __construct()
    复制代码
    方法
    1. $this->appSecret
    复制代码
    中加上你的真实appSecret   
    1. handleToken()
    复制代码
    方法
    1. shop_id
    复制代码
    中加上你真实的抖音店铺ID

四、功能扩展

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

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

1、param为空的问题:param为空,$paramJson字符串的值为
  1. {}
复制代码
,而不是
  1. []
复制代码
2、rec_ksort递归调用的问题:
  1. rec_ksort中调用rec_ksort方式要和marshal中调用rec_ksort方式一致
复制代码
3、paramJson何时传的问题:如果接口请求数据太大,GET请求可能会超出最大值,则
  1. fetch()
复制代码
  1. $paramJsonAddToUrl
复制代码
可试着传
  1. false
复制代码

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


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

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

给了,在订单详情接口的
  1. 响应参数
复制代码
中,如下图:

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

3、金额 是元 还是 分,不清晰
不给的话,那就默认为:
复制代码

到此这篇关于PHP对接抖音开发平台接口的详细教程的文章就介绍到这了,更多相关PHP 抖音开发平台接口内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

                                                        
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
免责声明
1. 本论坛所提供的信息均来自网络,本网站只提供平台服务,所有账号发表的言论与本网站无关。
2. 其他单位或个人在使用、转载或引用本文时,必须事先获得该帖子作者和本人的同意。
3. 本帖部分内容转载自其他媒体,但并不代表本人赞同其观点和对其真实性负责。
4. 如有侵权,请立即联系,本网站将及时删除相关内容。
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表