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.

Reply via email to