当前所在位置: 首页 > 儿童教育 > 正文

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

2022-11-15 canyinms.com 【 字体:

一、说明

二、代码

三、代码运行需知

四、功能扩展

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

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

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

一、说明

抖音开放平台-开发指南

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

use app\common\exception\BaseException;

/**
 * Class DouYinApi
 * @package app\common\libs
 */
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接口
    }

    /**
     * 处理(创建/刷新)Token的方法
     * 开发指南 > 产品功能 > 授权介绍 -> 自用型应用店铺授权流程:https://op.jinritemai.com/docs/guide-docs/9/21
     * @param bool $createToken 是否调用创建Token的方法
     * @return array
     * @throws BaseException
     */
    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,
            ];
        }
    }

    /**
     * 封装抖音接口公共方法
     * PHP调用说明:https://op.jinritemai.com/docs/guide-docs/151/811
     * @param $method 方法名:格式 token.create 方法中转为 token/create
     * @param $param 请求接口需要的参数名
     * @param bool $accessToken url中是否要加上access_token,默认否。
     *              为什么不直接传accessToken的值:在本类中,可以获取到accessToken的值,直接传,但是如果在其他的地方调用就获取不到access_token的值,需要传true/false标识在本类中获取。
     * @param bool $paramJsonAddToUrl 是否把paramJson放到 url 中,根据实际情况
     *          例:实际过程中【订单批量解密接口】不需要放到url中(猜测是这个接口paramJson内容太多,会超出GET的最大内容)
     *              订单批量解密接口:https://op.jinritemai.com/docs/api-docs/15/982
     * @return false|mixed|string
     */
    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 .= '×tamp=' . urlencode(strval($timestamp)) .
            '&v=' . urlencode($this->versionNumber) .
            '&sign=' . $sign;

        if ($paramJsonAddToUrl) {
            $url .= '¶m_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用于接口调用

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

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

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

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

六、接口文档中的 ‘坑'(以订单列表接口为例)1、请求参数、响应参数 代表的具体值不清晰

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

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

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

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

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

到此这篇关于PHP对接抖音开发平台接口的详细教程的文章就介绍到这了,希望大家以后多多支持好二三四!

阅读全文
相关推荐

橘子洲旅游攻略 长沙橘子洲怎么玩

橘子洲旅游攻略 长沙橘子洲怎么玩
橘子洲是湘江中的一个冲击沙洲,四面环水绵延数十里,是国家重点风景名胜区。景区内有历史文化陈列馆、潇湘名人会所、柑橘文化园等景观,集观赏休闲娱乐于一体。在特定时间段,橘子洲烟火是一场绝不可错过的视觉盛宴。景区原面积约17公顷,其中开放区面积约6公顷,主要景点有洲头颂橘亭、汉白玉诗词碑、铜像广场、藤架广场、揽岳亭、枕江亭、盆景园、大门广场等。

西安周边旅游攻略 西安周边最值得去的地方

西安周边旅游攻略 西安周边最值得去的地方
1、华山风景名胜区:“华山论剑谁为峰,一见重阳道成空”,武侠小说为华山披上了浓厚的江湖色彩,同时华山用它的险峻向每一位前来攀登的游客发起挑战。整个华山拥有多达200余处景点,东峰的日出、西峰的峭壁、南峰的林木、北峰的云雾,每一处景色都独具魅力。打卡建议:在西峰乘坐索道上山,再从北峰乘坐索道下山,一天游玩下来大致需要6—8个小时,并且可以把景点都逛到。如果选择夜爬华山看日出的话,记得带一件厚一点的衣服,越往上爬山上越冷。还有记得爬山戴双手套,因为华山有些路段需要双脚并用才能攀登的上去。

毛坦厂中学万人雨中送考 毛坦厂送考头车车牌91666祝福考生

毛坦厂中学万人雨中送考 毛坦厂送考头车车牌91666祝福考生
六安市毛坦厂中学,简称“毛中”,位于安徽省六安市金安区毛坦厂镇,被称为“亚洲最大高考工厂”。每次送考时节也都会有万余名家长和当地居民前来送考,毛坦厂镇的万人送考成为当地乃至安徽省内的一个“高考景观”。  毛坦厂中学万人雨中送考  6月5日,安徽六安。今早7点半,毛坦厂中学送考车队又一次出发,考生

珠峰被救女子不愿支付全部救援费用 珠峰攀登者为救遇险女子放弃登顶

珠峰被救女子不愿支付全部救援费用 珠峰攀登者为救遇险女子放弃登顶
近日,湖南省登山队2名队员范江涛、谢如祥在距离登顶珠峰不到400米时,为救一名同中国籍的女子放弃登顶。此事引起网友广泛关注,网友纷纷为两人的义举支持点赞。但在成功救人后,被救女子的态度和表现,让两人倍感寒心。为请求救女子,他们当时允诺给夏尔巴向导1万美元,然而该女子事后只愿承担4000美元。

​登珠峰获救女子只愿承担4成救援费是怎么回事 登珠峰获救女子只愿承担4成救援费具体情况

​登珠峰获救女子只愿承担4成救援费是怎么回事 登珠峰获救女子只愿承担4成救援费具体情况
近日,湖南省登山队2名队员为救人放弃珠峰登顶计划引起热议。3日,有网友发布消息称:被救者只愿承担4成救援费。具体登珠峰获救女子只愿承担4成救援费是怎么回事?一起来了解登珠峰获救女子只愿承担4成救援费具体情况。登珠峰获救女子只愿承担4成救援费是怎么回事近日,湖南省登山队2名队员在距离登顶珠峰不到400

国内出现偏肺病毒感染 尚无治疗药物

国内出现偏肺病毒感染 尚无治疗药物
5月31日,据美国疾控中心(CDC)的呼吸道病毒监测系统显示,今年春季以来,人类偏肺病毒(HMPV)在美国各地区呈现高发态势,该病毒正肆虐美国各大医院的重症监护病房和儿科医院。  6月3日,某三甲医院感染控制中心主任医师告诉记者:“根据近几年国内零散报告,人偏肺病毒在呼吸道感染病人中确实是存在的

男子连吃100天麦当劳减重53斤是真的吗 男子连吃100天麦当劳为什么能减重53斤

男子连吃100天麦当劳减重53斤是真的吗 男子连吃100天麦当劳为什么能减重53斤
近日,据说美国一57岁男子通过连吃100天麦当劳的方式减肥,减了53斤。那么,男子连吃100天麦当劳减重53斤是真的吗?到底男子连吃100天麦当劳为什么能减重53斤?一起来了解具体情况。男子连吃100天麦当劳减重53斤是真的吗近日,据外媒报道,美国一名57岁男子通过连吃100天麦当劳的方式减肥,体重

本周狗屎运最旺的星座 本周狗屎运最旺的四大星座

本周狗屎运最旺的星座 本周狗屎运最旺的四大星座
本周(6.5-6.11)狗屎运最旺的星座TOP4如下:  TOP4:巨蟹座  金星冲冥王,巨蟹座走的狗屎运,可以说是超级大坨!不光是财运一飞冲天,主要事业运+学业运,迎来双运加速的爆发期!  TOP3:摩羯座  月亮六合水星,紧接着拱水星,摩羯运势仿佛踩上了蹦蹦床!正财运和偏财运,简直装备了跃迁

印度耗资百亿卢比的大桥又塌了是什么情况 印度耗资百亿卢比的大桥又塌了是为什么

印度耗资百亿卢比的大桥又塌了是什么情况 印度耗资百亿卢比的大桥又塌了是为什么
据印度媒体当地时间6月4日报道,印度比哈尔邦在建的横跨恒河的阿格瓦尼-苏丹甘吉大桥再次发生部分坍塌。据悉,此桥耗资百亿卢比。具体印度耗资百亿卢比的大桥又塌了是什么情况?到底印度耗资百亿卢比的大桥又塌了是为什么?一起来了解。印度耗资百亿卢比的大桥又塌了是什么情况据印度媒体6月5日报道,上周日下午6点左

一个村考出300多大学生6个北大 湖南一小村考上一本奖4000二本3000

一个村考出300多大学生6个北大 湖南一小村考上一本奖4000二本3000
一个村考出300多大学生6个北大是怎么回事?湖南一小村考上一本奖4000二本3000是什么情况?湖南益阳,爱屋湾村:一个让人自豪的地方,也是一个让人感动的地方。这个小村庄,历经数十年积淀,已经培养出了不少人才。据统计,爱屋湾村十年来累计奖励学生68名,其中有6人考上了北京大学,5人留学哈佛,其他
本文Tag