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

admin3年前PHP教程89
一、说明

抖音开放平台-开发指南

二、代码

<?phpnamespace app\common\libs;use app\common\exception\BaseException;/*** Class DouYinApi* @package app\common\libs*/class DouYinApi{private $host; //抖音接口API,API调用指南:op.jinritemai/docs/guide-docs/148/814private $appKey; //appKeyprivate $appSecret; //appSecretprivate $accessToken; //访问令牌private $refreshToken; //刷新令牌private $versionNumber; //API协议版本,当前版本为 2private $versionNumberStr; //API协议版本,当前版本为 v2public function __construct(){$this->host = 'openapi-fxg.jinritemai'; //接口访问地址$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的方法 * 开发指南 > 产品功能 > 授权介绍 -> 自用型应用店铺授权流程:op.jinritemai/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调用说明:op.jinritemai/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的最大内容) *订单批量解密接口:op.jinritemai/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 .= '&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,汉字不被escapereturn $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对接抖音开发平台接口的详细教程的文章就介绍到这了,更多相关PHP 抖音开发平台接口内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:blog.csdn/qq_36025814/article/details/121539452

免责声明:本文内容来自用户上传并发布,站点仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。请核实广告和内容真实性,谨慎使用。

相关文章

Laravel的加密解密与哈希实例讲解

一、加密解密当你的应用程序中需要用到加密和解密的地方时可以使用Laravel自带的加密解密工具。Laravel 的加密机制使用的是 OpenSSL 所提供的 AES-256 和 AES-128 加密。...

租用国外多ip服务器之前要考虑什么国外多ip服务器租用注意事项

租用国外多ip服务器之前要考虑什么?1、选择安全性高的国外多ip服务器选择国外多ip服务器要选择安全性高的服务器,避免服务器受攻击不能正常使用时出现全部网站都打不开的情况。专业的提供商所提供的服务器机...

10个常见网站安全攻击手段及防御方法?美国高防服务器如何防御网络攻击?

在某种程度上,互联网上的每个网站都容易遭受安全攻击。从人为失误到网络罪犯团伙发起的复杂攻击均在威胁范围之内。网络攻击者最主要的动机是求财。无论你运营的是电子商务项目还是简单的小型商业网站,潜在攻击的风...

spss数据分析(大数据如何分析数据)

spss数据分析SPSS数据剖析办法有许多,本文从描绘性剖析、问卷剖析、量化剖析、核算建模、差异性剖析这几个模块,用一句话简述各个剖析办法的效果以及分享事例示例描绘性剖析频数剖析:一组数据的不同数值的...

详解Laravel服务容器的优势

目录概述使用服务容器的优势例一、发送邮件例二、实现单例模式例三、旅行者去旅行总结概述laravel服务容器就像一个高度自动化的工厂,你需要的东西,定制好模型,使用特定接口来制造。因为使用了服务容器,l...

5个提升高防服务器安全性的小技巧?使用国内电信100G高防服务器需要注意的有哪些?

互联网中网络环境更为复杂出现多种多样的网络流量攻击,而且出现频率也越来越高。租赁高防服务器的用户同样也需要面临网络安全方面的问题,要关注高防服务器的软硬件安全性的升级,以下分享5个升级高防服务器安全性...