最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PHP對接抖音開發(fā)平臺接口的詳細教程

 更新時間:2021年11月26日 09:55:18   作者:夏已微涼、  
本文主要介紹了PHP對接抖音開發(fā)平臺接口的詳細教程,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

一、說明

抖音開放平臺-開發(fā)指南

二、代碼

<?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協(xié)議版本,當前版本為 2
    private $versionNumberStr; //API協(xié)議版本,當前版本為 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(); //創(chuàng)建Token
//        $result = self::handleToken(false); //刷新Token:提示-"缺少code",需要建一張第三方表存抖音該店鋪的access_token,refresh_token,expire_time信息
        $this->accessToken = $result['access_token']; //用于出創(chuàng)建token接口之外的其他接口
        $this->refreshToken = $result['refresh_token']; //用于刷新token接口
    }

    /**
     * 處理(創(chuàng)建/刷新)Token的方法
     * 開發(fā)指南 > 產品功能 > 授權介紹 -> 自用型應用店鋪授權流程:https://op.jinritemai.com/docs/guide-docs/9/21
     * @param bool $createToken 是否調用創(chuàng)建Token的方法
     * @return array
     * @throws BaseException
     */
    public function handleToken($createToken = true)
    {
        if ($createToken) { //調用創(chuàng)建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,執(zhí)行排序,需要遞歸
        $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:狀態(tài)(0-關閉;1-啟用),create_time,update_time ...
  • 我們要對接抖音前,在third_shop中寫好 id;shop_name:店鋪名;third_shop_id:第三方店鋪的ID,source:店鋪來源(抖音,京東,天貓);app_key,app_secret;status:狀態(tài)(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對接抖音開發(fā)平臺接口的詳細教程的文章就介紹到這了,更多相關PHP 抖音開發(fā)平臺接口內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • PHP異步進程助手async-helper

    PHP異步進程助手async-helper

    這篇文章主要介紹了PHP異步進程助手async-helper的詳細用法以及相關代碼實例,對此有需要的朋友學習下。
    2018-02-02
  • c#中的實現php中的preg_replace

    c#中的實現php中的preg_replace

    最近在按照一個php項目用c#重寫,一邊學習同時發(fā)現了他們的神似神不似的很多地方
    2009-12-12
  • PHP strlen()函數用法詳解

    PHP strlen()函數用法詳解

    PHP中的strlen()函數用于獲取字符串的長度,即字符串字符的個數,并返回該字符串中字符的數量,這個函數不考慮字符的編碼,只計算字符的個數,本文就給大家詳細說說PHP strlen()函數的使用方法
    2023-07-07
  • php中使用DOM類讀取XML文件的實現代碼

    php中使用DOM類讀取XML文件的實現代碼

    php中使用DOM類讀取XML文件的實現代碼,學習php的朋友可以參考下。
    2011-12-12
  • php+mysql實現的無限分類方法類定義與使用示例

    php+mysql實現的無限分類方法類定義與使用示例

    這篇文章主要介紹了php+mysql實現的無限分類方法類定義與使用,結合實例形式分析了php+mysql無限分類方法類基本定義與使用方法,需要的朋友可以參考下
    2020-05-05
  • html靜態(tài)頁面調用php文件的方法

    html靜態(tài)頁面調用php文件的方法

    這篇文章主要介紹了html靜態(tài)頁面調用php文件的方法,在進行應用程序開發(fā)過程中非常具有實用價值,需要的朋友可以參考下
    2014-11-11
  • php Undefined index的問題

    php Undefined index的問題

    通常本地程序傳送到服務器上就會出現各種未定義的NOTICE提示,并不算是錯誤,只是警告。
    2009-06-06
  • 為Plesk PHP7啟用Oracle OCI8擴展方法總結

    為Plesk PHP7啟用Oracle OCI8擴展方法總結

    在本篇文章里小編給大家總結了關于為Plesk PHP7啟用Oracle OCI8擴展方法和相關代碼,需要的朋友們學習下。
    2019-03-03
  • PHP載入圖像imagecreatefrom_gif_jpeg_png系列函數用法分析

    PHP載入圖像imagecreatefrom_gif_jpeg_png系列函數用法分析

    這篇文章主要介紹了PHP載入圖像imagecreatefrom_gif_jpeg_png系列函數用法,結合實例形式分析了php的圖像載入函數imagecreatefromgif、imagecreatefromjpeg、imagecreatefrompng、imagecreatefromwbmp及imagecreatefromstring使用技巧,需要的朋友可以參考下
    2016-11-11
  • php fread讀取文件注意事項

    php fread讀取文件注意事項

    php fread函數用于從文件中讀取一定長度的字符,本文章向大家介紹fread讀取文件的實例以及使用該函數讀取文件需要注意的幾個地方,需要的朋友可以參考一下。
    2016-09-09

最新評論

徐州市| 米泉市| 新绛县| 鄂州市| 张家界市| 竹北市| 徐州市| 浮山县| 津南区| 长治市| 仲巴县| 策勒县| 太康县| 徐汇区| 虞城县| 东宁县| 夏河县| 临朐县| 勃利县| 伊宁市| 上饶县| 明光市| 大同县| 乐至县| 察雅县| 铜川市| 太原市| 革吉县| 兴和县| 汝州市| 尼木县| 石景山区| 鄂州市| 贞丰县| 涞源县| 百色市| 利津县| 北碚区| 富平县| 昭苏县| 金秀|