PHP对接抖音开发平台接口

  • 一、说明
  • 二、代码
  • 三、代码运行需知
  • 四、功能扩展
  • 五、接口调用需要注意的点
  • 六、接口文档中的 '坑'(以订单列表接口为例)
    • 1、请求参数、响应参数 代表的具体值不清晰
    • 2、页码从第0页开始(这个属于需要注意的点)
    • 3、金额 是元 还是 分,不清晰

一、说明

  • 抖音开放平台-开发指南

二、代码

<?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/814private $appKey; //appKeyprivate $appSecret; //appSecretprivate $accessToken; //访问令牌private $refreshToken; //刷新令牌private $versionNumber; //API协议版本,当前版本为 2private $versionNumberStr; //API协议版本,当前版本为 v2public 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,汉字不被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、金额 是元 还是 分,不清晰

  • 不给的话,那就默认为:
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/34708.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

抖音怎么运营?分享个人抖音运营思路方案

抖音怎么运营&#xff1f; 符合这三点&#xff0c;你的视频很容易受欢迎&#xff0c;账号也很容易上升。她是如何做到这三点的&#xff1f; 1.让平台向您推荐更多流量。 2.让用户完全观看您的视频。 3.看完一段视频后&#xff0c;我想看下一个。 让平台向您推荐更多流量。 …

一篇文章带你了解抖音来客功能的使用方法和注意事项

抖音是近年来备受欢迎的社交媒体平台之一&#xff0c;其中的“来客”功能更是让许多人喜爱。那么什么是抖音来客呢&#xff1f;抖音来客是指在直播过程中&#xff0c;可以邀请其他抖音用户进行互动和参与&#xff0c;从而增加直播的热度和粉丝数量。下面不若与众科技就来介绍一…

抖音平台如何推广?代运营还是用优化系统

近年来&#xff0c;互联网进入下半场&#xff0c;移动端的新媒体抢到了流量风口&#xff0c;尤其是以抖音小红书为首的短视频平台深受关注。小马识途的客户开始通过抖音做推广、做宣传的企业越来越多&#xff0c;其中有一些公司已经尝到了抖音seo带来的甜头&#xff0c;加入抖音…

抖音上传视频(纯前端实现霸屏软件的功能)进店转发视频功能,详情搜索抖音霸屏软件

抖音霸屏软件 抖音霸屏介绍先来介绍一下吧&#xff0c;嫌啰嗦的可以直接跳转>>>思路分析 ↓ 抖音开发文档思路分析步骤 抖音霸屏介绍 先来介绍一下吧&#xff0c;嫌啰嗦的可以直接跳转>>>思路分析 ↓ 1.抖音同城霸屏&#xff1a;可控制所有扫码用户发布视频…

手把手教你接入抖音小程序发送模板消息通知

模板消息是指&#xff1a;按照一定的模板样式发送给用户的消息&#xff0c;顾名思义&#xff0c;它的内容必须限制在某一个模板框框内&#xff0c;只能做填空题&#xff0c;做不了主观题。 场景举例&#xff1a;用户A下了订单并交易成功&#xff0c;应该给该用户手机端下发一条…

关于抖音文案的重要性以及如何分享好的抖音文案,详情已附上

抖音文案是指在抖音平台上发布短视频时所配以的文字内容&#xff0c;它是短视频的重要补充和补充说明。接下来&#xff0c;不若与众科技将详细介绍抖音文案的重要性以及如何分享好的抖音文案。 一、抖音文案的重要性 1.提高视频的关注度 好的抖音文案可以让视频更加生动有趣&…

关键词推广怎么做比较好?抖音宣传做关键词推广有哪些好的方法

一、抖音宣传关键词推广的基本原则 关键词的选择要合理&#xff1a;选择的关键词要尽量针对性强、覆盖面广&#xff0c;且要具有较高的搜索量和热度&#xff0c;能够更好的满足用户的需求&#xff1b; 关键词的定位要准确&#xff1a;在抖音宣传关键词推广中&#xff0c;根据关…

对接微信支付接口

SpringBoot中对接微信支付接口 1.微信支付开发文档 https://pay.weixin.qq.com/wiki/doc/api/index.html 1.准备工作&#xff1a; 在微信上申请服务号类型的公众号&#xff0c;从公众号获取以下数据 appid&#xff1a;微信公众账号或开放平台APP的唯一标识 mch_id&#xf…

手把手教你如何在Java在Excel中进行数据分析

摘要&#xff1a;本文由葡萄城技术团队于CSDN原创并首发。转载请注明出处&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。 前一段时间淘宝出了一个“淘宝人生”的模块&#xff0c;可以看从注册淘宝账号至今的消…

文心一格:文心一格发布会图文摘要及与ChatGPT对此分析

文章目录 [toc]简介1.文学创作二、商业文案创作三、数理逻辑推算四、中文理解五、[多模态](https://so.csdn.net/so/search?q多模态&spm1001.2101.3001.7020)生成六、原理分析七、社会反响小结 简介 GPT-4发布一天之后&#xff0c;压力全部给到百度这边。就在刚刚&#x…

​​​​​​​NLP之TEA:基于python编程(jieba库)实现中文文本情感分析(得到的是情感评分)

NLP之TEA&#xff1a;基于python编程(jieba库)实现中文文本情感分析(得到的是情感评分) 目录 输出结果 设计思路 相关资料 1、关于代码 2、关于数据集 关于留言 1、留言内容的注意事项 2、如何留言&#xff1f; 2.1、第一种方法——在对应的博客下留言 2.2、备用第二…

Linux输密码不显示

Linux是一个安全性比较强的的操作系统&#xff0c;所以输入密码的时候是不会显示的&#xff0c;但是它会记忆用户输入的密码&#xff0c;所以一般还是不要把密码设置的太复杂了。不然

Git 命令行账号密码输入错误解决方法

场景&#xff1a;git操作仓库&#xff0c;第一次弹窗输入账号密码不正确&#xff0c;后续不再弹窗。且后续操作无法进行。 在命令行里使用git 提交时弹出让输入git账号密码输错一次后续就不会再弹出来了&#xff08;它这里和在IDEA里使用不太一样&#xff0c;IDEA好找且他会重…

ubuntu 虚拟终端登录 incorrect 无法输入密码

问题过程&#xff1a; 1.服务器ubuntu 18.04版本&#xff0c;在使用sudo命令时出现以下问题&#xff1a; sudo xxx Sorry, try again. Sorry, try again. sudo: 3 incorrect password attempts 细节&#xff1a;在输入sudo命令敲击回车后&#xff0c;没有任何输入和操作&#…

pgsql命令行直接输入密码登录

问题描述 我怎么登录&#xff0c;都要求输入密码&#xff0c;如图&#xff1a; 查看如下参数 Connection options: -h, --hostHOSTNAME database server host or socket directory (default: “local socket”) -p, --portPORT database server port (default: “5432”) -U, …

关于MySQL输入密码却无法正常登录的情况解决

有时候即使输入了正确密码也无法进入MySQL。 你只需要打开任务管理器&#xff0c;找到“服务“一栏”&#xff0c;找到MySQL 右击-> 开始 然后在输入密码就能进了

Centos系统输入密码是对的,为啥登录不了,教你简单解决

centos密码规则&#xff1a; 新密码中至少需要一个大写字符 新密码中至少需要一个小写字符 新密码中至少需要一位数字 我的秘密是Asd25781 按Caps lock调成大写 这里可以看到有显示大写提醒 提醒错误&#xff0c;请重新输入 同时安装shift键和要输入的大写字母即可登录。结…

登录框输入正确无法登录

登录框输完了正确信息点击登录就会把你的信息全部清除掉&#xff0c;而没有登录。 问题描述&#xff1a; 登录框输完了正确信息点击登录就会把你的信息全部清除掉&#xff0c;而没有登录。 解决方案&#xff1a; 看下面的图&#xff0c;是我Google插件ModHeader的影响&#x…

Linux命令行窗口无法输入密码

今天碰到一个问题&#xff0c;准备下载gcc编译器的&#xff0c;执行了sudo命令下载&#xff0c;但是当要输入密码验证的时候&#xff0c;发现输入密码&#xff01;&#xff01;&#xff01;&#xff01; 解决&#xff1a;其实不是无法输入密码&#xff0c;是Linux命令行窗口输…

计算机带来好处坏处的英语作文,关于电脑的好处与坏处的英语作文

电脑&#xff0c;大家并不陌生&#xff0c;电脑能带给我们什么呢? 我觉得电脑是我们学习中的好伙伴&#xff0c;电脑可以用来查资料&#xff0c;电脑可以用来看你最想了解的新闻&#xff0c;电脑可以用来写博文&#xff0c;发表你自己的文章&#xff0c;发表你... 在这日新月异…