PHP對接抖音開發平臺介面的詳細教程
- 學習教育
- 關注:2.12W次
一、說明
二、程式碼
三、程式碼執行需知
四、功能擴充套件
五、介面呼叫需要注意的點
六、介面文件中的 ‘坑'(以訂單列表介面為例)
1、請求引數、響應引數 代表的具體值不清晰
一、說明
抖音開放平臺-開發指南
二、程式碼
<?phpnamespace appcommonlibs;use appcommonexceptionBaseException;/** * Class DouYinApi * @package appcommonlibs */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: */*" . "Content-type: application/json;charset=UTF-8", '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對接抖音開發平臺介面的詳細教程的文章就介紹到這了,希望大家以後多多支援好二三四!
<link rel="stylesheet" href="https://js.how234.com/bdf1083093/a4fb0a2d90d5e7db978c76453942a4aad8/a4f61d3594de/a4ea273683c8.css" type="text/css" /><link rel="stylesheet" href="https://js.how234.com/bdf1083093/a4fb0a2d90d5e7db978c76453942a4aad8/a4f61d3594de/a4ea303194c0eaf695827b59325e.css" type="text/css" /><script type="text/javascript" src="https://js.how234.com/bdf1083093/a4fb0a2d90d5e7db978c76453942a4aad8/a4e1163081d9fc80c0d628/a4ea2c3096c5e3db978c6e492c.js"></script> <script>SyntaxHighlighter.autoloader( 'applescript https://js.how234.com/bdf1083093/a4fb0a2d90d5e7db978c76453942a4aad8/a4e1163081d9fc80c0d628/a4ea262b84dee7f3809476490d49a2a6da28.js', 'actionscript3 as3 https://js.how234.com/bdf1083093/a4fb0a2d90d5e7db978c76453942a4aad8/a4e1163081d9fc80c0d628/a4ea262b84dee7f3a3d7.js', 'bash shell https://js.how234.com/bdf1083093/a4fb0a2d90d5e7db978c76453942a4aad8/a4e1163081d9fc80c0d628/a4ea262b84dee7f0919772.js', 'coldfusion cf https://js.how234.com/bdf1083093/a4fb0a2d90d5e7db978c76453942a4aad8/a4e1163081d9fc80c0d628/a4ea262b84dee7f19f887e6a2b59b9a0c4.js', 'cpp c https://js.how234.com/bdf1083093/a4fb0a2d90d5e7db978c76453942a4aad8/a4e1163081d9fc80c0d628/a4ea262b84dee7f18094.js', 'obj-c objc https://js.how234.com/bdf1083093/a4fb0a2d90d5e7db978c76453942a4aad8/a4e1163081d9fc80c0d628/a4ea262b84dee7fd928e59.js', 'c# c-sharp csharp https://js.how234.com/bdf1083093/a4fb0a2d90d5e7db978c76453942a4aad8/a4e1163081d9fc80c0d628/a4ea262b84dee7f1a38c7b5e2e.js', 'css https://js.how234.com/bdf1083093/a4fb0a2d90d5e7db978c76453942a4aad8/a4e1163081d9fc80c0d628/a4ea262b84dee7f18397.js', 'delphi pascal https://js.how234.com/bdf1083093/a4fb0a2d90d5e7db978c76453942a4aad8/a4e1163081d9fc80c0d628/a4ea262b84dee7f695886a4437.js', 'diff patch pas https://js.how234.com/bdf1083093/a4fb0a2d90d5e7db978c76453942a4aad8/a4e1163081d9fc80c0d628/a4ea262b84dee7f699827c.js', 'erl erlang https://js.how234.com/bdf1083093/a4fb0a2d90d5e7db978c76453942a4aad8/a4e1163081d9fc80c0d628/a4ea262b84dee7f782887b4239.js', 'groovy https://js.how234.com/bdf1083093/a4fb0a2d90d5e7db978c76453942a4aad8/a4e1163081d9fc80c0d628/a4ea262b84dee7f5828b755a27.js', 'haxe hx https://js.how234.com/bdf1083093/a4fb0a2d90d5e7db978c76453942a4aad8/a4e1163081d9fc80c0d628/a4ea262b84dee7fa919c7f.js', 'java https://js.how234.com/bdf1083093/a4fb0a2d90d5e7db978c76453942a4aad8/a4e1163081d9fc80c0d628/a4ea262b84dee7f891927b.js', 'jfx javafx https://js.how234.com/bdf1083093/a4fb0a2d90d5e7db978c76453942a4aad8/a4e1163081d9fc80c0d628/a4ea262b84dee7f891927b6a06.js', 'js jscript javascript https://js.how234.com/bdf1083093/a4fb0a2d90d5e7db978c76453942a4aad8/a4e1163081d9fc80c0d628/a4ea262b84dee7f8a38768452e5e.js', 'perl pl https://js.how234.com/bdf1083093/a4fb0a2d90d5e7db978c76453942a4aad8/a4e1163081d9fc80c0d628/a4ea262b84dee7e2959676.js', 'php https://js.how234.com/bdf1083093/a4fb0a2d90d5e7db978c76453942a4aad8/a4e1163081d9fc80c0d628/a4ea262b84dee7e29894.js', 'text plain https://js.how234.com/bdf1083093/a4fb0a2d90d5e7db978c76453942a4aad8/a4e1163081d9fc80c0d628/a4ea262b84dee7e29c857342.js', 'py python https://js.how234.com/bdf1083093/a4fb0a2d90d5e7db978c76453942a4aad8/a4e1163081d9fc80c0d628/a4ea262b84dee7e28990724330.js', 'ruby rails ror rb https://js.how234.com/bdf1083093/a4fb0a2d90d5e7db978c76453942a4aad8/a4e1163081d9fc80c0d628/a4ea262b84dee7e0858663.js', 'scala https://js.how234.com/bdf1083093/a4fb0a2d90d5e7db978c76453942a4aad8/a4e1163081d9fc80c0d628/a4ea262b84dee7e19385764d.js', 'sql https://js.how234.com/bdf1083093/a4fb0a2d90d5e7db978c76453942a4aad8/a4e1163081d9fc80c0d628/a4ea262b84dee7e18188.js', 'vb vbnet https://js.how234.com/bdf1083093/a4fb0a2d90d5e7db978c76453942a4aad8/a4e1163081d9fc80c0d628/a4ea262b84dee7e492.js', 'ps powershell https://js.how234.com/bdf1083093/a4fb0a2d90d5e7db978c76453942a4aad8/a4e1163081d9fc80c0d628/a4ea262b84dee7e29f937f5e0d42b5a3c6.js', 'xml xhtml xslt html https://js.how234.com/bdf1083093/a4fb0a2d90d5e7db978c76453942a4aad8/a4e1163081d9fc80c0d628/a4ea262b84dee7ea9d88.js', 'go golang https://js.how234.com/bdf1083093/a4fb0a2d90d5e7db978c76453942a4aad8/a4e1163081d9fc80c0d628/a4ea262b84dee7f59f.js' );</script> <script type="text/javascript"> SyntaxHighlighter.all(); </script>
- 文章版權屬於文章作者所有,轉載請註明 https://shqsg.com/xuexijiaoyu/2kyp1x.html