name('ad_advertiser_app')->select()->toArray(); $Account = array_column($Account, null, 'id'); // 1. 根据cmid获取appid和secret $appId = $Account[$cmid]['app_id']; $secret = $Account[$cmid]['app_secret']; $tokenUrl = $Account[$cmid]['token_url']; // 2. 授权access_token 和 refresh_token $url = $tokenUrl; $header = ['Content-Type: application/json']; $request_data = json_encode([ 'app_id'=>$appId, 'secret'=>$secret, 'grant_type'=>'auth_code', 'auth_code'=>$authCode, ]); $httpClient = new Client(['timeout' => 10]); $res = $httpClient->request('POST', $url, [ 'json' => $request_data, 'headers' => $header, ]); $result = json_decode($res->getBody(), true); $data = $result['data'] ?? []; // 执行验证callback, 返回授权后的字段,跟数据库对应 return [ "advertiser_id" => $data['advertiser_id'], "advertiser_ids" => $data['advertiser_ids'], "access_token" => $data['access_token'], "refresh_token" => $data['refresh_token'], "refresh_token_expires_in" => $data['refresh_token_expires_in'], "expires_in" => $data['expires_in'], "cmid" => $cmid, ]; } // 写入授权结果 public function writeOAuthResult($data) { // 写入ad_advertiser_bm表 if ($data['access_token']){ $accounts = $data['advertiser_ids']; foreach($accounts as $account_id){ $record = Db::connect('db_advert')->name('ad_advertiser_bm') ->where('advertiser_id', $account_id) ->find(); if (!$record){ $record = [ 'advertiser_id' => $account_id, 'advertiser_name' => $account_id, 'access_token' => $data['access_token'], 'refresh_token' => $data['refresh_token'], ]; Db::connect('db_advert')->name('ad_advertiser_bm')->insert($record); }else{ Db::connect('db_advert')->name('ad_advertiser_bm')->where('advertiser_id', $account_id)->update([ 'access_token' => $data['access_token'], 'refresh_token' => $data['refresh_token'], 'advertiser_id' => $account_id, 'advertiser_name' => $account_id, ]); } } } } // 获取子账号列表 public function getSubAccounts($oathInfo) { $advertiserId = $oathInfo['advertiser_id']; $accessToken = $oathInfo['access_token']; $appId = $oathInfo['app_id']; // 根据授权返回的 advertiser_id 和 access_token 获取子账号列表 $url = 'https://ad.oceanengine.com/open_api/2/majordomo/advertiser/select/'; $header = [ 'Access-Token' => $accessToken, 'Content-Type' => 'application/json', ]; $requestData = [ 'advertiser_id' => $advertiserId, ]; $url = $url."?".http_build_query($requestData); $httpClient = new Client(['timeout' => 10]); $res = $httpClient->request('GET', $url, [ 'headers' => $header, ]); $result = json_decode($res->getBody(), true); $list = $result['data']['list'] ?? []; $toutiaoAccountList = Db::connect('db_advert')->name('ad_advertiser_list')->where('media_id', 1)->select()->toArray(); $toutiaoAccountMap = array_column($toutiaoAccountList, null, 'advertiser_id'); foreach($list as $val){ if(!isset($toutiaoAccountMap[$val['advertiser_id']])){ Db::connect('db_advert')->name('ad_advertiser_list')->insert([ 'advertiser_id' => $val['advertiser_id'], 'advertiser_name' => $val['advertiser_name'], 'app_id'=>$appId, 'bmid' => $advertiserId, 'media_id' => 1, ]); } } } // 刷新 token public function refreshToken($data) { $cmid = $data['cmid']; $advertiserId = $data['advertiser_id']; $accountApp = Db::connect('db_advert')->name('ad_advertiser_app')->where('id', $cmid)->find(); $refreshToken = Db::connect('db_advert')->name('ad_advertiser_bm')->where('advertiser_id', $advertiserId)->value('refresh_token'); if($refreshToken){ $url = $accountApp['refresh_url']; $header = ['Content-Type: application/json']; $request_data = json_encode([ 'app_id'=>$accountApp['app_id'], 'secret'=>$accountApp['app_secret'], 'grant_type'=>'refresh_token', 'refresh_token'=>$refreshToken ]); $httpClient = new Client(['timeout' => 10]); $res = $httpClient->request('POST', $url, [ 'json' => $request_data, 'headers' => $header, ]); $result = json_decode($res->getBody(), true); $data = $result['data'] ?? []; // 更新管家的token相关 if ($data['access_token']){ Db::connect('db_advert')->name('ad_advertiser_bm')->where('advertiser_id', $advertiserId)->update([ 'access_token' => $data['access_token'], 'refresh_token' => $data['refresh_token'], 'refresh_token_expires_in' => $data['refresh_token_expires_in'], 'expires_in' => $data['expires_in'], ]); } } return $data; } // 获取小时消耗 public function getHourlyCost($advertiserId, $accessToken, $date): array { $page = 1; $data = []; do { $url = 'https://ad.oceanengine.com/open_api/v3.0/report/custom/get/'; $request_data = [ 'advertiser_id'=>$advertiserId, 'dimensions'=>json_encode(["cdp_project_id","cdp_project_name","ad_platform_cdp_project_action_track_url","ad_platform_cdp_project_download_url","stat_time_hour"]), 'metrics'=>json_encode(["stat_cost","show_cnt","click_cnt","convert_cnt"]), 'filters'=>'[{"operator":4,"values":["0"],"field":"stat_cost","type":3}]', 'start_time'=>$date, 'end_time'=>$date, 'order_by'=>json_encode([]), 'page'=>$page, 'page_size'=>100, ]; $options = [ "headers" => [ 'Access-Token' => $accessToken, 'Content-Type' => 'application/json', ] ]; $url = $url."?".http_build_query($request_data); $httpClient = new Client(['timeout' => 10]); $res = $httpClient->request('GET', $url, $options); $result = json_decode($res->getBody(), true); if (empty($result['data']['rows'])) { break; } $data = array_merge($data, $result['data']['rows']); $totalPage = $result['data']['page_info']['total_page'] ?? 1; $page++; } while ($page <= $totalPage); return $data; } // 获取媒体消耗 public function getVideoCost($advertiserId, $accessToken, $date): array { $page = 1; $data = []; do { $url = 'https://ad.oceanengine.com/open_api/v3.0/report/custom/get/'; $request_data = [ 'advertiser_id'=>$advertiserId, 'dimensions'=>json_encode(["ad_platform_material_name","material_id","cdp_project_id","cdp_project_name","stat_time_day", "ad_platform_cdp_project_action_track_url"]), 'metrics'=>json_encode(["stat_cost","show_cnt","click_cnt","active","active_register","active_pay","valid_play","download_finish_cnt","total_play", "stat_pay_amount"]), 'filters'=>'[{"field":"image_mode","type":1,"operator":0,"values":["5","15"]},{"operator":4,"values":["0"],"field":"stat_cost","type":3}]', 'start_time'=>$date, 'end_time'=>$date, 'order_by'=>json_encode([]), 'page'=>1, 'page_size'=>100, ]; $options = [ "headers" => [ 'Access-Token' => $accessToken, 'Content-Type' => 'application/json', ] ]; $url = $url."?".http_build_query($request_data); $httpClient = new Client(['timeout' => 10]); $res = $httpClient->request('GET', $url, $options); $result = json_decode($res->getBody(), true); if (empty($result['data']['rows'])) { break; } $data = array_merge($data, $result['data']['rows']); $totalPage = $result['data']['page_info']['total_page'] ?? 1; $page++; } while ($page <= $totalPage); return $data; } public function getVideo($advertiserId, $accessToken, $materialIds): array { $url = 'https://api.oceanengine.com/open_api/2/file/video/get/'; $request_data = [ 'advertiser_id'=>$advertiserId, 'filtering' => json_encode([ "material_ids" => $materialIds, ]), ]; $options = [ "headers" => [ 'Access-Token' => $accessToken, 'Content-Type' => 'application/json', ] ]; $url = $url."?".http_build_query($request_data); $httpClient = new Client(['timeout' => 10]); $res = $httpClient->request('GET', $url, $options); $result = json_decode($res->getBody(), true); return $result['data']['list'] ?? []; } }