PHP对接抖⾳开发平台接⼝的详细教程
⽬录
⼀、说明
⼆、代码
三、代码运⾏需知
四、功能扩展
五、接⼝调⽤需要注意的点
六、接⼝⽂档中的 ‘坑'(以订单列表接⼝为例)
1、请求参数、响应参数代表的具体值不清晰
⼀、说明
⼆、代码
<?php
namespace 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/814
private $appKey; //appKey
private $appSecret; //appSecret
private $accessToken; //访问令牌
private $refreshToken; //刷新令牌
private $versionNumber; //API协议版本,当前版本为 2
private $versionNumberStr; //API协议版本,当前版本为 v2
public 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 = 'ate';
} else { //调⽤刷新Token⽅法
$param = [
//                'app_id' => '', //应⽤key ,长度19位字母和数字组合的字符串,可不传
'refresh_token' => $this->refreshToken, //注意:传真实的refreshToken值,⽽不是传REFRESH_TOKEN
'grant_type' => 'refresh_token',
];
$method = 'fresh';
}
$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 ⽅法名:格式 ate ⽅法中转为 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 .= '×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、请求参数、响应参数代表的具体值不清晰
php如何运行代码中请求参数、响应参数main_status,每个数字代表什么意思,没有清楚的给出,如下图:
给了,在接⼝的响应参数中,如下图:
2、页码从第0页开始(这个属于需要注意的点)
3、⾦额是元还是分,不清晰
不给的话,那就默认为:分
到此这篇关于PHP对接抖⾳开发平台接⼝的详细教程的⽂章就介绍到这了,更多相关PHP 抖⾳开发平台接⼝内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。