diff --git a/app/event/GoogleAdsCustomers.php b/app/event/GoogleAdsCustomers.php index d874dd1..9ed2660 100644 --- a/app/event/GoogleAdsCustomers.php +++ b/app/event/GoogleAdsCustomers.php @@ -33,6 +33,7 @@ class GoogleAdsCustomers private $googleAdsAccountService; const event = 'googleads:customers:event'; + const newbind_event = 'googleads:customers:newbind:event'; const add_queue = 'googleads:customers:add:queue'; const init_queue = 'googleads:customers:init:queue'; @@ -100,11 +101,11 @@ class GoogleAdsCustomers return; } $refresh_token = $options['refresh_token']; - $access_token = $options['access_token']; + $access_token = $options['access_token']; $merchant_id = $options['merchant_id']; - $user_id = $options['user_id']; + $user_id = $options['user_id']; //dump($refresh_token,$merchant_id,$access_token,9999999); - $googleAdsAccounts = $this->getAccountHierarchyForBind($options); + $googleAdsAccounts = $this->getAccountHierarchyForBind($options); // dump($googleAdsAccounts, 555); // 初始化返回结果数组 $ad_accounts = []; @@ -145,6 +146,50 @@ class GoogleAdsCustomers } + //每分钟定时轮询缓存是否有新的广告账号需要绑定-荣洁set缓存 + public function newBindAccount() + { + $redisKey = 'bps:ads:new_bind_account'; //$options['token'] 即uuid 例如:f47ac10b-58cc-4372-a567-0e02b2c3d479 + // 获取哈希表所有字段和值 + $hashData = Redis::hGetAll($redisKey); + if (empty($hashData)) { + dump('no pending bindings accounts'); + return; + } + foreach ($hashData as $uuid => $bindingStr) { + // 解析商户ID和账户列表 格式:"merchantId_platform_account1,account2" + [$merchantId, $platform, $accountsStr] = explode('_', $bindingStr, 3); + if((int)$platform !== 2){ + continue; + } + // 需要实际数据来源 + $bindAccounts = explode(',', $accountsStr); + foreach ($bindAccounts as $account) { + $data = [ + 'merchant_id' => $merchantId, // 分离商户ID + 'account_id' => $account + ]; + $this->googleOAuthService->queueNew($data); + } + // 处理完成后删除哈希字段 + Redis::hDel($redisKey, $uuid); + } + return $this->successResponse(['success' => 'new binded accounts queued for initialization.']); + } + + // 没调用 管理用户访问权限 + public function accountAccess(Request $request) + { + $options = $request->all(); + + $options['refresh_token'] = $request->refresh_token; + $options['login_customer_id'] = $request->login_customer_id; + + // 继续处理 Google Ads API 操作 + return $this->getAccountAccess($options); + } + + /** * 绑定接口-广告主体下层级账号 * @throws ApiException diff --git a/app/process/UpdateGoogleAdsTask.php b/app/process/UpdateGoogleAdsTask.php index 89ae8fa..c33eefd 100644 --- a/app/process/UpdateGoogleAdsTask.php +++ b/app/process/UpdateGoogleAdsTask.php @@ -24,6 +24,8 @@ class UpdateGoogleAdsTask public function onWorkerStart() { + define('CURRENT_TIME', date('Y-m-d H:i:s')); + // 每15分钟执行一次 new Crontab('2 2 0 * * *', function () { @@ -74,17 +76,17 @@ class UpdateGoogleAdsTask // 每15分钟执行一次 new Crontab('30 2 */12 * * *', function () { - dump(date('Y-m-d H:i:s') . '更新' . GoogleAdsGroups::event . '开始'); + dump(CURRENT_TIME . '更新' . GoogleAdsGroups::event . '开始'); Event::emit(GoogleAdsGroups::event, []); - dump(date('Y-m-d H:i:s') . '更新' . GoogleAdsCampaigns::event . '开始'); + dump(CURRENT_TIME . '更新' . GoogleAdsCampaigns::event . '开始'); Event::emit(GoogleAdsCampaigns::event, []); } ); // 每15分钟执行一次 new Crontab('5 2 */12 * * *', function () { - dump(date('Y-m-d H:i:s') . '更新' . GoogleAdsAds::event . '开始'); + dump(CURRENT_TIME . '更新' . GoogleAdsAds::event . '开始'); Event::emit(GoogleAdsAds::event, []); } @@ -92,25 +94,31 @@ class UpdateGoogleAdsTask // 每15分钟执行一次 new Crontab('1 2 */12 * * *', function () { - dump(date('Y-m-d H:i:s') . '更新' . GoogleAdsCreatives::event . '开始'); + dump(CURRENT_TIME . '更新' . GoogleAdsCreatives::event . '开始'); Event::emit(GoogleAdsCreatives::event, []); } ); new Crontab('25 11 */12 * * *', function () { - dump(date('Y-m-d H:i:s') . '更新' . GoogleAdsAssets::event . '开始'); + dump(CURRENT_TIME . '更新' . GoogleAdsAssets::event . '开始'); Event::emit(GoogleAdsAssets::event, []); } ); new Crontab('16 */1 * * * *', function () { - dump(date('Y-m-d H:i:s') . '更新' . GoogleAdsCustomers::event . '开始'); + dump(CURRENT_TIME . '更新' . GoogleAdsCustomers::event . '开始'); Event::emit(GoogleAdsCustomers::event, []); } ); + new Crontab('3 */1 * * * *', function () { + dump(CURRENT_TIME . '更新' . GoogleAdsCustomers::newbind_event . '开始'); + Event::emit(GoogleAdsCustomers::newbind_event, []); + }); + + //临时调试shopify店铺定时任务 // new Crontab('*/20 * * * * *', function () { -// dump(date('Y-m-d H:i:s') . '更新' . ShopifyOrders::event . '开始'); +// dump(CURRENT_TIME . '更新' . ShopifyOrders::event . '开始'); // Event::emit(ShopifyOrders::event, ['storeName' => 'fefc94-67', 'token' => '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']); // PSA shop // Event::emit(ShopifyOrders::event, ['storeName' => 'aeb0e7-b3', 'token' => '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']);// VIVI shop // } @@ -119,20 +127,20 @@ class UpdateGoogleAdsTask // 每15分钟执行一次 // new Crontab('58 */15 * * * *', function () { -// dump(date('Y-m-d H:i:s') . '更新' . GoogleAdsCampaigns::type . '开始'); +// dump(CURRENT_TIME . '更新' . GoogleAdsCampaigns::type . '开始'); // Event::emit(GoogleAdsCampaigns::type, ['customer_id'=>4060397299]); // // }); // 每30分钟执行一次 // new Crontab('0 */30 * * * *', function () { -// dump(date('Y-m-d H:i:s') . '更新' . V2ex::type . '开始'); +// dump(CURRENT_TIME . '更新' . V2ex::type . '开始'); // Event::emit(V2ex::type, null); // -// dump(date('Y-m-d H:i:s') . '更新' . GitHub::type . '开始'); +// dump(CURRENT_TIME . '更新' . GitHub::type . '开始'); // Event::emit(GitHub::type, null); // -// dump(date('Y-m-d H:i:s') . '更新' . JueJin::type . '开始'); +// dump(CURRENT_TIME . '更新' . JueJin::type . '开始'); // Event::emit(JueJin::type, null); // }); diff --git a/app/service/GoogleOAuthService.php b/app/service/GoogleOAuthService.php index 5ebe3a0..051feb9 100644 --- a/app/service/GoogleOAuthService.php +++ b/app/service/GoogleOAuthService.php @@ -32,7 +32,7 @@ class GoogleOAuthService $client = new Client(); try { - $options = [ + $options = [ "headers" => [ 'Authorization' => 'Bearer ' . $accessToken, ], @@ -186,14 +186,48 @@ class GoogleOAuthService // dump($sql,$data); ThinkDb::execute($sql, $data); } +//没调用 +// public function updateAdsMerchantRelation($data,$sendMq = 0) +// { +// $tableName = 'bps_ads_merchant_relation'; +// $tableName = getenv('DB_PG_SCHEMA') ? getenv('DB_PG_SCHEMA') . '.' . $tableName : 'bps.' . $tableName; +// +// $sql = " +// UPDATE {$tableName} +// SET +// user_id = :user_id, +// is_unbind = :is_unbind, +// updated_at = CURRENT_TIMESTAMP +// WHERE +// platform = 2 +// AND merchant_id = :merchant_id +// AND account_id = :account_id +// "; +// +// ThinkDb::execute($sql, [ +// 'user_id' => (string)$data['user_id'], +// 'is_unbind' => $data['is_unbind'] ?? 'f', +// 'merchant_id' => (string)$data['merchant_id'], +// 'account_id' => (string)$data['account_id'], +// 'user_id' => (string)$data['user_id'], +// ]); +// +// // 如果需要发送队列 +// if ($sendMq == 1) { +// $this->queueNew([ +// 'merchant_id' => $data['merchant_id'], +// 'account_id' => $data['account_id'] +// ]); +// } +// } //保存或更新某个主体部广告账号 - public function saveThirdUserAdvertiserNew($data,$sendMq = 0) + public function saveThirdUserAdvertiserNew($data, $sendMq = 0) { // 确保 account_id 和 merchant_id 是字符串 $data['account_id'] = (string)$data['account_id']; $data['merchant_id'] = (string)$data['merchant_id']; - $data['user_id'] = (string)$data['user_id']; + $data['user_id'] = (string)$data['user_id']; $tableName = 'bps_ads_merchant_relation'; $tableName = getenv('DB_PG_SCHEMA') ? getenv('DB_PG_SCHEMA') . '.' . $tableName : 'bps.' . $tableName; @@ -208,10 +242,10 @@ class GoogleOAuthService 'refresh_token' => $data['refresh_token'], 'account_name' => $data['account_name'], 'currency' => $data['currency'], - 'platform_user_id' => $data['platform_user_id']??'', - 'platform_user_name' => $data['platform_user_name']??'', - 'is_unbind' => $data['is_unbind']??'f', - 'ext_info' => $data['ext_info']??'{}', + 'platform_user_id' => $data['platform_user_id'] ?? '', + 'platform_user_name' => $data['platform_user_name'] ?? '', + 'is_unbind' => $data['is_unbind'] ?? 'f', + 'ext_info' => $data['ext_info'] ?? '{}', ]; // dump($insertData,2525); // 构造SQL语句 @@ -238,14 +272,14 @@ class GoogleOAuthService // dump(ThinkDb::getLastSql(),2525); //如果要异步更新改广告账号数据的话。 - if($sendMq == 1){ + if ($sendMq == 1) { // Event::emit(GoogleAdsCustomers::add_queue, $data); - $options = []; + $options = []; $options['merchant_id'] = $data['merchant_id']; $options['account_id'] = $data['account_id']; // $options['refresh_token'] = $data['refresh_token']; // $options['login_customer_id'] = json_decode($data['ext_info'],true)['login_customer_id']??''; - $this->queueNew($options); + $this->queueNew($options); } } @@ -319,7 +353,7 @@ class GoogleOAuthService $this->queue($options); } - public function saveRefreshTokenNew($refreshToken,$accessToken, $merchantId,$userId) + public function saveRefreshTokenNew($refreshToken, $accessToken, $merchantId, $userId) { $data = [ 'refresh_token' => $refreshToken, @@ -356,7 +390,7 @@ class GoogleOAuthService ]); // 在数据库中删除或标记该`access_token(其实是refresh_token)`为无效 - BpsAdsMerchantRelation::where('merchant_id', $merchantId)->where('platform',2)->delete(); + BpsAdsMerchantRelation::where('merchant_id', $merchantId)->where('platform', 2)->delete(); // // $tableName = 'bps_third_user'; // $tableName = getenv('DB_PG_SCHEMA') ? getenv('DB_PG_SCHEMA') . '.' . $tableName : 'bps' . $tableName; diff --git a/config/event.php b/config/event.php index 5da5b95..ca47464 100644 --- a/config/event.php +++ b/config/event.php @@ -78,6 +78,9 @@ return [ GoogleAdsCustomers::event => [ [GoogleAdsCustomers::class, 'addRootCustomersNew'], ], + GoogleAdsCustomers::newbind_event => [ + [GoogleAdsCustomers::class, 'newBindAccount'], + ], GoogleAdsCustomers::add_queue => [ [GoogleAdsCustomers::class, 'addRootCustomersNew'], ],