הירשם כמפתח

ההרשמה כמפתח היא תהליך הגדרה חד-פעמי שחובה לבצע כדי לקשר בין פרויקט בענן של Google לבין חשבון Merchant Center, ולרשום את פרטי הקשר של המפתח ב-Google. כך Google יכולה לשלוח הודעות שירות חשובות ועדכונים חיוניים לאנשי הקשר הטכניים הרלוונטיים שסיפקתם.

המאמר הזה הוא חלק מסדרה שכוללת כמה חלקים בנושא תחילת העבודה עם Merchant API. אם כבר נרשמתם ל-Merchant API, אתם יכולים לדלג לקטע הבא: הוספת המוצר הראשון

דרישות מוקדמות

לפני שאתם נרשמים לשימוש ב-Merchant API, אתם צריכים לוודא שאתם עומדים בדרישות הבאות:

  • חשבון 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 שבו אתם מתכוונים להשתמש. אם אתם עובדים עם כמה פרויקטים ב-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.
Please 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, והוא חל על כל המשתמשים וחשבונות השירות בפרויקט ב-Google Cloud. מוודאים שממשק Merchant API מופעל בפרויקט ב-Google Cloud.
  • כל פרויקט ב-Google Cloud יכול להיות רשום רק בחשבון Merchant Center אחד בכל זמן נתון: אם תנסו לרשום פרויקט אחד ב-Google Cloud בכמה חשבונות Merchant Center בו-זמנית, תוצג לכם שגיאה ALREADY_REGISTERED. משתמשים באותה כתובת אימייל של מפתח לצורך ההרשמה. שימו לב שאפשר לרשום כמה פרויקטים ב-Google Cloud לאותו חשבון Merchant Center.
  • הגדרת החשבון הנכון לצדדים שלישיים שמנהלים כמה מוכרים: צדדים שלישיים שמייצגים או מנהלים כמה מוכרים צריכים להשתמש במבנה החשבון המתאים בסביבת Google. המזהה הנכון לשימוש תלוי בסוג העסק:
    • זירות מסחר עם חשבון מתקדם קיים: אם העסק שלכם פועל כזירת מסחר וכבר יש לו חשבון מתקדם שמייצג את הפלטפורמה כולה, אתם צריכים להשתמש במזהה החשבון הקיים הזה.
    • שירותי השוואת מחירים (CSS): אם אתם שירות CSS, אתם צריכים להשתמש במספר החשבון הייחודי של שירות ה-CSS או במספר החשבון של קבוצת ה-CSS.
    • סוכנויות, מפתחים וצדדים שלישיים אחרים: אם אתם צד שלישי כמו סוכנות או מפתח צד שלישי שמנהל כמה חשבונות של מוֹכרים ואין לכם מספר חשבון Merchant Center יחיד שמייצג את העסק שלכם, אתם צריכים ליצור חשבון Merchant Center ראשי חדש ולבקש להמיר אותו לחשבון מתקדם. בחשבונות מתקדמים אפשר לנהל חשבונות משנה ולספק את המבנה הנדרש לפעולות של צד ג'.
  • הרישום מתבצע רק בחשבון Merchant Center הראשי: אתם מבצעים את הרישום למפתחים רק באמצעות חשבון Merchant Center הראשי, והופכים לאיש הקשר למפתחים בכל חשבונות המשנה המקושרים ב-Merchant Center. אל תבצעו רישום לכל אחד מהחשבונות המשניים שלכם ב-Merchant Center.

טקסט חלופי לנגישות

בתרשים שלמעלה מוצגת הגדרת הרישום כשמשתמשים בכמה פרויקטים של Google Cloud ובחשבון Merchant Center ראשי אחד, עם אפשרות להשתמש בכמה חשבונות משנה של Merchant Center.

  • אחרי שרושמים כתובת אימייל של מפתח:
    • אפשר לבצע קריאות ל-Merchant API תוך 5 דקות מההרשמה.
    • אם כתובת האימייל שייכת למשתמש קיים ב-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 או באמצעות ספריות לקוח.

מבצעים את קריאת הרישום באמצעות method‏ 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 DeveloperRegistrationServiceClient
from google.shopping.merchant_accounts_v1 import RegisterGcpRequest


def register_gcp(account_id: str, developer_email: str) -> None:
  """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.
  """
  # 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)
  except RuntimeError as e:
    print(f"An error occurred: {e}")


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 void 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 catches and prints 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);
    } catch (Exception e) {
      System.out.println(e);
    }
  }

  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}"
}'

שיטות מומלצות אחרי ההרשמה

כדי ליהנות מניהול גישה חזק ולמנוע שיבושים עתידיים בשירות, מומלץ לפעול לפי קבוצת שיטות מומלצות אחרי השלמת ההרשמה הראשונית:

מתן הרשאות נוספות למפתח ה-API

כשרושמים איש קשר של מפתח, מוקצית לו אוטומטית הרשאת 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"
  ]
}'

הוספת פרטים ליצירת קשר של מפתחים נוספים

כדי למנוע שיבושים בעסק אם איש הקשר הראשי של המפתח יעזוב או יאבד את הגישה, חשוב שיהיו אנשי קשר נוספים. מומלץ להגדיר לפחות משתמש נוסף אחד עם תפקיד API_DEVELOPER ב-Merchant Center, כדי שישמש כגיבוי.

אפשר להוסיף משתמש או לעדכן משתמש קיים באמצעות השירות 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"
  ]
}'