Зарегистрируйтесь как разработчик

Регистрация в качестве разработчика – это обязательный однократный процесс настройки, который связывает ваш проект Google Cloud с аккаунтом Merchant Center и регистрирует вашу контактную информацию разработчика в Google. Это позволит Google отправлять важные служебные уведомления и обязательные обновления указанным вами техническим специалистам.

Это одна из статей о начале работы с Merchant API. Если вы уже зарегистрировались в Merchant API, перейдите к следующему разделу: Добавьте первый товар

Требования

Прежде чем регистрироваться для использования Merchant API, убедитесь, что вы соответствуете следующим требованиям:

  • Аккаунт Merchant Center. Вам потребуется аккаунт Merchant Center. Регистрация поддерживается только для рабочих аккаунтов. Тестовые аккаунты не подходят для регистрации в качестве разработчика.
  • Подтвержденная главная страница. В аккаунте Merchant Center должен быть подтвержденный сайт. Это подтверждает право собственности на домен, связанный с вашей компанией.
  • Доступ с правами администратора к аккаунту Merchant Center. У адреса электронной почты или сервисного аккаунта, который вы используете для авторизации вызова регистрации, должен быть тип доступа ADMIN в аккаунте Merchant Center, в котором вы регистрируетесь. Подробнее о том, как авторизовать запросы к Merchant API…
  • Идентификатор проекта Google Cloud. Ваше приложение должно быть связано с отдельным проектом Google Cloud, чтобы предоставлять учетные данные для аутентификации. Подробнее о том, как найти название, номер и идентификатор проекта…
  • Действительный адрес электронной почты, связанный с аккаунтом Google, который вы указываете в качестве контактного адреса разработчика для получения новостей от Google. Нельзя использовать адрес электронной почты сервисного аккаунта. Вы можете использовать адрес электронной почты, который уже связан с аккаунтом Merchant Center, или указать новый.

Как зарегистрироваться в качестве разработчика в Merchant API

Чтобы использовать Merchant API, вы должны зарегистрировать контактную информацию разработчика и облачный проект Google Cloud в аккаунте Merchant Center с помощью метода registerGcp.

Независимо от того, работаете ли вы с несколькими аккаунтами продавца или нет, вам нужно выполнить операцию регистрации один раз для каждого проекта Google Cloud, который вы собираетесь использовать. Если вы работаете с несколькими проектами Google Cloud, вы можете зарегистрировать любой или все из них в одном аккаунте Merchant Center.

Преимущества регистрации

Регистрация дает следующие преимущества:

  • Создание технического контакта. В Merchant Center создается технический контакт. Google отправляет техническому специалисту важные обновления, связанные с API, например служебные уведомления и информацию о новых функциях.
  • Управление несколькими аккаунтами продавцов. Вы можете выступать в качестве контактного лица для всех аккаунтов продавцов, которыми управляете.

Все вызовы Merchant API из незарегистрированного облачного проекта Google Cloud, кроме регистрации, блокируются. При этом возвращается код ошибки 401 со статусом UNAUTHENTICATED и следующим сообщением об ошибке:

GCP project with id {GCP_ID} and number {GCP_NUMBER} is not registered with the merchant account.
Follow these steps https://developers.google.com/merchant/api/guides/quickstart#register_as_a_developer
to register the GCP project with the merchant account then try calling the API again in 5 minutes.

Важные примечания

  • Однократная настройка для каждого проекта Google Cloud. Регистрация выполняется один раз для каждого проекта Google Cloud и применяется ко всем пользователям и сервисным аккаунтам в рамках проекта. Убедитесь, что Merchant API включен в вашем проекте Google Cloud.
  • Каждый облачный проект Google Cloud можно зарегистрировать только в одном аккаунте Merchant Center. Если вы попытаетесь зарегистрировать облачный проект Google Cloud в нескольких аккаунтах Merchant Center одновременно, то получите ошибку ALREADY_REGISTERED. Используйте для регистрации тот же адрес электронной почты разработчика. Обратите внимание, что с одним аккаунтом Merchant Center можно связать несколько облачных проектов Google Cloud. Инструкции по изменению или ротации зарегистрированного проекта Google Cloud приведены в статье Как управлять проектами Google Cloud и переносить их.
  • Укажите правильный аккаунт для сторонних партнеров, управляющих несколькими продавцами. Чтобы обеспечить долгосрочную стабильность и избежать сбоев в обслуживании, сторонние партнеры, которые представляют нескольких продавцов или управляют ими, должны использовать соответствующую структуру аккаунта в экосистеме Google. Рекомендуем зарегистрировать аккаунт, который соответствует типу вашей компании:

    • Торговые площадки с расширенным аккаунтом. Если у вас уже есть расширенный аккаунт, представляющий всю платформу, используйте его идентификатор.
    • Сервисы сравнения цен (ССЦ). Если вы представляете ССЦ, укажите уникальный идентификатор аккаунта ССЦ или группы ССЦ.
    • Агентства, разработчики и другие сторонние партнеры. Если вы представляете стороннюю компанию, например агентство или стороннего разработчика, управляете несколькими аккаунтами продавцов и у вас нет единого идентификатора Merchant Center, представляющего вашу компанию, вам следует создать новый основной аккаунт Merchant Center и запросить его преобразование в расширенный аккаунт. Расширенные аккаунты позволяют управлять дочерними аккаунтами и обеспечивают необходимую структуру для работы сторонних партнеров.

    В таблице ниже приведены рекомендации для разных типов партнеров.

    Тип партнера Рекомендуемый аккаунт для регистрации
    Торговые площадки Ваш основной (или самый большой) расширенный аккаунт.
    Рекламные агентства Отдельный или расширенный аккаунт, представляющий вашу компанию. Если вы только начинаете работать с Merchant API, рекомендуем создать отдельный аккаунт.
    Сервисы сравнения цен (ССЦ) Идентификатор аккаунта группы ССЦ или идентификатор аккаунта ССЦ в зависимости от того, представляет ли аккаунт всю группу ССЦ или только определенный ССЦ в группе. Не используйте расширенный аккаунт ССЦ.
    Продавцы или бренды Основной аккаунт, представляющий ваш бренд. Это может быть обычный или расширенный аккаунт.
    Поставщики данных о продажах и ассортименте Ваш основной (или самый большой) расширенный аккаунт.
    Другие сторонние поставщики Если у вас есть аккаунт Merchant Center, вы можете использовать его для регистрации. В противном случае создайте отдельный аккаунт компании. Затем подтвердите сайт.
  • Зарегистрироваться только в основном аккаунте Merchant Center. В этом случае вы станете контактным лицом для всех дочерних аккаунтов. Не регистрируйте каждый дочерний аккаунт Merchant Center.

Альтернативный текст для специальных возможностей

На схеме выше показана настройка регистрации при использовании нескольких проектов Google Cloud и одного основного аккаунта Merchant Center с несколькими дочерними аккаунтами Merchant Center (необязательно).

  • Требование к аутентификации. При регистрации аккаунт Merchant Center, прошедший аутентификацию (то есть аккаунт, в котором хранятся ваши учетные данные), должен совпадать с аккаунтом Merchant Center, от имени которого выполняется действие (то есть аккаунтом, который вы регистрируете). Вы не можете зарегистрировать дочерний аккаунт, если вы вошли в отдельный родительский или управляющий аккаунт.

  • Только аккаунты с подтвержденным сайтом. Зарегистрироваться могут только аккаунты Merchant Center с подтвержденным сайтом.

  • Нельзя регистрировать тестовые аккаунты.

  • После регистрации адреса электронной почты разработчика:

    • Вызовы Merchant API можно выполнять в течение пяти минут после регистрации.
    • Если адрес электронной почты принадлежит существующему пользователю Merchant Center, ему будет назначена роль API developer. В противном случае в Merchant Center будет создан новый пользователь, который должен принять приглашение в течение 14 дней. Если он этого не сделает, приглашение станет недействительным и процесс регистрации придется начать заново. Процесс регистрации завершается только после того, как пользователь нажмет на ссылку в приглашении.

Как выполнить регистрационный вызов

Для регистрации вызовите метод registerGcp. Вы можете сделать регистрационный звонок двумя способами:

  • Вариант 1. Прямые вызовы API. Вы отправляете необработанные запросы непосредственно к конечным точкам API, обычно по протоколу HTTP(S). Вам нужно вручную формировать тело запроса, настраивать заголовки (включая аутентификацию) и анализировать ответ.
  • Вариант 2. Клиентские библиотеки. Вы используете готовые библиотеки, которые предлагают более удобный и идиоматичный способ взаимодействия с Merchant API. Они выполняют аутентификацию и авторизацию, а также позволяют абстрагироваться от базового HTTP-обмена данными. Чтобы вам было проще начать работу, мы подготовили примеры кода.

Авторизация для звонка с целью регистрации

Как описано в разделе Авторизация запросов к Merchant API, существует два сценария аутентификации:

  • OAuth 2.0 – для сторонних поставщиков или агентств, управляющих несколькими аккаунтами продавцов.
  • Сервисные аккаунты – для доступа к собственному аккаунту Merchant Center.

Подробнее о том, как выполнить аутентификацию и авторизацию для вызова регистрации…

Звонок для регистрации

В примерах ниже вызов регистрации выполняется с помощью прямых вызовов API или клиентских библиотек.

Выполните вызов регистрации с помощью метода registerGcp.

POST https://merchantapi.googleapis.com/accounts/v1/accounts/{ACCOUNT_ID}/developerRegistration:registerGcp
Content-Type: application/json
Authorization: Bearer {ACCESS_TOKEN}"

{
  "developerEmail": "{DEVELOPER_EMAIL}"
}

Замените следующее:

  • ACCOUNT_ID – идентификатор Merchant Center.
  • ACCESS_TOKEN – токен авторизации для вызова API.
  • DEVELOPER_EMAIL – адрес электронной почты основного контактного лица по техническим вопросам.

При успешном вызове возвращается ресурс DeveloperRegistration, подтверждающий успешное связывание:

  "name": "accounts/{ACCOUNT_ID}/developerRegistration",
  "gcpIds": ["{GOOGLE_CLOUD_PROJECT_ID}"]

Python

Скачайте примеры и следуйте инструкциям из примеров Google Merchant API на Python, чтобы настроить клиентские библиотеки Python.

from examples.authentication import configuration
from examples.authentication import generate_user_credentials
from google.shopping.merchant_accounts_v1 import DeveloperRegistration
from google.shopping.merchant_accounts_v1 import DeveloperRegistrationServiceClient
from google.shopping.merchant_accounts_v1 import RegisterGcpRequest


def register_gcp(
    account_id: str, developer_email: str
) -> DeveloperRegistration:
  """Registers the GCP project used to call the Merchant API with a developer email.

  Args:
    account_id: The ID of your Merchant Center account.
    developer_email: The email address of the developer to register.

  Returns:
    The created or updated DeveloperRegistration object.
  """
  # Get OAuth credentials.
  credentials = generate_user_credentials.main()

  # Create a client to the Developer Registration Service.
  client = DeveloperRegistrationServiceClient(credentials=credentials)

  # The name has the format: accounts/{account}/developerRegistration
  name = f"accounts/{account_id}/developerRegistration"

  # Create the request to register the GCP project.
  request = RegisterGcpRequest(
      name=name,
      developer_email=developer_email,
  )

  # Make the API call and handle potential errors.
  try:
    print("Sending RegisterGcp request:")
    response = client.register_gcp(request=request)
    print("Registered GCP project successfully:")
    print(response)
    return response
  except RuntimeError as e:
    print(f"An error occurred: {e}")
    raise


if __name__ == "__main__":

  # Your Merchant Center account ID.
  # This can be found in the Merchant Center UI.
  _account_id = configuration.Configuration().read_merchant_info()

  # The developer email to associate with the GCP project.
  _developer_email = "YOUR_EMAIL_HERE"

  register_gcp(_account_id, _developer_email)

Java

Скачайте примеры и следуйте инструкциям из примеров Java для Google Merchant API, чтобы настроить клиентские библиотеки Java.

import com.google.api.gax.core.FixedCredentialsProvider;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.shopping.merchant.accounts.v1.DeveloperRegistration;
import com.google.shopping.merchant.accounts.v1.DeveloperRegistrationName;
import com.google.shopping.merchant.accounts.v1.DeveloperRegistrationServiceClient;
import com.google.shopping.merchant.accounts.v1.DeveloperRegistrationServiceSettings;
import com.google.shopping.merchant.accounts.v1.RegisterGcpRequest;
import shopping.merchant.samples.utils.Authenticator;
import shopping.merchant.samples.utils.Config;

/**
 * This class demonstrates how to register the GCP project used to call the Merchant API with a
 * developer email.
 */
public class RegisterGcpSample {

  public static DeveloperRegistration registerGcp(Config config, String developerEmail) throws Exception {

    // Obtains OAuth token based on the user's configuration.
    GoogleCredentials credential = new Authenticator().authenticate();

    // Creates service settings using the credentials retrieved above.
    DeveloperRegistrationServiceSettings developerRegistrationServiceSettings =
        DeveloperRegistrationServiceSettings.newBuilder()
            .setCredentialsProvider(FixedCredentialsProvider.create(credential))
            .build();

    // Creates DeveloperRegistration name to identify the DeveloperRegistration.
    // The name has the format: accounts/{account}/developerRegistration
    String name =
        DeveloperRegistrationName.newBuilder()
            .setAccount(config.getAccountId().toString())
            .build()
            .toString();

    // Calls the API and propagates any network failures/errors.
    try (DeveloperRegistrationServiceClient developerRegistrationServiceClient =
        DeveloperRegistrationServiceClient.create(developerRegistrationServiceSettings)) {

      // Creates a request to register the GCP project with the developer email.
      RegisterGcpRequest request =
          RegisterGcpRequest.newBuilder().setName(name).setDeveloperEmail(developerEmail).build();

      System.out.println("Sending RegisterGcp request:");
      DeveloperRegistration response = developerRegistrationServiceClient.registerGcp(request);

      System.out.println(response);
      return response;
    }
  }

  public static void main(String[] args) throws Exception {
    Config config = Config.load();
    String developerEmail = "YOUR_EMAIL_HERE"; // Replace with your email
    registerGcp(config, developerEmail);
  }
}

PHP

Скачайте примеры и следуйте инструкциям из примеров PHP для Google Merchant API, чтобы настроить клиентские библиотеки PHP.

require_once __DIR__ . '/../../../../vendor/autoload.php';
require_once __DIR__ . '/../../../Authentication/Authentication.php';
require_once __DIR__ . '/../../../Authentication/Config.php';

use Google\ApiCore\ApiException;
use Google\Shopping\Merchant\Accounts\V1\Client\DeveloperRegistrationServiceClient;
use Google\Shopping\Merchant\Accounts\V1\RegisterGcpRequest;

/**
 * This class demonstrates how to register the GCP project used to call the
 * Merchant API with a developer email.
 */
class RegisterGcpSample
{
    /**
     * A helper function to create the name string for the
     * DeveloperRegistration.
     *
     * @param string $accountId The merchant account ID.
     * @return string The name, which has the format:
     *     `accounts/{account}/developerRegistration`
     */
    private static function getName(string $accountId): string
    {
        return sprintf("accounts/%s/developerRegistration", $accountId);
    }

    /**
     * Registers the GCP project with a developer email.
     *
     * @param array $config The configuration data for authentication and account ID.
     * @param string $developerEmail The email of the developer to register.
     */
    public static function registerGcpSample(array $config, string $developerEmail): void
    {
        // Obtains OAuth credentials from the configuration file.
        $credentials = Authentication::useServiceAccountOrTokenFile();

        // Creates a configuration object for the client.
        $options = ['credentials' => $credentials];

        // Creates the DeveloperRegistrationServiceClient.
        $developerRegistrationServiceClient = new DeveloperRegistrationServiceClient($options);

        // Creates the name of the developer registration to identify it.
        $name = self::getName($config['accountId']);

        // Calls the API and handles any network failures.
        try {
            // Creates a request to register the GCP project with the developer email.
            $request = new RegisterGcpRequest([
                'name' => $name,
                'developer_email' => $developerEmail
            ]);

            printf("Sending RegisterGcp request:%s", PHP_EOL);
            // The `registerGcp` method returns a `DeveloperRegistration` object
            // upon success.
            $response = $developerRegistrationServiceClient->registerGcp($request);
            print "Successfully registered developer email '$developerEmail' for account {$config['accountId']}.\n";
            print_r($response);
        } catch (ApiException $e) {
            printf("An error occurred: %s%s", $e->getMessage(), PHP_EOL);
        }
    }

    /**
     * Helper to execute the sample.
     */
    public function callSample(): void
    {
        $config = Config::generateConfig();
        // An email address for a developer to register for the API.
        $developerEmail = 'YOUR_EMAIL_HERE'; // Replace with your email
        self::registerGcpSample($config, $developerEmail);
    }
}

// Executes the sample.
$sample = new RegisterGcpSample();
$sample->callSample();

cURL

curl -X POST "https://merchantapi.googleapis.com/accounts/v1/accounts/{ACCOUNT_ID}/developerRegistration:registerGcp" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer {ACCESS_TOKEN}" \
-d '{
  "developerEmail": "{DEVELOPER_EMAIL}"
}'

Чтобы завершить регистрацию, убедитесь, что хотя бы у одного пользователя в Merchant Center есть роль API developer. Для этого выполните одно из следующих действий:

  • Укажите developerEmail в методе registerGcp.
  • Добавьте нового пользователя с ролью API developer в интерфейсе Merchant Center.
  • Назначьте роль API developer существующему пользователю в интерфейсе Merchant Center.
  • Вызовите метод accounts.users.create, чтобы создать нового пользователя и назначить ему роль API developer.
  • Назначьте роль API developer существующему пользователю с помощью метода accounts.users.patch.

Рекомендации после регистрации

Чтобы обеспечить надежное управление доступом и предотвратить сбои в работе сервиса, рекомендуем после завершения первоначальной регистрации выполнить следующие действия:

Предоставьте дополнительные разрешения для API developer

При регистрации контакта разработчика ему автоматически назначается роль API developer. Эта роль не включает другие разрешения, необходимые для управления аккаунтом Merchant Center или выполнения всех вызовов API. Чтобы предоставить разработчикам полный доступ, рекомендуем назначить им роли ADMIN или STANDARD.

Чтобы изменить права доступа пользователя, используйте метод accounts.users.patch. Чтобы добавить или удалить роли, укажите права доступа в поле updateMask тела запроса:

PATCH https://merchantapi.googleapis.com/accounts/v1/{ACCOUNT_ID}/users/{DEVELOPER_EMAIL}?update_mask=access_rights
Content-Type: application/json
Authorization: Bearer {ACCESS_TOKEN}"

{
  "name": "accounts/{ACCOUNT_ID}/users/{DEVELOPER_EMAIL}",
  "access_rights": [ "ADMIN", "API_DEVELOPER" ]
}

Python

from examples.authentication import configuration
from examples.authentication import generate_user_credentials
from google.protobuf import field_mask_pb2
from google.shopping.merchant_accounts_v1 import AccessRight
from google.shopping.merchant_accounts_v1 import UpdateUserRequest
from google.shopping.merchant_accounts_v1 import User
from google.shopping.merchant_accounts_v1 import UserServiceClient

FieldMask = field_mask_pb2.FieldMask

_ACCOUNT = configuration.Configuration().read_merchant_info()


def update_user(user_email, user_access_right):
  """Updates a user to make it an admin of the MC account."""

  credentials = generate_user_credentials.main()

  client = UserServiceClient(credentials=credentials)

  # Create user name string
  name = "accounts/" + _ACCOUNT + "/users/" + user_email

  user = User(name=name, access_rights=[user_access_right])

  field_mask = FieldMask(paths=["access_rights"])

  try:
    request = UpdateUserRequest(user=user, update_mask=field_mask)

    print("Sending Update User request")
    response = client.update_user(request=request)
    print("Updated User Name below")
    print(response.name)
  except RuntimeError as e:
    print(e)


if __name__ == "__main__":
  # Modify this email to update the right user
  email = "USER_MAIL_ACCOUNT"
  access_right = AccessRight.ADMIN
  update_user(email, access_right)

Java

import com.google.api.gax.core.FixedCredentialsProvider;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.protobuf.FieldMask;
import com.google.shopping.merchant.accounts.v1.AccessRight;
import com.google.shopping.merchant.accounts.v1.UpdateUserRequest;
import com.google.shopping.merchant.accounts.v1.User;
import com.google.shopping.merchant.accounts.v1.UserName;
import com.google.shopping.merchant.accounts.v1.UserServiceClient;
import com.google.shopping.merchant.accounts.v1.UserServiceSettings;
import shopping.merchant.samples.utils.Authenticator;
import shopping.merchant.samples.utils.Config;

/** This class demonstrates how to update a user to make it an admin of the MC account. */
public class UpdateUserSample {

  public static void updateUser(Config config, String email, AccessRight accessRight)
      throws Exception {

    GoogleCredentials credential = new Authenticator().authenticate();

    UserServiceSettings userServiceSettings =
        UserServiceSettings.newBuilder()
            .setCredentialsProvider(FixedCredentialsProvider.create(credential))
            .build();

    // Creates user name to identify user.
    String name =
        UserName.newBuilder()
            .setAccount(config.getAccountId().toString())
            .setEmail(email)
            .build()
            .toString();

    // Create a user with the updated fields.
    User user = User.newBuilder().setName(name).addAccessRights(accessRight).build();

    FieldMask fieldMask = FieldMask.newBuilder().addPaths("access_rights").build();

    try (UserServiceClient userServiceClient = UserServiceClient.create(userServiceSettings)) {

      UpdateUserRequest request =
          UpdateUserRequest.newBuilder().setUser(user).setUpdateMask(fieldMask).build();

      System.out.println("Sending Update User request");
      User response = userServiceClient.updateUser(request);
      System.out.println("Updated User Name below");
      System.out.println(response.getName());
    } catch (Exception e) {
      System.out.println(e);
    }
  }

  public static void main(String[] args) throws Exception {
    Config config = Config.load();
    String email = "testUser@gmail.com";
    // Give the user admin rights. Note that all other rights, like
    // PERFORMANCE_REPORTING, would be overwritten in this example
    // if the user had those access rights before the update.
    AccessRight accessRight = AccessRight.ADMIN;

    updateUser(config, email, accessRight);
  }
}

PHP

use Google\ApiCore\ApiException;
use Google\Protobuf\FieldMask;
use Google\Shopping\Merchant\Accounts\V1\AccessRight;
use Google\Shopping\Merchant\Accounts\V1\UpdateUserRequest;
use Google\Shopping\Merchant\Accounts\V1\User;
use Google\Shopping\Merchant\Accounts\V1\Client\UserServiceClient;


/**
 * Updates a user.
 *
 * @param array $config The configuration data.
 * @param string $email The email address of the user.
 * @param int $accessRight The access right to grant the user.
 * @return void
 */
function updateUser($config, $email, $accessRights): void
{
    // Gets the OAuth credentials to make the request.
    $credentials = Authentication::useServiceAccountOrTokenFile();

    // Creates options config containing credentials for the client to use.
    $options = ['credentials' => $credentials];

    // Creates a client.
    $userServiceClient = new UserServiceClient($options);

    // Creates user name to identify user.
    $name = 'accounts/' . $config['accountId'] . "/users/" . $email;

    $user = (new User())
        ->setName($name)
        ->setAccessRights($accessRights);

    $fieldMask = (new FieldMask())->setPaths(['access_rights']);

    // Calls the API and catches and prints any network failures/errors.
    try {
        $request = new UpdateUserRequest([
            'user' => $user,
            'update_mask' => $fieldMask,
        ]);

        print "Sending Update User request\n";
        $response = $userServiceClient->updateUser($request);
        print "Updated User Name below\n";
        print $response->getName() . "\n";
    } catch (ApiException $e) {
        print $e->getMessage();
    }
}


$config = Config::generateConfig();
$email = "testUser@gmail.com";
$accessRights = [AccessRight::ADMIN];

updateUser($config, $email, $accessRights);

cURL

curl -X PATCH \
"https://merchantapi.googleapis.com/accounts/v1/{ACCOUNT_ID}/users/{USER_EMAIL}?update_mask=access_rights" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer {ACCESS_TOKEN}" \
-d '{
  "access_rights": [
    "ADMIN",
    "API_DEVELOPER"
  ]
}'

Добавьте больше контактов разработчика

Чтобы избежать сбоев в работе, если основной контактный адрес разработчика станет недоступен, важно указать дополнительные адреса. Рекомендуем добавить в Merchant Center хотя бы одного дополнительного пользователя с ролью API developer.

Добавить пользователя или изменить его данные можно с помощью сервиса accounts.users в Merchant API или на странице Доступ и сервисы в интерфейсе Merchant Center. Добавив резервных разработчиков, вы создадите более устойчивую интеграцию, которая не зависит от одного человека.

PATCH https://merchantapi.googleapis.com/products/v1/accounts/{ACCOUNT_ID}/users
Content-Type: application/json
Authorization: Bearer {ACCESS_TOKEN}"
{
  "user_id": {USER_EMAIL},
  "user": { "access_rights": [ "API_DEVELOPER", "ADMIN" ] }
}

Python

from examples.authentication import configuration
from examples.authentication import generate_user_credentials
from google.shopping.merchant_accounts_v1 import AccessRight
from google.shopping.merchant_accounts_v1 import CreateUserRequest
from google.shopping.merchant_accounts_v1 import User
from google.shopping.merchant_accounts_v1 import UserServiceClient

_ACCOUNT = configuration.Configuration().read_merchant_info()


def get_parent(account_id):
  return f"accounts/{account_id}"


def create_user(user_email):
  """Creates a user for a Merchant Center account."""

  # Get OAuth credentials
  credentials = generate_user_credentials.main()

  # Create a UserServiceClient
  client = UserServiceClient(credentials=credentials)

  # Create parent string
  parent = get_parent(_ACCOUNT)

  # Create the request
  request = CreateUserRequest(
      parent=parent,
      user_id=user_email,
      user=User(
          access_rights=[AccessRight.ADMIN, AccessRight.PERFORMANCE_REPORTING]
      ),
  )

  try:
    print("Sending Create User request")
    response = client.create_user(request=request)
    print("Inserted User Name below")
    print(response.name)
  except RuntimeError as e:
    print(e)


if __name__ == "__main__":
  # Modify this email to create a new user
  email = "USER_MAIL_ACCOUNT"
  create_user(email)

Java

import com.google.api.gax.core.FixedCredentialsProvider;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.shopping.merchant.accounts.v1.AccessRight;
import com.google.shopping.merchant.accounts.v1.CreateUserRequest;
import com.google.shopping.merchant.accounts.v1.User;
import com.google.shopping.merchant.accounts.v1.UserServiceClient;
import com.google.shopping.merchant.accounts.v1.UserServiceSettings;
import shopping.merchant.samples.utils.Authenticator;
import shopping.merchant.samples.utils.Config;

/** This class demonstrates how to create a user for a Merchant Center account. */
public class CreateUserSample {

  private static String getParent(String accountId) {
    return String.format("accounts/%s", accountId);
  }

  public static void createUser(Config config, String email) throws Exception {

    // Obtains OAuth token based on the user's configuration.
    GoogleCredentials credential = new Authenticator().authenticate();

    // Creates service settings using the credentials retrieved above.
    UserServiceSettings userServiceSettings =
        UserServiceSettings.newBuilder()
            .setCredentialsProvider(FixedCredentialsProvider.create(credential))
            .build();

    // Creates parent to identify where to insert the user.
    String parent = getParent(config.getAccountId().toString());

    // Calls the API and catches and prints any network failures/errors.
    try (UserServiceClient userServiceClient = UserServiceClient.create(userServiceSettings)) {

      CreateUserRequest request =
          CreateUserRequest.newBuilder()
              .setParent(parent)
              // This field is the email address of the user.
              .setUserId(email)
              .setUser(
                  User.newBuilder()
                      .addAccessRights(AccessRight.ADMIN)
                      .addAccessRights(AccessRight.PERFORMANCE_REPORTING)
                      .build())
              .build();

      System.out.println("Sending Create User request");
      User response = userServiceClient.createUser(request);
      System.out.println("Inserted User Name below");
      // The last part of the user name will be the email address of the user.
      // Format: `accounts/{account}/user/{user}`
      System.out.println(response.getName());
    } catch (Exception e) {
      System.out.println(e);
    }
  }

  public static void main(String[] args) throws Exception {
    Config config = Config.load();
    // The email address of this user.
    String email = "testUser@gmail.com";

    createUser(config, email);
  }
}

PHP

use Google\ApiCore\ApiException;
use Google\Shopping\Merchant\Accounts\V1\AccessRight;
use Google\Shopping\Merchant\Accounts\V1\CreateUserRequest;
use Google\Shopping\Merchant\Accounts\V1\User;
use Google\Shopping\Merchant\Accounts\V1\Client\UserServiceClient;


/**
 * Creates a user.
 *
 * @param array $config The configuration data.
 * @param string $email The email address of the user.
 * @return void
 */
function createUser($config, $email): void
{
    // Gets the OAuth credentials to make the request.
    $credentials = Authentication::useServiceAccountOrTokenFile();

    // Creates options config containing credentials for the client to use.
    $options = ['credentials' => $credentials];

    // Creates a client.
    $userServiceClient = new UserServiceClient($options);

    // Creates parent to identify where to insert the user.
    $parent = sprintf("accounts/%s", $config['accountId']);

    // Calls the API and catches and prints any network failures/errors.
    try {
        $request = new CreateUserRequest([
            'parent' => $parent,
            'user_id' => $email,
            'user' => (new User())
                ->setAccessRights([AccessRight::ADMIN,AccessRight::PERFORMANCE_REPORTING])
        ]);

        print "Sending Create User request\n";
        $response = $userServiceClient->createUser($request);
        print "Inserted User Name below\n";
        print $response->getName() . "\n";
    } catch (ApiException $e) {
        print $e->getMessage();
    }
}

$config = Config::generateConfig();
$email = "testUser@gmail.com";

createUser($config, $email);

cURL

curl -X PATCH \
"https://merchantapi.googleapis.com/products/v1/accounts/{ACCOUNT_ID}/users/{USER_EMAIL}?update_mask=access_rights" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer {ACCESS_TOKEN}" \
-d '{
  "access_rights": [
    "ADMIN",
    "API_DEVELOPER"
  ]
}'