We are trying to use *LinkManagerToClient.php* to link agency to the agency client. Explanation of the 3 accounts: [image: ice_screenshot_20200621-170857.png] <about:invalid#zClosurez>
Agency and client already gave us permission for https://www.googleapis.com/auth/adwords scope with *AuthenticateInWebApplication.php*. This article CustomerManagerLinkService <https://developers.google.com/google-ads/api/reference/rpc/v3/CustomerManagerLinkService> doesn't have enough information about what we should specify in *google_ads_php.ini*. Inside *google_ads_php.ini *is our developerToken for Google Ads Manager Account 3191377543 and [OAUTH2] also for 3191377543 account. How we can use *LinkManagerToClient.php* to give agency access to his client with our Basic Access Developer token? [image: ice_screenshot_20200621-171315.png] <about:invalid#zClosurez> Current error: Fatal error: Uncaught Google\ApiCore\ApiException: { "message": "The caller does not have permission", "code": 7, "status": "PERMISSION_DENIED", "details": [ { "@type": 0, "data": "type.googleapis.com\/google.ads.googleads.v2.errors.GoogleAdsFailure" }, { "@type": 0, "data": [ { "errorCode": { "authorizationError": "USER_PERMISSION_DENIED" }, "message": "User doesn't have permission to access customer. Note: If you're accessing a client customer, the manager's customer id must be set in the 'login-customer-id' header. See https:\/\/developers.google.com\/google-ads\/api\/docs\/concepts\/call-structure#login-customer-id" Code: <?php namespace Google\Ads\GoogleAds\Examples\AccountManagement; include($_SERVER['DOCUMENT_ROOT']. '/libraries/google-ads/vendor/autoload.php'); use GetOpt\GetOpt; use Google\Ads\GoogleAds\Examples\Utils\ArgumentNames; use Google\Ads\GoogleAds\Examples\Utils\ArgumentParser; use Google\Ads\GoogleAds\Lib\V2\GoogleAdsClient; use Google\Ads\GoogleAds\Lib\V2\GoogleAdsClientBuilder; use Google\Ads\GoogleAds\Lib\V2\GoogleAdsException; use Google\Ads\GoogleAds\Lib\OAuth2TokenBuilder; use Google\Ads\GoogleAds\Util\FieldMasks; use Google\Ads\GoogleAds\Util\V2\ResourceNames; use Google\Ads\GoogleAds\V2\Enums\ManagerLinkStatusEnum\ManagerLinkStatus; use Google\Ads\GoogleAds\V2\Errors\GoogleAdsError; use Google\Ads\GoogleAds\V2\Resources\CustomerClientLink; use Google\Ads\GoogleAds\V2\Resources\CustomerManagerLink; use Google\Ads\GoogleAds\V2\Services\CustomerClientLinkOperation; use Google\Ads\GoogleAds\V2\Services\CustomerManagerLinkOperation; use Google\ApiCore\ApiException; use Google\Protobuf\StringValue; define("MANAGER_CUSTOMER_ID", 6170837244); define("CUSTOMER_ID", 6083591644); class LinkManagerToClient { const MANAGER_CUSTOMER_ID = MANAGER_CUSTOMER_ID; const CUSTOMER_ID = CUSTOMER_ID; const PAGE_SIZE = 50; public static function main() { $options = (new ArgumentParser())->parseCommandArguments([ ArgumentNames::MANAGER_CUSTOMER_ID => GetOpt::REQUIRED_ARGUMENT, ArgumentNames::CUSTOMER_ID => GetOpt::REQUIRED_ARGUMENT ]); try { self::runExample( $options[ArgumentNames::MANAGER_CUSTOMER_ID] ?: self:: MANAGER_CUSTOMER_ID, $options[ArgumentNames::CUSTOMER_ID] ?: self::CUSTOMER_ID ); } catch (GoogleAdsException $googleAdsException) { printf( "Request with ID '%s' has failed.%sGoogle Ads failure details:%s", $googleAdsException->getRequestId(), PHP_EOL, PHP_EOL ); foreach ($googleAdsException->getGoogleAdsFailure()->getErrors() as $error) { printf( "\t%s: %s%s", $error->getErrorCode()->getErrorCode(), $error->getMessage(), PHP_EOL ); } } catch (ApiException $apiException) { printf( "ApiException was thrown with message '%s'.%s", $apiException->getMessage(), PHP_EOL ); } } public static function runExample(int $managerCustomerId, int $clientCustomerId) { $customerClientLinkResourceName = self::createInvitation( $managerCustomerId, $clientCustomerId); $managerLinkResourceName = self::getManagerLinkResourceName( $managerCustomerId, $clientCustomerId, $customerClientLinkResourceName); } public static function createInvitation(int $managerCustomerId, int $clientCustomerId) { $googleAdsClient = self::createGoogleAdsClient($managerCustomerId); $customerClientLink = new CustomerClientLink([ 'client_customer' => new StringValue(['value' => ResourceNames:: forCustomer($clientCustomerId)]), 'status' => ManagerLinkStatus::PENDING ]); $customerClientLinkOperation = new CustomerClientLinkOperation(); $customerClientLinkOperation->setCreate($customerClientLink); $customerClientLinkServiceClient = $googleAdsClient-> getCustomerClientLinkServiceClient(); $response = $customerClientLinkServiceClient->mutateCustomerClientLink( $managerCustomerId, $customerClientLinkOperation); $customerClientLinkResourceName = $response->getResult()-> getResourceName(); return $customerClientLinkResourceName; } public static function getManagerLinkResourceName(int $managerCustomerId, int $clientCustomerId, string $customerClientLinkResourceName) { $googleAdsClient = self::createGoogleAdsClient($managerCustomerId); $query = "SELECT customer_client_link.manager_link_id FROM customer_client_link WHERE customer_client_link.resource_name = '$customerClientLinkResourceName'"; $googleAdsServiceClient = $googleAdsClient->getGoogleAdsServiceClient(); $response = $googleAdsServiceClient->search( $managerCustomerId, $query, ['pageSize' => self::PAGE_SIZE] ); $managerLinkId = $response->getIterator()->current() ->getCustomerClientLink() ->getManagerLinkIdUnwrapped(); $managerLinkResourceName = ResourceNames::forCustomerManagerLink( $clientCustomerId, $managerCustomerId, $managerLinkId); return $managerLinkResourceName; } private static function createGoogleAdsClient(int $loginCustomerId) { try { $oAuth2Credential = (new OAuth2TokenBuilder()) ->fromFile() ->build(); } catch (Exception $e) { echo 'Caught exception: ', $e->getMessage(), "\n"; } try { return (new GoogleAdsClientBuilder()) ->fromFile() ->withOAuth2Credential($oAuth2Credential) ->withLoginCustomerId($loginCustomerId) ->build(); } catch (Exception $e) { echo 'Caught exception: ', $e->getMessage(), "\n"; } } } try { $get_data = new LinkManagerToClient(); $detail_1 = $get_data->createInvitation(MANAGER_CUSTOMER_ID, CUSTOMER_ID); $detail_2 = $get_data->getManagerLinkResourceName(MANAGER_CUSTOMER_ID, CUSTOMER_ID, $detail_1); } catch (Exception $e) { echo 'Caught exception: ', $e->getMessage(), "\n"; } -- -- =~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~ Also find us on our blog: https://googleadsdeveloper.blogspot.com/ =~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~ You received this message because you are subscribed to the Google Groups "AdWords API and Google Ads API Forum" group. To post to this group, send email to adwords-api@googlegroups.com To unsubscribe from this group, send email to adwords-api+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/adwords-api?hl=en --- You received this message because you are subscribed to the Google Groups "AdWords API and Google Ads API Forum" group. To unsubscribe from this group and stop receiving emails from it, send an email to adwords-api+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/adwords-api/0d472a27-decc-4a7a-ba41-9991098218c1o%40googlegroups.com.