customerId = getenv('GOOGLE_ADS_CUSTOMER_ID'); // // // OAuth2 Token Authentication // $oAuth2Credential = (new OAuth2TokenBuilder())->fromFile()->build(); // // // Google Ads Client initialization // $this->googleAdsClient = (new GoogleAdsClientBuilder()) // ->fromFile() // ->withOAuth2Credential($oAuth2Credential) // ->build(); } /** * Runs the example. * * @param GoogleAdsClient $googleAdsClient the Google Ads API client */ // [START list_accessible_customers] public static function runListAccessibleCustomers() { // Creates a client with the manager customer ID as login customer ID. $googleAdsClient = self::createGoogleAdsClient(0); $customerServiceClient = $googleAdsClient->getCustomerServiceClient(); // Issues a request for listing all accessible customers. $accessibleCustomers = $customerServiceClient->listAccessibleCustomers(new ListAccessibleCustomersRequest()); print 'Total results: ' . count($accessibleCustomers->getResourceNames()) . PHP_EOL; $resourceNameArray = []; // Iterates over all accessible customers' resource names and prints them. foreach ($accessibleCustomers->getResourceNames() as $resourceName) { /** @var string $resourceName */ printf("Customer resource name: '%s'%s", $resourceName, PHP_EOL); $resourceNameArray[] = $resourceName; } return $resourceNameArray; } // [END list_accessible_customers] /** * Runs the example. * * @param $options * This example assumes that the same credentials will work for both customers, * but that may not be the case. If you need to use different credentials * for each customer, then you may either update the client configuration or * instantiate the clients accordingly, one for each set of credentials. Always make * sure to update the configuration before fetching any services you need to use. * // * @return mixed * @throws ApiException */ public function runLinkManagerToClient($options) { // Extends an invitation to the client while authenticating as the manager. $managerCustomerId = $options['manager_customer_id']; $clientCustomerId = $options['client_customer_id']; // Extends an invitation to the client while authenticating as the manager. $customerClientLinkResourceName = self::createInvitation( $managerCustomerId, $clientCustomerId ); // Retrieves the manager link information. $managerLinkResourceName = self::getManagerLinkResourceName( $managerCustomerId, $clientCustomerId, $customerClientLinkResourceName ); // Accepts the manager's invitation while authenticating as the client. return self::acceptInvitation($clientCustomerId, $managerLinkResourceName); } /** * Extends an invitation from a manager customer to a client customer. * * @param int $managerCustomerId the manager customer ID * @param int $clientCustomerId the customer ID * @return string the resource name of the customer client link created for the invitation */ private static function createInvitation( int $managerCustomerId, int $clientCustomerId ) { // Creates a client with the manager customer ID as login customer ID. $googleAdsClient = self::createGoogleAdsClient($managerCustomerId); // Creates a customer client link. $customerClientLink = new CustomerClientLink([ // Sets the client customer to invite. 'client_customer' => ResourceNames::forCustomer($clientCustomerId), 'status' => ManagerLinkStatus::PENDING ]); // Creates a customer client link operation for creating the one above. $customerClientLinkOperation = new CustomerClientLinkOperation(); $customerClientLinkOperation->setCreate($customerClientLink); // Issues a mutate request to create the customer client link. $customerClientLinkServiceClient = $googleAdsClient->getCustomerClientLinkServiceClient(); $response = $customerClientLinkServiceClient->mutateCustomerClientLink( MutateCustomerClientLinkRequest::build( $managerCustomerId, $customerClientLinkOperation ) ); // Prints the result. $customerClientLinkResourceName = $response->getResult()->getResourceName(); printf( "An invitation has been extended from the manager customer %d" . " to the client customer %d with the customer client link resource name '%s'.%s", $managerCustomerId, $clientCustomerId, $customerClientLinkResourceName, PHP_EOL ); // Returns the resource name of the created customer client link. return $customerClientLinkResourceName; } /** * Retrieves the manager link resource name of a customer client link given its resource name. * * @param int $managerCustomerId the manager customer ID * @param int $clientCustomerId the customer ID * @param string $customerClientLinkResourceName the customer client link resource name * @return string the manager link resource name */ private static function getManagerLinkResourceName( int $managerCustomerId, int $clientCustomerId, string $customerClientLinkResourceName ) { // Creates a client with the manager customer ID as login customer ID. $googleAdsClient = self::createGoogleAdsClient($managerCustomerId); // Creates the query. $query = "SELECT customer_client_link.manager_link_id FROM customer_client_link" . " WHERE customer_client_link.resource_name = '$customerClientLinkResourceName'"; // Issues a search request. $googleAdsServiceClient = $googleAdsClient->getGoogleAdsServiceClient(); $response = $googleAdsServiceClient->search( SearchGoogleAdsRequest::build($managerCustomerId, $query) ); // Gets the ID and resource name associated to the manager link found. $managerLinkId = $response->getIterator()->current() ->getCustomerClientLink() ->getManagerLinkId(); $managerLinkResourceName = ResourceNames::forCustomerManagerLink( $clientCustomerId, $managerCustomerId, $managerLinkId ); // Prints the result. printf( "Retrieved the manager link of the customer client link:" . " its ID is %d and its resource name is '%s'.%s", $managerLinkId, $managerLinkResourceName, PHP_EOL ); // Returns the resource name of the manager link found. return $managerLinkResourceName; } /** * Accepts an invitation. * * @param int $clientCustomerId the customer ID * @param string $managerLinkResourceName the resource name of the manager link to accept */ private static function acceptInvitation( int $clientCustomerId, string $managerLinkResourceName ) { // Creates a client with the client customer ID as login customer ID. $googleAdsClient = self::createGoogleAdsClient($clientCustomerId); // Creates the customer manager link with the updated status. $customerManagerLink = new CustomerManagerLink(); $customerManagerLink->setResourceName($managerLinkResourceName); $customerManagerLink->setStatus(ManagerLinkStatus::ACTIVE); // Creates a customer manager link operation for updating the one above. $customerManagerLinkOperation = new CustomerManagerLinkOperation(); $customerManagerLinkOperation->setUpdate($customerManagerLink); $customerManagerLinkOperation->setUpdateMask( FieldMasks::allSetFieldsOf($customerManagerLink) ); // Issues a mutate request to update the customer manager link. $customerManagerLinkServiceClient = $googleAdsClient->getCustomerManagerLinkServiceClient(); $response = $customerManagerLinkServiceClient->mutateCustomerManagerLink( MutateCustomerManagerLinkRequest::build( $clientCustomerId, [$customerManagerLinkOperation] ) ); // Prints the result. printf( "The client %d accepted the invitation with the resource name '%s'.%s", $clientCustomerId, $response->getResults()[0]->getResourceName(), PHP_EOL ); return $response->getResults()[0]->getResourceName(); } // [END link_manager_to_client] /** * Creates a Google Ads client based on the default configuration file * and a given login customer id. * * @param int $loginCustomerId the login customer ID * @return GoogleAdsClient the created client */ private static function createGoogleAdsClient(int $loginCustomerId) { $advertiserId = getenv('GOOGLE_ADS_CUSTOMER_ID'); // 从数据库获取 access_token $refreshToken = self::getRefreshTokenFromDatabase($advertiserId); if (!$refreshToken) { throw new \Exception("Access token not found for advertiserId: " . $advertiserId); } // OAuth2 Token Authentication $oAuth2Credential = (new OAuth2TokenBuilder()) ->fromFile() // 如果需要从文件获取其他配置,可以继续使用 fromFile() ->withRefreshToken($refreshToken) // 使用动态获取的 access_token ->build(); if ($loginCustomerId > 0) { // Builds and returns the Google Ads client return ( new GoogleAdsClientBuilder()) // Sets the properties based on the default properties file ->fromFile() // eUses the OAuth2 credentials crated above. ->withOAuth2Credential($oAuth2Credential) // Overrides the login customer ID with the given one. ->withLoginCustomerId($loginCustomerId) ->build(); } else { // Builds and returns the Google Ads client return (new GoogleAdsClientBuilder()) // Sets the properties based on the default properties file ->fromFile() // eUses the OAuth2 credentials crated above. ->withOAuth2Credential($oAuth2Credential) // Overrides the login customer ID with the given one. ->build(); } } // 从数据库动态获取 google RefreshToken private function getRefreshTokenFromDatabase($advertiserId) { // 使用 ThinkDb 进行联表查询 // $advertiserId = 'your-advertiser-id'; // 假设你已经获得了广告商ID $user = ThinkDb::table('bps.bps_third_user_advertiser as a') ->join('bps_third_user as u', 'a.doc_ = u.id', 'left') // 连接 bps_third_user 表 ->where('a.advertiser_id', $advertiserId) ->select('u.access_token') // 只选择 access_token 字段 ->first(); return $user ? $user->access_token : null; } }