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

2023-01-21 0 1,764

猪小侠源码,https://www.20zxx.cn/
目录

一、说明

抖音开放平台-开发指南

二、代码

<?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 .= \'&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,汉字不被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,每个数字代表什么意思,没有清楚的给出,如下图:
PHP对接抖音开发平台接口的详细教程
给了,在订单详情 接口的 响应参数 中,如下图:
PHP对接抖音开发平台接口的详细教程
2、页码从第0页开始(这个属于需要注意的点)
PHP对接抖音开发平台接口的详细教程
3、金额 是元 还是 分,不清晰
不给的话,那就默认为:
PHP对接抖音开发平台接口的详细教程
到此这篇关于PHP对接抖音开发平台接口的详细教程的文章就介绍到这了,更多相关PHP 抖音开发平台接口内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

猪小侠源码,https://www.20zxx.cn/

:本文采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可, 转载请附上原文出处链接。
1、本站提供的源码不保证资源的完整性以及安全性,不附带任何技术服务!
2、本站提供的模板、软件工具等其他资源,均不包含技术服务,请大家谅解!
3、本站提供的资源仅供下载者参考学习,请勿用于任何商业用途,请24小时内删除!
4、如需商用,请购买正版,由于未及时购买正版发生的侵权行为,与本站无关。
5、本站部分资源存放于百度网盘或其他网盘中,请提前注册好百度网盘账号,下载安装百度网盘客户端或其他网盘客户端进行下载;
6、本站部分资源文件是经压缩后的,请下载后安装解压软件,推荐使用WinRAR和7-Zip解压软件。
7、如果本站提供的资源侵犯到了您的权益,请邮件联系: 442469558@qq.com 进行处理!

猪小侠源码-最新源码下载平台 PHP教程 PHP对接抖音开发平台接口的详细教程 http://www.20zxx.cn/464202/xuexijiaocheng/qes.html

猪小侠源码,优质资源分享网

常见问题
  • 本站所有资源版权均属于原作者所有,均只能用于参考学习,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担
查看详情
  • 最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,建议提前注册好百度网盘账号,使用百度网盘客户端下载
查看详情

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务