$appId, 'uri' => $uri, 'body' => $body, 'header' => $headers, 'response' => $response ], 1), ['song.shen@kuxuan-inc.com'], '抖音小程序'); } } $responseData = json_decode($response, 1); Log::logInfo($uri, [ 'appid' => $appId, 'body' => $body, 'header' => $headers, 'response' => $responseData ], 'douYinApi'); return $responseData; } # 获取小程序接口调用凭证 access_token public static function getAccessToken($appId, $retry = 0) { $requestUrl = 'https://developer.toutiao.com'; $uri = config('douyin.getAccessToken'); $params = [ 'app_id' => $appId, 'secret' => config('douyin.app_info')[$appId]['secret'] ?? '', 'grant_type' => 'client_credential', ]; $responseData = self::commonRequest($appId, $requestUrl, $uri, 'POST', $params); if(isset($responseData['err_no']) && 0 != $responseData['err_no']) { if($retry <= 3) { $retry++; return self::getAccessToken($appId, $retry); } else { # 重试几次还是失败了,要报警 EmailQueue::rPush('抖音小程序获取accessToken异常', json_encode([ 'app_id' => $appId, 'uri' => $uri, 'body' => $params, 'response' => $responseData ], 1), ['song.shen@kuxuan-inc.com'], '抖音小程序'); } } return $responseData['data'] ?? []; } public static function getClientToken($appId, $retry = 0) { $requestUrl = 'https://open.douyin.com'; $uri = config('douyin.getClientToken'); $params = [ 'client_key' => $appId, 'client_secret' => config('douyin.app_info')[$appId]['secret'] ?? '', 'grant_type' => 'client_credential', ]; $responseData = self::commonRequest($appId, $requestUrl, $uri, 'POST', $params); if(isset($responseData['data']['error_code']) && 0 != $responseData['data']['error_code']) { if($retry <= 3) { $retry++; return self::getClientToken($appId, $retry); } else { # 重试几次还是失败了,要报警 EmailQueue::rPush('抖音小程序获取clientToken异常', json_encode([ 'app_id' => $appId, 'uri' => $uri, 'body' => $params, 'response' => $responseData ], 1), ['song.shen@kuxuan-inc.com'], '抖音小程序'); } } return $responseData['data'] ?? []; } # 根据小程序code获取用户信息 public static function code2Session($appId, $code, $anonymousCode = null, $retry = 0) { $requestUrl = 'https://developer.toutiao.com'; $uri = config('douyin.getSession'); if(empty($code) && empty($anonymousCode)) { return 1102; } $params = [ 'appid' => $appId, 'secret' => config('douyin.app_info')[$appId]['secret'] ?? '', 'code' => $code ?? '', 'anonymous_code' => $anonymousCode ?? '', ]; $responseData = self::commonRequest($appId, $requestUrl, $uri, 'POST', $params); if(isset($responseData['err_no']) && 0 != $responseData['err_no']) { if($retry <= 3) { $retry++; return self::code2Session($appId, $code, $anonymousCode, $retry); } else { # 重试几次还是失败了,要报警 EmailQueue::rPush('抖音小程序请求codeSession异常', json_encode([ 'app_id' => $appId, 'code' => $code, 'anonymous_code' => $anonymousCode, 'uri' => $uri, 'body' => $params, 'response' => $responseData ], 1), ['song.shen@kuxuan-inc.com'], '抖音小程序'); } } return $responseData['data'] ?? []; } # 上传图片或者视频到抖音内容库 public static function uploadMedia($appId, $type, $fileUrl, $videoTitle, $videoDesc, $format, $retry = 0) { $requestUrl = 'https://open.douyin.com'; $uri = config('douyin.uploadMedia'); $params = [ 'resource_type' => $type, 'ma_app_id' => $appId, ]; switch($type) { case 1: $params['video_meta'] = [ 'url' => $fileUrl, 'title' => $videoTitle, 'description' => $videoDesc, 'format' => $format ]; break; case 2: $params['image_meta'] = [ 'url' => $fileUrl ]; } $accessToken = AccessTokenService::getAccessToken($appId); $header = [ 'access-token: '.$accessToken ]; $responseData = self::commonRequest($appId, $requestUrl, $uri, 'POST', $params, $header); if(isset($responseData['err_no']) && 0 != $responseData['err_no']) { if($retry <= 3) { $retry++; return self::uploadMedia($appId, $type, $fileUrl, $videoTitle, $videoDesc, $format, $retry); } else { # 重试几次还是失败了,要报警 EmailQueue::rPush('抖音小程序请求上传素材异常', json_encode([ 'app_id' => $appId, 'file_url' => $fileUrl, 'type' => $type, 'title' => $videoTitle, 'desc' => $videoDesc, 'uri' => $uri, 'body' => $params, 'response' => $responseData ], 1), ['song.shen@kuxuan-inc.com'], '抖音小程序'); } } return $responseData['data'] ?? []; } # 查询视频状态 public static function queryVideo($appId, $videoIdType, $openVideoId, $dyCloudId, $retry = 0) { $requestUrl = 'https://open.douyin.com'; $uri = config('douyin.queryVideo'); $accessToken = AccessTokenService::getAccessToken($appId); $header = [ 'access-token: '.$accessToken ]; $params = [ 'video_id_type' => $videoIdType, // 1通过open_video_id 查询 2通过抖音云的视频vid查询 'ma_app_id' => $appId, 'open_video_id' => $openVideoId, 'dy_cloud_id' => $dyCloudId ]; $responseData = self::commonRequest($appId, $requestUrl, $uri, 'POST', $params, $header); if(isset($responseData['err_no']) && 0 != $responseData['err_no']) { if($retry <= 3) { $retry++; return self::queryVideo($appId, $videoIdType, $openVideoId, $dyCloudId,$retry); } else { # 重试几次还是失败了,要报警 EmailQueue::rPush('抖音小程序获取视频状态结果异常', json_encode([ 'app_id' => $appId, 'type' => $videoIdType, 'open_video_id' => $openVideoId, 'dy_cloud_id' => $dyCloudId, 'uri' => $uri, 'body' => $params, 'response' => $responseData ], 1), ['song.shen@kuxuan-inc.com'], '抖音小程序'); } } return $responseData['data'] ?? []; } # 创建短剧 public static function createAlbum($appId, $title, $seqNum, $coverList, $year, $albumStatus, $recommendation , $desp, $tagList, $qualification, $recordInfo, $recordAuditInfo, $retry = 0) { $requestUrl = 'https://open.douyin.com'; $uri = config('douyin.createAlbum'); $accessToken = AccessTokenService::getAccessToken($appId); $header = [ 'access-token: '.$accessToken ]; $params = [ 'ma_app_id' => $appId, 'album_info' => [ 'title' => $title, 'seq_num' => $seqNum, 'cover_list' => $coverList, 'year' => $year, 'album_status' => $albumStatus,// 短剧更新状态 1未上映 2更新中 3已完结 'recommendation' => $recommendation, 'desp' => $desp, 'tag_list' => $tagList, 'qualification' => $qualification, // 资质状态 1未报审 2报审通过 3报审不通过 4不建议报审 ], ]; if(!empty($recordInfo)) { $params['album_info']['record_info'] = $recordInfo;// 备案信息(报审通过必填) } if(!empty($recordAuditInfo)) { # 备案审核信息 $params['album_info']['record_audit_info'] = $recordAuditInfo; } $responseData = self::commonRequest($appId, $requestUrl, $uri, 'POST', $params, $header); if(isset($responseData['err_no']) && 0 != $responseData['err_no']) { if($retry <= 3) { $retry++; return self::createAlbum($appId, $title, $seqNum, $coverList, $year, $albumStatus, $recommendation, $desp , $tagList, $qualification, $recordInfo, $recordAuditInfo, $retry); } else { # 重试几次还是失败了,要报警 EmailQueue::rPush('抖音小程序创建短剧结果异常', json_encode([ 'app_id' => $appId, 'title' => $title, 'seq_num' => $seqNum, 'cover_list' => $coverList, 'year' => $year, 'album_status' => $albumStatus,// 短剧更新状态 1未上映 2更新中 3已完结 'recommendation' => $recommendation, 'desp' => $desp, 'tag_list' => $tagList, 'qualification' => $qualification, // 资质状态 1未报审 2报审通过 3报审不通过 4不建议报审 'record_info' => $recordInfo, 'uri' => $uri, 'body' => $params, 'response' => $responseData ], 1), ['song.shen@kuxuan-inc.com'], '抖音小程序'); } } return $responseData['data'] ?? []; } public static function editAlbum($appId, $albumId, $title, $seqNum, $coverList, $year, $albumStatus, $recommendation , $desp, $tagList, $qualification, $recordInfo, $recordAuditInfo, $episodeInfoList, $retry = 0) { $requestUrl = 'https://open.douyin.com'; $uri = config('douyin.editAlbum'); $accessToken = AccessTokenService::getAccessToken($appId); $header = [ 'access-token: '.$accessToken ]; $params = [ 'ma_app_id' => $appId, 'album_id' => $albumId, 'album_info' => [ 'title' => $title, 'seq_num' => $seqNum, 'cover_list' => $coverList, 'year' => $year, 'album_status' => $albumStatus,// 短剧更新状态 1未上映 2更新中 3已完结 'recommendation' => $recommendation, 'desp' => $desp, 'tag_list' => $tagList, 'qualification' => $qualification, // 资质状态 1未报审 2报审通过 3报审不通过 4不建议报审 ], 'episode_info_list' => $episodeInfoList ]; if(!empty($recordInfo)) { $params['album_info']['record_info'] = $recordInfo;// 备案信息(报审通过必填) } if(!empty($recordAuditInfo)) { # 备案审核信息 $params['album_info']['record_audit_info'] = $recordAuditInfo; } $responseData = self::commonRequest($appId, $requestUrl, $uri, 'POST', $params, $header); if(isset($responseData['err_no']) && 0 != $responseData['err_no']) { if($retry <= 3) { $retry++; return self::editAlbum($appId, $albumId, $title, $seqNum, $coverList, $year, $albumStatus, $recommendation, $desp , $tagList, $qualification, $recordInfo, $recordAuditInfo, $episodeInfoList, $retry); } else { # 重试几次还是失败了,要报警 EmailQueue::rPush('抖音小程序编辑短剧结果异常', json_encode([ 'app_id' => $appId, 'album_id' => $albumId, 'title' => $title, 'seq_num' => $seqNum, 'cover_list' => $coverList, 'year' => $year, 'album_status' => $albumStatus,// 短剧更新状态 1未上映 2更新中 3已完结 'recommendation' => $recommendation, 'desp' => $desp, 'tag_list' => $tagList, 'qualification' => $qualification, // 资质状态 1未报审 2报审通过 3报审不通过 4不建议报审 'record_info' => $recordInfo, 'episode_info_list' => $episodeInfoList,// 剧集信息 'record_audit_info' => $recordAuditInfo, 'uri' => $uri, 'body' => $params, 'response' => $responseData ], 1), ['song.shen@kuxuan-inc.com'], '抖音小程序'); } } return $responseData['data'] ?? []; } public static function bindPage($appId, $singleSchemaBind, $schemaBindType, $retry = 0) { $requestUrl = 'https://open.douyin.com'; $uri = config('douyin.bindPage'); $accessToken = AccessTokenService::getAccessToken($appId); $header = [ 'access-token: '.$accessToken ]; $params = [ 'app_id' => $appId, 'schema_bind_type' => $schemaBindType, 'single_schema_bind' => $singleSchemaBind ]; $responseData = self::commonRequest($appId, $requestUrl, $uri, 'POST', $params, $header); if(isset($responseData['err_no']) && 0 != $responseData['err_no']) { if($retry <= 3) { $retry++; return self::bindPage($appId, $singleSchemaBind, $schemaBindType, $retry); } else { # 重试几次还是失败了,要报警 EmailQueue::rPush('抖音小程序短剧绑定页面结果异常', json_encode([ 'app_id' => $appId, 'schema_bind_type' => $schemaBindType, 'single_schema_bind' => $singleSchemaBind, 'uri' => $uri, 'body' => $params, 'response' => $responseData ], 1), ['song.shen@kuxuan-inc.com'], '抖音小程序'); } } return $responseData['data'] ?? []; } public static function albumAuth($maAppId, $appIdList, $albumId, $increment, $retry = 0) { $requestUrl = 'https://open.douyin.com'; $uri = config('douyin.albumAuth'); $accessToken = AccessTokenService::getAccessToken($maAppId); $header = [ 'access-token: '.$accessToken ]; $params = [ 'app_id' => $maAppId, 'app_id_list' => $appIdList, 'album_id' => $albumId, 'increment' => $increment ]; $responseData = self::commonRequest($maAppId, $requestUrl, $uri, 'POST', $params, $header); if(isset($responseData['err_no']) && 0 != $responseData['err_no']) { if($retry <= 3) { $retry++; return self::albumAuth($maAppId, $appIdList, $albumId, $increment, $retry); } else { # 重试几次还是失败了,要报警 EmailQueue::rPush('抖音小程序短剧授权结果异常', json_encode([ 'app_id' => $maAppId, 'app_id_list' => $appIdList, 'album_id' => $albumId, 'increment' => $increment, 'uri' => $uri, 'body' => $params, 'response' => $responseData ], 1), ['song.shen@kuxuan-inc.com'], '抖音小程序'); } } return $responseData['data'] ?? []; } public static function albumToExamine($appId, $albumId, $retry = 0) { $requestUrl = 'https://open.douyin.com'; $uri = config('douyin.albumExamine'); $accessToken = AccessTokenService::getAccessToken($appId); $header = [ 'access-token: '.$accessToken ]; $params = [ 'ma_app_id' => $appId, 'album_id' => $albumId, ]; $responseData = self::commonRequest($appId, $requestUrl, $uri, 'POST', $params, $header); if(isset($responseData['err_no']) && 0 != $responseData['err_no']) { if($retry <= 3) { $retry++; return self::albumToExamine($appId, $albumId, $retry); } else { # 重试几次还是失败了,要报警 EmailQueue::rPush('抖音小程序短剧送审结果异常', json_encode([ 'app_id' => $appId, 'album_id' => $albumId, 'uri' => $uri, 'body' => $params, 'response' => $responseData ], 1), ['song.shen@kuxuan-inc.com'], '抖音小程序'); } } return $responseData['data'] ?? []; } public static function albumOnline($appId, $albumId, $operate, $version, $retry = 0) { $requestUrl = 'https://open.douyin.com'; $uri = config('douyin.albumOnline'); $accessToken = AccessTokenService::getAccessToken($appId); $header = [ 'access-token: '.$accessToken ]; $params = [ 'operate' => $operate, 'album_id' => $albumId, 'version' => $version, ]; $responseData = self::commonRequest($appId, $requestUrl, $uri, 'POST', $params, $header); if(isset($responseData['err_no']) && 0 != $responseData['err_no']) { if($retry <= 3) { $retry++; return self::albumOnline($appId, $albumId, $operate, $version, $retry); } else { # 重试几次还是失败了,要报警 EmailQueue::rPush('抖音小程序短剧上线结果异常', json_encode([ 'app_id' => $appId, 'album_id' => $albumId, 'operate' => $operate, 'version' => $version, 'uri' => $uri, 'body' => $params, 'response' => $responseData ], 1), ['song.shen@kuxuan-inc.com'], '抖音小程序'); } } return $responseData['data'] ?? []; } public static function albumFetch($appId, $queryType, $batchQuery, $singleQuery, $detailQuery, $retry = 0) { $requestUrl = 'https://open.douyin.com'; $uri = config('douyin.albumFetch'); $accessToken = AccessTokenService::getAccessToken($appId); $header = [ 'access-token: '.$accessToken ]; $params = [ 'ma_app_id' => $appId, 'query_type' => $queryType, ]; if($batchQuery) { $params['batch_query'] = $batchQuery; } if($singleQuery) { $params['single_query'] = $singleQuery; } if($detailQuery) { $params['detail_query'] = $detailQuery; } $responseData = self::commonRequest($appId, $requestUrl, $uri, 'POST', $params, $header); if(isset($responseData['err_no']) && 0 != $responseData['err_no']) { if($retry <= 3) { $retry++; return self::albumFetch($appId, $queryType, $batchQuery, $singleQuery, $detailQuery, $retry); } else { # 重试几次还是失败了,要报警 EmailQueue::rPush('抖音小程序短剧查询果异常', json_encode([ 'app_id' => $appId, 'query_type' => $queryType, 'batch_query' => $batchQuery , 'single_query' => $singleQuery, 'detail_query' => $detailQuery, 'uri' => $uri, 'body' => $params, 'response' => $responseData ], 1), ['song.shen@kuxuan-inc.com'], '抖音小程序'); } } return $responseData['data'] ?? []; } public static function getCustomerServiceList($appId, $pageNum, $pageSize, $type, $retry = 0) { $requestUrl = 'https://open.douyin.com'; $uri = config('douyin.customerService'); $accessToken = AccessTokenService::getAccessToken($appId); $header = [ 'access-token: '.$accessToken ]; $params = [ 'page_num' => $pageNum, 'page_size'=> $pageSize, 'type' => $type ]; $uri = $uri.'?'.http_build_query($params); $responseData = self::commonRequest($appId, $requestUrl, $uri, 'GET', [], $header); if(isset($responseData['err_no']) && 0 != $responseData['err_no']) { if($retry <= 3) { $retry++; return self::getCustomerServiceList($appId, $pageNum, $pageSize, $type, $retry); } else { # 重试几次还是失败了,要报警 EmailQueue::rPush('抖音小程序短剧绑定抖音号结果异常', json_encode([ 'app_id' => $appId, 'page_num' => $pageNum, 'page_size' => $pageSize,'type' => $type, 'uri' => $uri, 'body' => $params, 'response' => $responseData ], 1), ['song.shen@kuxuan-inc.com'], '抖音小程序'); } } return $responseData['data'] ?? []; } # 查询广告位列表 public static function syncAdPlacement($appId, $retry = 0) { $requestUrl = 'https://open.douyin.com'; $uri = config('douyin.adPlacementQuery'); $accessToken = AccessTokenService::getAccessToken($appId); $header = [ 'access-token: '.$accessToken ]; $responseData = self::commonRequest($appId, $requestUrl, $uri, 'GET', [], $header); if(isset($responseData['err_no']) && !in_array($responseData['err_no'], [0, 28005042])) {# 尚未开通流量主 if($retry <= 3) { $retry++; return self::syncAdPlacement($appId, $retry); } else { # 重试几次还是失败了,要报警 EmailQueue::rPush('抖音小程序广告位列表结果异常', json_encode([ 'app_id' => $appId, 'uri' => $uri, 'response' => $responseData ], 1), ['song.shen@kuxuan-inc.com'], '抖音小程序'); } } return $responseData['data'] ?? []; } # 添加广告位 public static function adPlacementAdd($appId, $adType, $adName, $retry = 0) { $requestUrl = 'https://open.douyin.com'; $uri = config('douyin.adPlacementAdd'); $accessToken = AccessTokenService::getAccessToken($appId); $header = [ 'access-token: '.$accessToken, 'content-type: application/json' ]; $params = [ 'ad_placement_name' => $adName, 'ad_placement_type' => $adType ]; $responseData = self::commonRequest($appId, $requestUrl, $uri, 'POST', $params, $header); if(isset($responseData['err_no']) && !in_array($responseData['err_no'], [0, 28005042])) {# 尚未开通流量主 if($retry <= 3) { $retry++; return self::adPlacementAdd($appId, $adType, $adName, $retry); } else { # 重试几次还是失败了,要报警 EmailQueue::rPush('抖音小程序添加广告位结果异常', json_encode([ 'app_id' => $appId, 'ad_type' => $adType, 'ad_name' => $adName, 'uri' => $uri, 'response' => $responseData ], 1), ['song.shen@kuxuan-inc.com'], '抖音小程序'); } } return (0 == $responseData['err_no']); } public static function adPlacementUpdate($appId, $adPlacementId, $status, $retry = 0) { $requestUrl = 'https://open.douyin.com'; $uri = config('douyin.adPlacementUpdate'); $accessToken = AccessTokenService::getAccessToken($appId); $header = [ 'access-token: '.$accessToken ]; $params = [ 'ad_placement_id' => $adPlacementId, 'status' => $status ]; $responseData = self::commonRequest($appId, $requestUrl, $uri, 'POST', $params, $header); if(isset($responseData['err_no']) && !in_array($responseData['err_no'], [0, 28005042])) {# 尚未开通流量主 if($retry <= 3) { $retry++; return self::adPlacementUpdate($appId, $adPlacementId, $status, $retry); } else { # 重试几次还是失败了,要报警 EmailQueue::rPush('抖音小程序更新广告位状态结果异常', json_encode([ 'app_id' => $appId, 'ad_placement_id' => $adPlacementId, 'status' => $status, 'uri' => $uri, 'response' => $responseData ], 1), ['song.shen@kuxuan-inc.com'], '抖音小程序'); } } return (0 == $responseData['err_no']); } }