ایجاد کلاس‌های مجوز و اشیای مجوز

تقریباً همه مجوزهایی که می‌توانید برای کاربر نهایی صادر کنید تا در «کیف پول Google» خود ذخیره کند با دو مؤلفه تعریف می‌شوند: «کلاس مجوزها» و «شیء مجوزها». هرزمان که مجوزی برای کاربر صادر می‌کنید، به نمونه‌ای از «کلاس مجوزها» و «شیء مجوزها» نیاز خواهید داشت که به Google Wallet API می‌گوید چه نوع مجوزی بسازد و چه جزئیاتی را در مجوز نمایش دهد، مثلاً ارزش کارت هدیه یا نام دارنده بلیت.

‫Google Wallet API مجموعه‌ای از پیش‌تعریف‌شده از «کلاس‌های مجوز» و «اشیاء مجوز» ارائه می‌دهد که شما نمونه‌هایی از آن‌ها را ایجاد می‌کنید و سپس از آن‌ها برای ایجاد مجوزی که به کاربر صادر می‌شود استفاده می‌کنید، مانند GiftCardClass و GiftCardObject، GenericClass و GenericObject، و موارد دیگر.

هر نمونه «کلاس مجوزها» و «شیء مجوزها» به‌عنوان شیء JSON تعریف می‌شود که مجموعه‌ای از ویژگی‌های الزامی و اختیاری دارد که با مورد استفاده خاص درنظرگرفته‌شده برای آن نوع مجوز مطابقت دارد.

ایجاد «کلاس مجوزها»

«کلاس مجوزها» را می‌توان به‌عنوان الگوی مشترکی درنظر گرفت که مجوزها از آن ایجاد می‌شوند. «کلاس مجوزها» ویژگی‌های خاصی را تعریف می‌کند که در همه مجوزهایی که از آن استفاده می‌کنند گنجانده خواهد شد. «صادرکننده مجوز» می‌تواند چندین کلاس ایجاد کند که هرکدام مجموعه ویژگی‌های متمایز خود را دارند که مشخصه‌هایی مانند سبک و ظاهر، و همچنین ویژگی‌های اضافی مانند «ضربه هوشمند»، و «ثبت‌نام» و «ورود به سیستم» را تعریف می‌کنند.

«کلاس‌های مجوزها» را می‌توان بااستفاده از Google Wallet REST API،‏ Google Wallet Android SDK، یا در «کنسول کسب‌وکار کیف پول Google» ایجاد کرد.

برای کاربران جدید، «کنسول کسب‌وکار» ساده‌ترین راه برای شروع ایجاد «کلاس مجوزها» است، زیرا میانای کاربر ساده‌ای ارائه می‌دهد که در آن می‌توانید فیلدهای مختلف اولین «کلاس مجوزها» را با پر کردن فیلدهای فرم تعریف کنید.

برای کاربران پیشرفته، ایجاد «کلاس‌های مجوز» به‌صورت برنامه‌نویسی‌شده بهترین رویکرد است.

استفاده از «کنسول کسب‌وکار کیف پول Google»

برای ایجاد «کلاس مجوزها» در کنسول «کیف پول Google برای کسب‌وکار»، کارهای زیر را انجام دهید:

  1. به کنسول کسب‌وکار Google Pay و کیف پول بروید و با «حساب صادرکننده Google Wallet API» به سیستم وارد شوید.
  2. در کارت «Google Wallet API»، روی دکمه «مدیریت مجوزها» کلیک کنید.
  3. در بخش «دریافت دسترسی انتشار»، روی دکمه «ایجاد کلاس» کلیک کنید.
  4. نوع مجوز را از کادر گفتگو انتخاب کنید. «کیف پول Google» انواع مختلفی از مجوزها را ارائه می‌دهد (بلیت رویداد، پیشنهاد، کارت وفاداری، و غیره). برای مورد استفاده انعطاف‌پذیر، «عمومی» را به‌عنوان نوع مجوزتان انتخاب کنید.
  5. مقادیر مناسب را در فیلدهای الزامی وارد کنید.
  6. برای ذخیره کردن کلاس، روی دکمه «ایجاد کلاس» کلیک کنید.

استفاده از Google Wallet REST API

برای ایجاد «کلاس مجوزها» بااستفاده از Google Wallet REST API، درخواست POST را به https://walletobjects.googleapis.com/walletobjects/v1/offerClass ارسال کنید. برای اطلاعات بیشتر، به اسناد مرجع مراجعه کنید.

جاوا

برای شروع ادغام در Java، به نمونه کدهای کامل ما در GitHub مراجعه کنید.

/**
 * Create a class.
 *
 * @param issuerId The issuer ID being used for this request.
 * @param classSuffix Developer-defined unique ID for this pass class.
 * @return The pass class ID: "{issuerId}.{classSuffix}"
 */
public String createClass(String issuerId, String classSuffix) throws IOException {
  // Check if the class exists
  try {
    service.offerclass().get(String.format("%s.%s", issuerId, classSuffix)).execute();

    System.out.printf("Class %s.%s already exists!%n", issuerId, classSuffix);
    return String.format("%s.%s", issuerId, classSuffix);
  } catch (GoogleJsonResponseException ex) {
    if (ex.getStatusCode() != 404) {
      // Something else went wrong...
      ex.printStackTrace();
      return String.format("%s.%s", issuerId, classSuffix);
    }
  }

  // See link below for more information on required properties
  // https://developers.google.com/wallet/retail/offers/rest/v1/offerclass
  OfferClass newClass =
      new OfferClass()
          .setId(String.format("%s.%s", issuerId, classSuffix))
          .setIssuerName("Issuer name")
          .setReviewStatus("UNDER_REVIEW")
          .setProvider("Provider name")
          .setTitle("Offer title")
          .setRedemptionChannel("ONLINE");

  OfferClass response = service.offerclass().insert(newClass).execute();

  System.out.println("Class insert response");
  System.out.println(response.toPrettyString());

  return response.getId();
}

PHP

برای شروع ادغام در PHP، به نمونه کدهای کامل ما در GitHub مراجعه کنید.

/**
 * Create a class.
 *
 * @param string $issuerId The issuer ID being used for this request.
 * @param string $classSuffix Developer-defined unique ID for this pass class.
 *
 * @return string The pass class ID: "{$issuerId}.{$classSuffix}"
 */
public function createClass(string $issuerId, string $classSuffix)
{
  // Check if the class exists
  try {
    $this->service->offerclass->get("{$issuerId}.{$classSuffix}");

    print("Class {$issuerId}.{$classSuffix} already exists!");
    return "{$issuerId}.{$classSuffix}";
  } catch (Google\Service\Exception $ex) {
    if (empty($ex->getErrors()) || $ex->getErrors()[0]['reason'] != 'classNotFound') {
      // Something else went wrong...
      print_r($ex);
      return "{$issuerId}.{$classSuffix}";
    }
  }

  // See link below for more information on required properties
  // https://developers.google.com/wallet/retail/offers/rest/v1/offerclass
  $newClass = new OfferClass([
    'id' => "{$issuerId}.{$classSuffix}",
    'issuerName' => 'Issuer name',
    'reviewStatus' => 'UNDER_REVIEW',
    'provider' => 'Provider name',
    'title' => 'Offer title',
    'redemptionChannel' => 'ONLINE'
  ]);

  $response = $this->service->offerclass->insert($newClass);

  print "Class insert response\n";
  print_r($response);

  return $response->id;
}

Python

برای شروع ادغام در Python، به نمونه‌های کد کامل ما در GitHub مراجعه کنید.

def create_class(self, issuer_id: str, class_suffix: str) -> str:
    """Create a class.

    Args:
        issuer_id (str): The issuer ID being used for this request.
        class_suffix (str): Developer-defined unique ID for this pass class.

    Returns:
        The pass class ID: f"{issuer_id}.{class_suffix}"
    """

    # Check if the class exists
    try:
        self.client.offerclass().get(resourceId=f'{issuer_id}.{class_suffix}').execute()
    except HttpError as e:
        if e.status_code != 404:
            # Something else went wrong...
            print(e.error_details)
            return f'{issuer_id}.{class_suffix}'
    else:
        print(f'Class {issuer_id}.{class_suffix} already exists!')
        return f'{issuer_id}.{class_suffix}'

    # See link below for more information on required properties
    # https://developers.google.com/wallet/retail/offers/rest/v1/offerclass
    new_class = {
        'id': f'{issuer_id}.{class_suffix}',
        'issuerName': 'Issuer name',
        'reviewStatus': 'UNDER_REVIEW',
        'provider': 'Provider name',
        'title': 'Offer title',
        'redemptionChannel': 'ONLINE'
    }

    response = self.client.offerclass().insert(body=new_class).execute()

    print('Class insert response')
    print(response)

    return f'{issuer_id}.{class_suffix}'

C#‎

برای شروع ادغام در C#‎، به نمونه کدهای کامل ما در GitHub مراجعه کنید.

/// <summary>
/// Create a class.
/// </summary>
/// <param name="issuerId">The issuer ID being used for this request.</param>
/// <param name="classSuffix">Developer-defined unique ID for this pass class.</param>
/// <returns>The pass class ID: "{issuerId}.{classSuffix}"</returns>
public string CreateClass(string issuerId, string classSuffix)
{
  // Check if the class exists
  Stream responseStream = service.Offerclass
      .Get($"{issuerId}.{classSuffix}")
      .ExecuteAsStream();

  StreamReader responseReader = new StreamReader(responseStream);
  JObject jsonResponse = JObject.Parse(responseReader.ReadToEnd());

  if (!jsonResponse.ContainsKey("error"))
  {
    Console.WriteLine($"Class {issuerId}.{classSuffix} already exists!");
    return $"{issuerId}.{classSuffix}";
  }
  else if (jsonResponse["error"].Value<int>("code") != 404)
  {
    // Something else went wrong...
    Console.WriteLine(jsonResponse.ToString());
    return $"{issuerId}.{classSuffix}";
  }

  // See link below for more information on required properties
  // https://developers.google.com/wallet/retail/offers/rest/v1/offerclass
  OfferClass newClass = new OfferClass
  {
    Id = $"{issuerId}.{classSuffix}",
    IssuerName = "Issuer name",
    ReviewStatus = "UNDER_REVIEW",
    Provider = "Provider name",
    Title = "Offer title",
    RedemptionChannel = "ONLINE"
  };

  responseStream = service.Offerclass
      .Insert(newClass)
      .ExecuteAsStream();

  responseReader = new StreamReader(responseStream);
  jsonResponse = JObject.Parse(responseReader.ReadToEnd());

  Console.WriteLine("Class insert response");
  Console.WriteLine(jsonResponse.ToString());

  return $"{issuerId}.{classSuffix}";
}

Node.js

برای شروع ادغام در Node، به نمونه‌های کد کامل ما در GitHub مراجعه کنید.

/**
 * Create a class.
 *
 * @param {string} issuerId The issuer ID being used for this request.
 * @param {string} classSuffix Developer-defined unique ID for this pass class.
 *
 * @returns {string} The pass class ID: `${issuerId}.${classSuffix}`
 */
async createClass(issuerId, classSuffix) {
  let response;

  // Check if the class exists
  try {
    response = await this.client.offerclass.get({
      resourceId: `${issuerId}.${classSuffix}`
    });

    console.log(`Class ${issuerId}.${classSuffix} already exists!`);

    return `${issuerId}.${classSuffix}`;
  } catch (err) {
    if (err.response && err.response.status !== 404) {
      // Something else went wrong...
      console.log(err);
      return `${issuerId}.${classSuffix}`;
    }
  }

  // See link below for more information on required properties
  // https://developers.google.com/wallet/retail/offers/rest/v1/offerclass
  let newClass = {
    'id': `${issuerId}.${classSuffix}`,
    'issuerName': 'Issuer name',
    'reviewStatus': 'UNDER_REVIEW',
    'provider': 'Provider name',
    'title': 'Offer title',
    'redemptionChannel': 'ONLINE'
  };

  response = await this.client.offerclass.insert({
    requestBody: newClass
  });

  console.log('Class insert response');
  console.log(response);

  return `${issuerId}.${classSuffix}`;
}

رفتن

برای شروع ادغام در Go، به نمونه کدهای کامل ما در GitHub مراجعه کنید نمونه کدهای Github.

// Create a class.
func (d *demoOffer) createClass(issuerId, classSuffix string) {
	offerClass := new(walletobjects.OfferClass)
	offerClass.Id = fmt.Sprintf("%s.%s", issuerId, classSuffix)
	offerClass.RedemptionChannel = "ONLINE"
	offerClass.ReviewStatus = "UNDER_REVIEW"
	offerClass.Title = "Offer title"
	offerClass.IssuerName = "Issuer name"
	offerClass.Provider = "Provider name"
	res, err := d.service.Offerclass.Insert(offerClass).Do()
	if err != nil {
		log.Fatalf("Unable to insert class: %v", err)
	} else {
		fmt.Printf("Class insert id:\n%v\n", res.Id)
	}
}

ایجاد شیء مجوزها

«شیء مجوزها» نمونه‌ای از «کلاس مجوزها» است. برای ایجاد «شیء مجوزها»، باید مشخصه‌های زیر را ارائه دهید:

  • ‫classId: id «کلاس مجوزها»
  • ‫id: شناسه یکتا برای مشتری شما

    برای اطلاعات بیشتر درباره نحوه نمایش این مشخصه‌ها در پیشنهاد، به الگوی چیدمان مراجعه کنید.

    نمونه کد برای ایجاد «شیء مجوزها»:

    جاوا

    برای شروع ادغام در Java، به نمونه کدهای کامل ما در GitHub مراجعه کنید.

    /**
     * Create an object.
     *
     * @param issuerId The issuer ID being used for this request.
     * @param classSuffix Developer-defined unique ID for this pass class.
     * @param objectSuffix Developer-defined unique ID for this pass object.
     * @return The pass object ID: "{issuerId}.{objectSuffix}"
     */
    public String createObject(String issuerId, String classSuffix, String objectSuffix)
        throws IOException {
      // Check if the object exists
      try {
        service.offerobject().get(String.format("%s.%s", issuerId, objectSuffix)).execute();
    
        System.out.printf("Object %s.%s already exists!%n", issuerId, objectSuffix);
        return String.format("%s.%s", issuerId, objectSuffix);
      } catch (GoogleJsonResponseException ex) {
        if (ex.getStatusCode() == 404) {
          // Object does not exist
          // Do nothing
        } else {
          // Something else went wrong...
          ex.printStackTrace();
          return String.format("%s.%s", issuerId, objectSuffix);
        }
      }
    
      // See link below for more information on required properties
      // https://developers.google.com/wallet/retail/offers/rest/v1/offerobject
      OfferObject newObject =
          new OfferObject()
              .setId(String.format("%s.%s", issuerId, objectSuffix))
              .setClassId(String.format("%s.%s", issuerId, classSuffix))
              .setState("ACTIVE")
              .setHeroImage(
                  new Image()
                      .setSourceUri(
                          new ImageUri()
                              .setUri(
                                  "https://farm4.staticflickr.com/3723/11177041115_6e6a3b6f49_o.jpg"))
                      .setContentDescription(
                          new LocalizedString()
                              .setDefaultValue(
                                  new TranslatedString()
                                      .setLanguage("en-US")
                                      .setValue("Hero image description"))))
              .setTextModulesData(
                      List.of(
                              new TextModuleData()
                                      .setHeader("Text module header")
                                      .setBody("Text module body")
                                      .setId("TEXT_MODULE_ID")))
              .setLinksModuleData(
                  new LinksModuleData()
                      .setUris(
                          Arrays.asList(
                              new Uri()
                                  .setUri("http://maps.google.com/")
                                  .setDescription("Link module URI description")
                                  .setId("LINK_MODULE_URI_ID"),
                              new Uri()
                                  .setUri("tel:6505555555")
                                  .setDescription("Link module tel description")
                                  .setId("LINK_MODULE_TEL_ID"))))
              .setImageModulesData(
                      List.of(
                              new ImageModuleData()
                                      .setMainImage(
                                              new Image()
                                                      .setSourceUri(
                                                              new ImageUri()
                                                                      .setUri(
                                                                              "http://farm4.staticflickr.com/3738/12440799783_3dc3c20606_b.jpg"))
                                                      .setContentDescription(
                                                              new LocalizedString()
                                                                      .setDefaultValue(
                                                                              new TranslatedString()
                                                                                      .setLanguage("en-US")
                                                                                      .setValue("Image module description"))))
                                      .setId("IMAGE_MODULE_ID")))
              .setBarcode(new Barcode().setType("QR_CODE").setValue("QR code value"))
              .setLocations(
                      List.of(
                              new LatLongPoint()
                                      .setLatitude(37.424015499999996)
                                      .setLongitude(-122.09259560000001)))
              .setValidTimeInterval(
                  new TimeInterval()
                      .setStart(new DateTime().setDate("2023-06-12T23:20:50.52Z"))
                      .setEnd(new DateTime().setDate("2023-12-12T23:20:50.52Z")));
    
      OfferObject response = service.offerobject().insert(newObject).execute();
    
      System.out.println("Object insert response");
      System.out.println(response.toPrettyString());
    
      return response.getId();
    }

    PHP

    برای شروع ادغام در PHP، به نمونه کدهای کامل ما در GitHub مراجعه کنید.

    /**
     * Create an object.
     *
     * @param string $issuerId The issuer ID being used for this request.
     * @param string $classSuffix Developer-defined unique ID for this pass class.
     * @param string $objectSuffix Developer-defined unique ID for this pass object.
     *
     * @return string The pass object ID: "{$issuerId}.{$objectSuffix}"
     */
    public function createObject(string $issuerId, string $classSuffix, string $objectSuffix)
    {
      // Check if the object exists
      try {
        $this->service->offerobject->get("{$issuerId}.{$objectSuffix}");
    
        print("Object {$issuerId}.{$objectSuffix} already exists!");
        return "{$issuerId}.{$objectSuffix}";
      } catch (Google\Service\Exception $ex) {
        if (empty($ex->getErrors()) || $ex->getErrors()[0]['reason'] != 'resourceNotFound') {
          // Something else went wrong...
          print_r($ex);
          return "{$issuerId}.{$objectSuffix}";
        }
      }
    
      // See link below for more information on required properties
      // https://developers.google.com/wallet/retail/offers/rest/v1/offerobject
      $newObject = new OfferObject([
        'id' => "{$issuerId}.{$objectSuffix}",
        'classId' => "{$issuerId}.{$classSuffix}",
        'state' => 'ACTIVE',
        'heroImage' => new Image([
          'sourceUri' => new ImageUri([
            'uri' => 'https://farm4.staticflickr.com/3723/11177041115_6e6a3b6f49_o.jpg'
          ]),
          'contentDescription' => new LocalizedString([
            'defaultValue' => new TranslatedString([
              'language' => 'en-US',
              'value' => 'Hero image description'
            ])
          ])
        ]),
        'textModulesData' => [
          new TextModuleData([
            'header' => 'Text module header',
            'body' => 'Text module body',
            'id' => 'TEXT_MODULE_ID'
          ])
        ],
        'linksModuleData' => new LinksModuleData([
          'uris' => [
            new Uri([
              'uri' => 'http://maps.google.com/',
              'description' => 'Link module URI description',
              'id' => 'LINK_MODULE_URI_ID'
            ]),
            new Uri([
              'uri' => 'tel:6505555555',
              'description' => 'Link module tel description',
              'id' => 'LINK_MODULE_TEL_ID'
            ])
          ]
        ]),
        'imageModulesData' => [
          new ImageModuleData([
            'mainImage' => new Image([
              'sourceUri' => new ImageUri([
                'uri' => 'http://farm4.staticflickr.com/3738/12440799783_3dc3c20606_b.jpg'
              ]),
              'contentDescription' => new LocalizedString([
                'defaultValue' => new TranslatedString([
                  'language' => 'en-US',
                  'value' => 'Image module description'
                ])
              ])
            ]),
            'id' => 'IMAGE_MODULE_ID'
          ])
        ],
        'barcode' => new Barcode([
          'type' => 'QR_CODE',
          'value' => 'QR code value'
        ]),
        'locations' => [
          new LatLongPoint([
            'latitude' => 37.424015499999996,
            'longitude' =>  -122.09259560000001
          ])
        ],
        'validTimeInterval' => new TimeInterval([
          'start' => new DateTime([
            'date' => '2023-06-12T23:20:50.52Z'
          ]),
          'end' => new DateTime([
            'date' => '2023-12-12T23:20:50.52Z'
          ])
        ])
      ]);
    
      $response = $this->service->offerobject->insert($newObject);
    
      print "Object insert response\n";
      print_r($response);
    
      return $response->id;
    }

    Python

    برای شروع ادغام در Python، به نمونه‌های کد کامل ما در GitHub مراجعه کنید.

    def create_object(self, issuer_id: str, class_suffix: str,
                      object_suffix: str) -> str:
        """Create an object.
    
        Args:
            issuer_id (str): The issuer ID being used for this request.
            class_suffix (str): Developer-defined unique ID for the pass class.
            object_suffix (str): Developer-defined unique ID for the pass object.
    
        Returns:
            The pass object ID: f"{issuer_id}.{object_suffix}"
        """
    
        # Check if the object exists
        try:
            self.client.offerobject().get(resourceId=f'{issuer_id}.{object_suffix}').execute()
        except HttpError as e:
            if e.status_code != 404:
                # Something else went wrong...
                print(e.error_details)
                return f'{issuer_id}.{object_suffix}'
        else:
            print(f'Object {issuer_id}.{object_suffix} already exists!')
            return f'{issuer_id}.{object_suffix}'
    
        # See link below for more information on required properties
        # https://developers.google.com/wallet/retail/offers/rest/v1/offerobject
        new_object = {
            'id': f'{issuer_id}.{object_suffix}',
            'classId': f'{issuer_id}.{class_suffix}',
            'state': 'ACTIVE',
            'heroImage': {
                'sourceUri': {
                    'uri':
                        'https://farm4.staticflickr.com/3723/11177041115_6e6a3b6f49_o.jpg'
                },
                'contentDescription': {
                    'defaultValue': {
                        'language': 'en-US',
                        'value': 'Hero image description'
                    }
                }
            },
            'textModulesData': [{
                'header': 'Text module header',
                'body': 'Text module body',
                'id': 'TEXT_MODULE_ID'
            }],
            'linksModuleData': {
                'uris': [{
                    'uri': 'http://maps.google.com/',
                    'description': 'Link module URI description',
                    'id': 'LINK_MODULE_URI_ID'
                }, {
                    'uri': 'tel:6505555555',
                    'description': 'Link module tel description',
                    'id': 'LINK_MODULE_TEL_ID'
                }]
            },
            'imageModulesData': [{
                'mainImage': {
                    'sourceUri': {
                        'uri':
                            'http://farm4.staticflickr.com/3738/12440799783_3dc3c20606_b.jpg'
                    },
                    'contentDescription': {
                        'defaultValue': {
                            'language': 'en-US',
                            'value': 'Image module description'
                        }
                    }
                },
                'id': 'IMAGE_MODULE_ID'
            }],
            'barcode': {
                'type': 'QR_CODE',
                'value': 'QR code'
            },
            'locations': [{
                'latitude': 37.424015499999996,
                'longitude': -122.09259560000001
            }],
            'validTimeInterval': {
                'start': {
                    'date': '2023-06-12T23:20:50.52Z'
                },
                'end': {
                    'date': '2023-12-12T23:20:50.52Z'
                }
            }
        }
    
        # Create the object
        response = self.client.offerobject().insert(body=new_object).execute()
    
        print('Object insert response')
        print(response)
    
        return f'{issuer_id}.{object_suffix}'

    C#‎

    برای شروع ادغام در C#‎، به نمونه کدهای کامل ما در GitHub مراجعه کنید.

    /// <summary>
    /// Create an object.
    /// </summary>
    /// <param name="issuerId">The issuer ID being used for this request.</param>
    /// <param name="classSuffix">Developer-defined unique ID for this pass class.</param>
    /// <param name="objectSuffix">Developer-defined unique ID for this pass object.</param>
    /// <returns>The pass object ID: "{issuerId}.{objectSuffix}"</returns>
    public string CreateObject(string issuerId, string classSuffix, string objectSuffix)
    {
      // Check if the object exists
      Stream responseStream = service.Offerobject
          .Get($"{issuerId}.{objectSuffix}")
          .ExecuteAsStream();
    
      StreamReader responseReader = new StreamReader(responseStream);
      JObject jsonResponse = JObject.Parse(responseReader.ReadToEnd());
    
      if (!jsonResponse.ContainsKey("error"))
      {
        Console.WriteLine($"Object {issuerId}.{objectSuffix} already exists!");
        return $"{issuerId}.{objectSuffix}";
      }
      else if (jsonResponse["error"].Value<int>("code") != 404)
      {
        // Something else went wrong...
        Console.WriteLine(jsonResponse.ToString());
        return $"{issuerId}.{objectSuffix}";
      }
    
      // See link below for more information on required properties
      // https://developers.google.com/wallet/retail/offers/rest/v1/offerobject
      OfferObject newObject = new OfferObject
      {
        Id = $"{issuerId}.{objectSuffix}",
        ClassId = $"{issuerId}.{classSuffix}",
        State = "ACTIVE",
        HeroImage = new Image
        {
          SourceUri = new ImageUri
          {
            Uri = "https://farm4.staticflickr.com/3723/11177041115_6e6a3b6f49_o.jpg"
          },
          ContentDescription = new LocalizedString
          {
            DefaultValue = new TranslatedString
            {
              Language = "en-US",
              Value = "Hero image description"
            }
          }
        },
        TextModulesData = new List<TextModuleData>
        {
          new TextModuleData
          {
            Header = "Text module header",
            Body = "Text module body",
            Id = "TEXT_MODULE_ID"
          }
        },
        LinksModuleData = new LinksModuleData
        {
          Uris = new List<Google.Apis.Walletobjects.v1.Data.Uri>
          {
            new Google.Apis.Walletobjects.v1.Data.Uri
            {
              UriValue = "http://maps.google.com/",
              Description = "Link module URI description",
              Id = "LINK_MODULE_URI_ID"
            },
            new Google.Apis.Walletobjects.v1.Data.Uri
            {
              UriValue = "tel:6505555555",
              Description = "Link module tel description",
              Id = "LINK_MODULE_TEL_ID"
            }
          }
        },
        ImageModulesData = new List<ImageModuleData>
        {
          new ImageModuleData
          {
            MainImage = new Image
            {
              SourceUri = new ImageUri
              {
                Uri = "http://farm4.staticflickr.com/3738/12440799783_3dc3c20606_b.jpg"
              },
              ContentDescription = new LocalizedString
              {
                DefaultValue = new TranslatedString
                {
                  Language = "en-US",
                  Value = "Image module description"
                }
              }
            },
            Id = "IMAGE_MODULE_ID"
          }
        },
        Barcode = new Barcode
        {
          Type = "QR_CODE",
          Value = "QR code"
        },
        Locations = new List<LatLongPoint>
        {
          new LatLongPoint
          {
            Latitude = 37.424015499999996,
            Longitude = -122.09259560000001
          }
        },
        ValidTimeInterval = new TimeInterval
        {
          Start = new Google.Apis.Walletobjects.v1.Data.DateTime
          {
            Date = "2023-06-12T23:20:50.52Z"
          },
          End = new Google.Apis.Walletobjects.v1.Data.DateTime
          {
            Date = "2023-12-12T23:20:50.52Z"
          }
        }
      };
    
      responseStream = service.Offerobject
          .Insert(newObject)
          .ExecuteAsStream();
      responseReader = new StreamReader(responseStream);
      jsonResponse = JObject.Parse(responseReader.ReadToEnd());
    
      Console.WriteLine("Object insert response");
      Console.WriteLine(jsonResponse.ToString());
    
      return $"{issuerId}.{objectSuffix}";
    }

    Node.js

    برای شروع ادغام در Node، به نمونه‌های کد کامل ما در GitHub مراجعه کنید.

    /**
     * Create an object.
     *
     * @param {string} issuerId The issuer ID being used for this request.
     * @param {string} classSuffix Developer-defined unique ID for the pass class.
     * @param {string} objectSuffix Developer-defined unique ID for the pass object.
     *
     * @returns {string} The pass object ID: `${issuerId}.${objectSuffix}`
     */
    async createObject(issuerId, classSuffix, objectSuffix) {
      let response;
    
      // Check if the object exists
      try {
        response = await this.client.offerobject.get({
          resourceId: `${issuerId}.${objectSuffix}`
        });
    
        console.log(`Object ${issuerId}.${objectSuffix} already exists!`);
    
        return `${issuerId}.${objectSuffix}`;
      } catch (err) {
        if (err.response && err.response.status !== 404) {
          // Something else went wrong...
          console.log(err);
          return `${issuerId}.${objectSuffix}`;
        }
      }
    
      // See link below for more information on required properties
      // https://developers.google.com/wallet/retail/offers/rest/v1/offerobject
      let newObject = {
        'id': `${issuerId}.${objectSuffix}`,
        'classId': `${issuerId}.${classSuffix}`,
        'state': 'ACTIVE',
        'heroImage': {
          'sourceUri': {
            'uri': 'https://farm4.staticflickr.com/3723/11177041115_6e6a3b6f49_o.jpg'
          },
          'contentDescription': {
            'defaultValue': {
              'language': 'en-US',
              'value': 'Hero image description'
            }
          }
        },
        'textModulesData': [
          {
            'header': 'Text module header',
            'body': 'Text module body',
            'id': 'TEXT_MODULE_ID'
          }
        ],
        'linksModuleData': {
          'uris': [
            {
              'uri': 'http://maps.google.com/',
              'description': 'Link module URI description',
              'id': 'LINK_MODULE_URI_ID'
            },
            {
              'uri': 'tel:6505555555',
              'description': 'Link module tel description',
              'id': 'LINK_MODULE_TEL_ID'
            }
          ]
        },
        'imageModulesData': [
          {
            'mainImage': {
              'sourceUri': {
                'uri': 'http://farm4.staticflickr.com/3738/12440799783_3dc3c20606_b.jpg'
              },
              'contentDescription': {
                'defaultValue': {
                  'language': 'en-US',
                  'value': 'Image module description'
                }
              }
            },
            'id': 'IMAGE_MODULE_ID'
          }
        ],
        'barcode': {
          'type': 'QR_CODE',
          'value': 'QR code'
        },
        'locations': [
          {
            'latitude': 37.424015499999996,
            'longitude': -122.09259560000001
          }
        ],
        'validTimeInterval': {
          'start': {
            'date': '2023-06-12T23:20:50.52Z'
          },
          'end': {
            'date': '2023-12-12T23:20:50.52Z'
          }
        }
      };
    
      response = await this.client.offerobject.insert({
        requestBody: newObject
      });
    
      console.log('Object insert response');
      console.log(response);
    
      return `${issuerId}.${objectSuffix}`;
    }

    رفتن

    برای شروع ادغام در Go، به نمونه کدهای کامل ما در GitHub مراجعه کنید نمونه کدهای Github.

    // Create an object.
    func (d *demoOffer) createObject(issuerId, classSuffix, objectSuffix string) {
    	offerObject := new(walletobjects.OfferObject)
    	offerObject.Id = fmt.Sprintf("%s.%s", issuerId, objectSuffix)
    	offerObject.ClassId = fmt.Sprintf("%s.%s", issuerId, classSuffix)
    	offerObject.State = "ACTIVE"
    	offerObject.ValidTimeInterval = &walletobjects.TimeInterval{
    		Start: &walletobjects.DateTime{
    			Date: "2023-06-12T23:20:50.52Z",
    		},
    		End: &walletobjects.DateTime{
    			Date: "2023-12-12T23:20:50.52Z",
    		},
    	}
    	offerObject.HeroImage = &walletobjects.Image{
    		SourceUri: &walletobjects.ImageUri{
    			Uri: "https://farm4.staticflickr.com/3723/11177041115_6e6a3b6f49_o.jpg",
    		},
    	}
    	offerObject.Barcode = &walletobjects.Barcode{
    		Type:  "QR_CODE",
    		Value: "QR code",
    	}
    	offerObject.Locations = []*walletobjects.LatLongPoint{
    		&walletobjects.LatLongPoint{
    			Latitude:  37.424015499999996,
    			Longitude: -122.09259560000001,
    		},
    	}
    	offerObject.LinksModuleData = &walletobjects.LinksModuleData{
    		Uris: []*walletobjects.Uri{
    			&walletobjects.Uri{
    				Id:          "LINK_MODULE_URI_ID",
    				Uri:         "http://maps.google.com/",
    				Description: "Link module URI description",
    			},
    			&walletobjects.Uri{
    				Id:          "LINK_MODULE_TEL_ID",
    				Uri:         "tel:6505555555",
    				Description: "Link module tel description",
    			},
    		},
    	}
    	offerObject.ImageModulesData = []*walletobjects.ImageModuleData{
    		&walletobjects.ImageModuleData{
    			Id: "IMAGE_MODULE_ID",
    			MainImage: &walletobjects.Image{
    				SourceUri: &walletobjects.ImageUri{
    					Uri: "http://farm4.staticflickr.com/3738/12440799783_3dc3c20606_b.jpg",
    				},
    			},
    		},
    	}
    	offerObject.TextModulesData = []*walletobjects.TextModuleData{
    		&walletobjects.TextModuleData{
    			Body:   "Text module body",
    			Header: "Text module header",
    			Id:     "TEXT_MODULE_ID",
    		},
    	}
    
    	res, err := d.service.Offerobject.Insert(offerObject).Do()
    	if err != nil {
    		log.Fatalf("Unable to insert object: %v", err)
    	} else {
    		fmt.Printf("Object insert id:\n%s\n", res.Id)
    	}
    }

    پس‌از تکمیل، «شیء مجوزهای» مشتری‌تان در سرور ایجاد خواهد شد. بااین‌حال، در این مرحله، «شیء مجوزها» به کاربر Google یا دستگاه او پیوند داده نشده است. برای اینکه مجوز با کاربر «کیف پول Google» مرتبط شود، باید مجوز را صادر کنید.