当前位置:首页 > PHP教程 > php高级应用 > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2022-05-18 09:21:18 浏览: 评论:0 

本文主要介绍了PHP对接抖音开发平台接口的详细教程,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。

一、说明

抖音开放平台-开发指南

二、代码

  1. <?php 
  2. namespace app\common\libs; 
  3.  
  4. use app\common\exception\BaseException; 
  5.  
  6. /** 
  7.  * Class DouYinApi 
  8.  * @package app\common\libs 
  9.  */ 
  10. class DouYinApi 
  11.     private $host//抖音接口API,API调用指南:https://op.jinritemai.com/docs/guide-docs/148/814 
  12.     private $appKey//appKey 
  13.     private $appSecret//appSecret 
  14.     private $accessToken//访问令牌 
  15.     private $refreshToken//刷新令牌 
  16.     private $versionNumber//API协议版本,当前版本为 2 
  17.     private $versionNumberStr//API协议版本,当前版本为 v2 
  18.  
  19.     public function __construct() 
  20.     { 
  21.         $this->host = 'https://openapi-fxg.jinritemai.com'; //接口访问地址 
  22.         $this->appKey = '你的抖音后台的appKey'
  23.         $this->appSecret = '你的抖音后台的appSecret'
  24.  
  25.         $this->versionNumber = '2'
  26.         $this->versionNumberStr = 'v' . $this->versionNumber; 
  27.  
  28.         //获取access_token,refresh_token放到最后,如果其他的如versionNumber在后面设置则报错:"v不可为空",因为handleToken中调用了versionNumber,但versionNumber此时的值为NULL 
  29.         $result = self::handleToken(); //创建Token 
  30. //        $result = self::handleToken(false); //刷新Token:提示-"缺少code",需要建一张第三方表存抖音该店铺的access_token,refresh_token,expire_time信息 
  31.         $this->accessToken = $result['access_token']; //用于出创建token接口之外的其他接口 
  32.         $this->refreshToken = $result['refresh_token']; //用于刷新token接口 
  33.     } 
  34.  
  35.     /** 
  36.      * 处理(创建/刷新)Token的方法 
  37.      * 开发指南 > 产品功能 > 授权介绍 -> 自用型应用店铺授权流程:https://op.jinritemai.com/docs/guide-docs/9/21 
  38.      * @param bool $createToken 是否调用创建Token的方法 
  39.      * @return array 
  40.      * @throws BaseException 
  41.      */ 
  42.     public function handleToken($createToken = true) 
  43.     { 
  44.         if ($createToken) { //调用创建token接口 
  45.             $param = [ 
  46.                 'code' => ''
  47.                 'grant_type' => 'authorization_self'
  48.                 'shop_id' => '你抖音店铺的ID'//店铺ID,仅自用型应用有效;若不传,则默认返回最早授权成功店铺对应的token信息 
  49.             ]; 
  50.             $method = 'token.create'
  51.  
  52.         } else { //调用刷新Token方法 
  53.             $param = [ 
  54. //                'app_id' => '', //应用key ,长度19位字母和数字组合的字符串,可不传 
  55.                 'refresh_token' => $this->refreshToken, //注意:传真实的refreshToken值,而不是传REFRESH_TOKEN 
  56.                 'grant_type' => 'refresh_token'
  57.             ]; 
  58.             $method = 'token.refresh'
  59.         } 
  60.  
  61.         $timestamp = time(); //接口请求前记录开始时间,防止过期时间$expireTime失效 
  62.         $result = self::fetch($method$param); 
  63.         if ($result['code'] != 10000) { //请求失败 
  64.             throw new BaseException($result['message']); 
  65.         } else { 
  66.             $data = $result['data']; 
  67.             $accessToken = $data['access_token']; //accessToken 
  68.             $refreshToken = $data['refresh_token']; //refreshToken 
  69.             $expireTime = $timestamp + $data['expires_in']; //Token过期时间 = 当前时间 + 有效时间(秒s) 
  70.  
  71.             return [ 
  72.                 'access_token' => $accessToken
  73.                 'refresh_token' => $refreshToken
  74.             ]; 
  75.         } 
  76.     } 
  77.  
  78.     /** 
  79.      * 封装抖音接口公共方法 
  80.      * PHP调用说明:https://op.jinritemai.com/docs/guide-docs/151/811 
  81.      * @param $method 方法名:格式 token.create 方法中转为 token/create 
  82.      * @param $param 请求接口需要的参数名 
  83.      * @param bool $accessToken url中是否要加上access_token,默认否。 
  84.      *              为什么不直接传accessToken的值:在本类中,可以获取到accessToken的值,直接传,但是如果在其他的地方调用就获取不到access_token的值,需要传true/false标识在本类中获取。 
  85.      * @param bool $paramJsonAddToUrl 是否把paramJson放到 url 中,根据实际情况 
  86.      *          例:实际过程中【订单批量解密接口】不需要放到url中(猜测是这个接口paramJson内容太多,会超出GET的最大内容) 
  87.      *              订单批量解密接口:https://op.jinritemai.com/docs/api-docs/15/982 
  88.      * @return false|mixed|string 
  89.      */ 
  90.     function fetch($method$param$accessToken = false, $paramJsonAddToUrl = true) 
  91.     { 
  92.         //当前时间戳 
  93.         $timestamp = time(); 
  94.  
  95.         //PHP中:如果数组为空转为json之后是[]。但接口可能是强类型语言编写的,需要传{}。所以$param为空时,需要把$paramJson设置为{} 
  96.         $paramJson = $param ? self::marshal($param) : '{}'
  97.  
  98.         //获取签名 
  99.         $sign = self::sign($method$timestamp$paramJson); 
  100.  
  101.         //调用的方法.替换为/ 
  102.         $methodPath = str_replace('.''/'$method); 
  103.  
  104.         //拼接url路径 
  105.         $url = $this->host . '/' . $methodPath . 
  106.             '?method=' . urlencode($method) . 
  107.             '&app_key=' . urlencode($this->appKey); 
  108.  
  109.         if ($accessToken) { 
  110.             $url .= '&access_token=' .urlencode($this->accessToken); 
  111.         } 
  112.  
  113.         $url .= '&timestamp=' . urlencode(strval($timestamp)) . 
  114.             '&v=' . urlencode($this->versionNumber) . 
  115.             '&sign=' . $sign
  116.  
  117.         if ($paramJsonAddToUrl) { 
  118.             $url .= '&param_json=' . $paramJson
  119.         } 
  120.  
  121.         $url .= '&sign_method=' . urlencode('hmac-sha256'); //官方接口为非必填,但是不加签名会验证失败 
  122.  
  123.         //处理句柄数据 
  124.         $opts = array('http' => 
  125.             array
  126.                 'method' => 'POST'
  127.                 'header' => "Accept: */*\r\n" . 
  128.                     "Content-type: application/json;charset=UTF-8\r\n"
  129.                 'content' => $paramJson 
  130.             ) 
  131.         ); 
  132.  
  133.         $context = stream_context_create($opts); 
  134.         $result = file_get_contents($url, false, $context); 
  135.  
  136.         return json_decode($result,true); 
  137.     } 
  138.  
  139.     //计算签名 
  140.     function sign($method$timestamp$paramJson
  141.     { 
  142.         $paramPattern = 'app_key' . $this->appKey . 'method' . $method . 'param_json' . $paramJson . 'timestamp' . $timestamp . $this->versionNumberStr; 
  143.         $signPattern = $this->appSecret . $paramPattern . $this->appSecret; 
  144.  
  145.         return hash_hmac("sha256"$signPattern$this->appSecret); 
  146.     } 
  147.  
  148.     //序列化参数,入参必须为关联数组(键值对数组) 
  149.     function marshal(array $param
  150.     { 
  151.         self::rec_ksort($param); // 对关联数组中的kv,执行排序,需要递归 
  152.         $s = json_encode($param, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); // 重新序列化,确保所有key按字典序排序 
  153.         // 加入flag,确保斜杠不被escape,汉字不被escape 
  154.         return $s
  155.     } 
  156.  
  157.     //关联数组排序,递归 
  158.     function rec_ksort(array &$arr
  159.     { 
  160.         $kstring = true; 
  161.         foreach ($arr as $k => &$v) { 
  162.             if (!is_string($k)) { 
  163.                 $kstring = false; 
  164.             } 
  165.             if (is_array($v)) { 
  166.                 self::rec_ksort($v); //这里的调用方式要和marshal中调用方式一致 
  167.             } 
  168.         } 
  169.         if ($kstring) { 
  170.             ksort($arr); 
  171.         } 
  172.     } 

三、代码运行需知

在 __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用于接口调用

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

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

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

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

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

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

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

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

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

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

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

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

3、金额 是元 还是 分,不清晰

不给的话,那就默认为:分

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

Tags: PHP对接抖音开发平台接口

分享到: