إعدادات حساب جهة الإصدار

المتطلبات الأساسية

تأكد من إكمال الخطوات التالية قبل المتابعة:

تحديد الحساب الذي تريد تفعيله لاستخدام "الدفع الذكي"

قبل المتابعة، عليك تحديد الحساب الذي سيتم تعيينه كـ حساب جهة إصدار تحصيل القيمة هناك طريقتان لتحديد ذلك:

إنشاء حساب جهة إصدار جديد

ويجب أن تحتوي معلومات الاتصال للحساب الجديد على معلومات المعلومات. للحصول على تعليمات حول كيفية تنفيذ هذا الإجراء في تطبيق Google Pay محفظة Google وحدة التحكّم، يُرجى الرجوع إلى هذا مقالة مساعدة يوضح نموذج الرمز التالي إنشاء حساب جهة إصدار باستخدام واجهة برمجة تطبيقات محفظة Google:

Java

/**
 * Create a new Google Wallet Issuer account.
 *
 * @param issuerName The Issuer's name.
 * @param issuerEmail The Issuer's email address.
 * @throws IOException
 */
public void CreateIssuerAccount(String issuerName, String issuerEmail) throws IOException {
  // New Issuer information
  Issuer issuer =
      new Issuer()
          .setName(issuerName)
          .setContactInfo(new IssuerContactInfo().setEmail(issuerEmail));

  Issuer response = service.issuer().insert(issuer).execute();

  System.out.println("Issuer insert response");
  System.out.println(response.toPrettyString());
}

PHP

/**
 * Create a new Google Wallet issuer account.
 *
 * @param string $issuerName The Issuer's name.
 * @param string $issuerEmail The Issuer's email address.
 */
public function createIssuerAccount(string $issuerName, string $issuerEmail)
{
  // New Issuer information
  $issuer = new Google_Service_Walletobjects_Issuer([
    'name' => $issuerName,
    'contactInfo' => new Google_Service_Walletobjects_IssuerContactInfo([
      'email' => $issuerEmail,
    ]),
  ]);

  $response = $this->service->issuer->insert($issuer);

  print "Issuer insert response\n";
  print_r($response);
}

Python

def create_issuer_account(self, issuer_name: str, issuer_email: str):
    """Create a new Google Wallet Issuer account.

    Args:
        issuer_name (str): The Issuer's name.
        issuer_email (str): The Issuer's email address.
    """
    # New Issuer information
    issuer = {'name': issuer_name, 'contactInfo': {'email': issuer_email}}

    # Make the POST request
    response = self.http_client.post(url=self.issuer_url, json=issuer)

    print('Issuer insert response')
    print(response.text)

#C

/// <summary>
/// Create a new Google Wallet Issuer account.
/// </summary>
/// <param name="issuerName">The Issuer's name.</param>
/// <param name="issuerEmail">The Issuer's email address.</param>
public void CreateIssuerAccount(string issuerName, string issuerEmail)
{
  // New issuer information
  Issuer issuer = new Issuer()
  {
    ContactInfo = new IssuerContactInfo()
    {
      Email = issuerEmail
    },
    Name = issuerName,
  };

  Stream responseStream = service.Issuer
      .Insert(issuer)
      .ExecuteAsStream();
  StreamReader responseReader = new StreamReader(responseStream);
  JObject jsonResponse = JObject.Parse(responseReader.ReadToEnd());

  Console.WriteLine("Issuer insert response");
  Console.WriteLine(jsonResponse.ToString());
}

Node.js

/**
 * Create a new Google Wallet Issuer account.
 *
 * @param {string} issuerName The Issuer's name.
 * @param {string} issuerEmail The Issuer's email address.
 */
async createIssuerAccount(issuerName, issuerEmail) {
  // New Issuer information
  let issuer = {
    name: issuerName,
    contactInfo: {
      email: issuerEmail
    }
  };

  let response = await this.httpClient.request({
    url: this.issuerUrl,
    method: 'POST',
    data: issuer
  });

  console.log('Issuer insert response');
  console.log(response);
}

في البداية، فقط المستخدم الرئيسي (حساب الخدمة أو المستخدم) الذي أنشأ جهة الإصدار حق الوصول. سيكون عليك تعديل أذونات جهة الإصدار. لتضمين أي مستخدمين إضافيين أو حسابات خدمة إضافية يمكن أن تكون لإدارة البطاقات يوضح نموذج الرمز البرمجي التالي معلومات حول جهة الإصدار أذونات الحساب.

Java

/**
 * Update permissions for an existing Google Wallet Issuer account.
 *
 * <p><strong>Warning:</strong> This operation overwrites all existing permissions!
 *
 * <p>Example permissions list argument below. Copy the add entry as needed for each email address
 * that will need access. Supported values for role are: 'READER', 'WRITER', and 'OWNER'
 *
 * <pre><code>
 * ArrayList<Permission> permissions = new ArrayList<Permission>();
 * permissions.add(new Permission().setEmailAddress("emailAddress").setRole("OWNER"));
 * </code></pre>
 *
 * @param issuerId The Issuer ID being used for this request.
 * @param permissions The list of email addresses and roles to assign.
 * @throws IOException
 */
public void UpdateIssuerAccountPermissions(String issuerId, ArrayList<Permission> permissions)
    throws IOException {

  Permissions response =
      service
          .permissions()
          .update(
              Long.parseLong(issuerId),
              new Permissions().setIssuerId(Long.parseLong(issuerId)).setPermissions(permissions))
          .execute();

  System.out.println("Issuer permissions update response");
  System.out.println(response.toPrettyString());
}

PHP

/**
 * Update permissions for an existing Google Wallet Issuer account.
 *
 * **Warning:** This operation overwrites all existing permissions!
 *
 * Example permissions list argument below. Copy the entry as
 * needed for each email address that will need access. Supported
 * values for role are: 'READER', 'WRITER', and 'OWNER'
 *
 * $permissions = array(
 *  new Google_Service_Walletobjects_Permission([
 *    'emailAddress' => 'email-address',
 *    'role' => 'OWNER',
 *  ]),
 * );
 *
 * @param string $issuerId The Issuer ID being used for this request.
 * @param array $permissions The list of email addresses and roles to assign.
 */
public function updateIssuerAccountPermissions(string $issuerId, array $permissions)
{
  // Make the PUT request
  $response = $this->service->permissions->update(
    $issuerId,
    new Google_Service_Walletobjects_Permissions([
      'issuerId' => $issuerId,
      'permissions' => $permissions,
    ])
  );

  print "Permissions update response\n";
  print_r($response);
}

Python

def update_issuer_account_permissions(self, issuer_id: str,
                                      permissions: List):
    """Update permissions for an existing Google Wallet Issuer account.

    **Warning:** This operation overwrites all existing permissions!

    Example permissions list argument below. Copy the dict entry as
    needed for each email address that will need access. Supported
    values for role are: 'READER', 'WRITER', and 'OWNER'

    permissions = [
        {
            'emailAddress': 'email-address',
            'role': 'OWNER'
        }
    ]

    Args:
        issuer_id (str): The Issuer ID being used for this request.
        permissions (List): The list of email addresses and roles to assign.
    """
    response = self.http_client.put(url=f'{self.permissions_url}/{issuer_id}',
                                    json={
                                        'issuerId': issuer_id,
                                        'permissions': permissions
                                    })

    print('Permissions update response')
    print(response.text)

#C

/// <summary>
/// Update permissions for an existing Google Wallet Issuer account.
/// <para />
/// <strong>Warning:</strong> This operation overwrites all existing permissions!
/// <para />
/// Example permissions list argument below. Copy the add entry as needed for each email
/// address that will need access.Supported values for role are: 'READER', 'WRITER', and 'OWNER'
/// <para />
/// <![CDATA[List&lt;Permission> permissions = new List&lt;Permission>();]]>
/// <para />
/// permissions.Add(new Permission { EmailAddress = "emailAddress", Role = "OWNER"});
/// </summary>
/// <param name="issuerId">The issuer ID being used for this request.</param>
/// <param name="permissions">The list of email addresses and roles to assign.</param>
public void UpdateIssuerAccountPermissions(string issuerId, List<Permission> permissions)
{
  Stream responseStream = service.Permissions
      .Update(new Permissions
      {
        IssuerId = long.Parse(issuerId),
        PermissionsValue = permissions
      },
      long.Parse(issuerId))
      .ExecuteAsStream();
  StreamReader responseReader = new StreamReader(responseStream);
  JObject jsonResponse = JObject.Parse(responseReader.ReadToEnd());

  Console.WriteLine("Issuer permissions update response");
  Console.WriteLine(jsonResponse.ToString());
}

Node.js

/**
 * Update permissions for an existing Google Wallet Issuer account.
 *
 * **Warning:** This operation overwrites all existing permissions!
 *
 * Example permissions list argument below. Copy the dict entry as
 * needed for each email address that will need access. Supported
 * values for role are: 'READER', 'WRITER', and 'OWNER'
 *
 * let permissions = [
 *  {
 *    'emailAddress': 'email-address',
 *    'role': 'OWNER',
 *  },
 * ];
 *
 * @param {string} issuerId The Issuer ID being used for this request.
 * @param {Array} permissions The list of email addresses and roles to assign.
 */
async updateIssuerPermissions(issuerId, permissions) {
  let response = await this.httpClient.request({
    url: `${this.permissionsUrl}/${issuerId}`,
    method: 'PUT',
    data: {
      issuerId: issuerId,
      permissions: permissions
    }
  });

  console.log('Permissions update response');
  console.log(response);
}

استخدام حساب حالي

يجب استخدام المعايير التالية لتحديد ما إذا كان بإمكانك الاستعانة بجهة إصدار. يحتوي على فئات بطاقات حالية.

  • إذا كان حساب جهة الإصدار الخاص بتطوير البطاقة يحتوي على فئات تجّار آخرين، يجب إعداد حساب جديد نيابةً عن كتاجر.
  • إذا كان حساب جهة الإصدار المخصّص لتطوير البطاقة يتضمّن فئات فقط لذلك التاجر تحديدًا، يمكنك استخدامه

إذا كان الحساب يستوفي هذه المعايير، عليك تعديل معلومات الاتصال. في الملف التجاري مع معلومات التاجر للتأكد من أنّ الحساب يحدد هوية التاجر. يجب ألا يكون لأحد غيرك حق الوصول إلى واجهة برمجة التطبيقات لهذا الحساب. على مطوّري البطاقات الإضافية إنشاء حسابات جهة إصدار خاصة بهم.

إعدادات حساب جهة إصدار تحصيل القيمة

استخدام تطبيق Google Pay وحدة التحكم في المحفظة

في حساب جهة إصدار تحصيل القيمة، عليك اتّباع الخطوات التالية:

  1. الانتقال إلى القسم Google Wallet API
  2. اختيار ميزات إضافية
  3. اختَر إضافة مفتاح مصادقة.
  4. تحميل مفتاح عام (ملف .pem) وتحديد إصدار المفتاح
  5. اختَر إنشاء مفتاح مصادقة.

وسيتم توفير رقم تعريف المجمِّع لك بعد الانتهاء من إعداد مفتاح المصادقة. تم التحميل بنجاح.

-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEchyXj869zfmKhRi9xP7f2AK07kEo
4lE7ZlWTN14jh4YBTny+hRGRXcUzevV9zSSPJlPHpqqu5pEwlv1xyFvE1w==
-----END PUBLIC KEY-----

استخدام Google Wallet API

تحميل مفتاح عام

لتعيين المفاتيح العامة وإصدار المفاتيح باستخدام Google Wallet API، سيكون عليك تقديم طلب PATCH إلى نقطة نهاية "جهة الإصدار".

PATCH https://walletobjects.googleapis.com/walletobjects/v1/issuer/{issuerId}

سيبدو نص طلب "PATCH" مشابهًا لما يلي:

{
    "smartTapMerchantData": {
        "authenticationKeys": [
            {
                "id": 1,
                "publicKeyPem": "-----BEGIN PUBLIC KEY-----\n...\n-----END PUBLIC KEY-----"
            },
            {
                "id": 2,
                "publicKeyPem": "-----BEGIN PUBLIC KEY-----\n...\n-----END PUBLIC KEY-----"
            }
        ]
    }
}

يوضح نموذج التعليمات البرمجية التالي تحديث حساب جهة الإصدار لتضمين مفتاح عام تجريبي مذكور سابقًا:

Java

/**
 * Add a new public key to an Issuer account.
 *
 * @param issuerId The issuer ID being used for this request.
 * @throws IOException
 */
public void AddSmartTapKey(Long issuerId) throws IOException {
  // New smart tap key information
  Issuer patchBody =
      new Issuer()
          .setSmartTapMerchantData(
              new SmartTapMerchantData()
                  .setAuthenticationKeys(
                      Arrays.asList(
                          new AuthenticationKey()
                              .setId(1)
                              .setPublicKeyPem(
                                  "-----BEGIN PUBLIC KEY-----\n"
                                      + "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEchyXj869zfmKhRi9xP7f2AK07kEo\n"
                                      + "4lE7ZlWTN14jh4YBTny+hRGRXcUzevV9zSSPJlPHpqqu5pEwlv1xyFvE1w==\n"
                                      + "-----END PUBLIC KEY-----"))));

  Issuer response = service.issuer().patch(issuerId, patchBody).execute();

  System.out.println("Issuer patch response");
  System.out.println(response.toPrettyString());
}

PHP

/**
 * Add a new public key to an Issuer account.
 *
 * @param string $issuerId The issuer ID being used for this request.
 */
public function addSmartTapKey(string $issuerId)
{
  // New smart tap key information
  $patchBody = new Google_Service_Walletobjects_Issuer([
    'smartTapMerchantData' => new Google_Service_Walletobjects_SmartTapMerchantData([
      'authenticationKeys' => [
        new Google_Service_Walletobjects_AuthenticationKey([
          'id' => 1,
          'publicKeyPem' => "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEchyXj869zfmKhRi9xP7f2AK07kEo\n4lE7ZlWTN14jh4YBTny+hRGRXcUzevV9zSSPJlPHpqqu5pEwlv1xyFvE1w==\n-----END PUBLIC KEY-----"
        ])
      ]
    ])
  ]);

  $response = $this->service->issuer->patch($issuerId, $patchBody);

  print "Issuer patch response\n";
  print_r($response);
}

Python

def add_smart_tap_key(self, issuer_id: str) -> str:
    """Add a new public key to an Issuer account.

    Args:
        issuer_id (str): The issuer ID being used for this request.
    """
    # New smart tap key information
    patch_body = {
        'smartTapMerchantData': {
            'authenticationKeys': [{
                'id':
                    1,
                'publicKeyPem':
                    '-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEchyXj869zfmKhRi9xP7f2AK07kEo\n4lE7ZlWTN14jh4YBTny+hRGRXcUzevV9zSSPJlPHpqqu5pEwlv1xyFvE1w==\n-----END PUBLIC KEY-----'
            }]
        }
    }

    # Make the PATCH request
    response = self.http_client.patch(url=f'{self.issuer_url}/{issuer_id}', json=patch_body)

    print('Issuer patch response')
    print(response.text)

    return response.json()['smartTapMerchantData']['smartTapMerchantId']

#C

/// <summary>
/// Add a new public key to an Issuer account.
/// </summary>
/// <param name="issuerId">The issuer ID being used for this request.</param>
public void AddSmartTapKey(long issuerId)
{
  // New smart tap key information
  Issuer patchBody = new Issuer()
  {
    SmartTapMerchantData = new SmartTapMerchantData
    {
      AuthenticationKeys = new List<AuthenticationKey>
      {
        new AuthenticationKey
        {
          Id = 1,
          PublicKeyPem = "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEchyXj869zfmKhRi9xP7f2AK07kEo\n4lE7ZlWTN14jh4YBTny+hRGRXcUzevV9zSSPJlPHpqqu5pEwlv1xyFvE1w==\n-----END PUBLIC KEY-----"
        }
      }
    }
  };

  Stream responseStream = service.Issuer
      .Patch(patchBody, issuerId)
      .ExecuteAsStream();
  StreamReader responseReader = new StreamReader(responseStream);
  JObject jsonResponse = JObject.Parse(responseReader.ReadToEnd());

  Console.WriteLine("Issuer patch response");
  Console.WriteLine(jsonResponse.ToString());
}

Node.js

/**
 * Add a new public key to an Issuer account.
 *
 * @param {string} issuerId The issuer ID being used for this request.
 */
async addSmartTapKey(issuerId) {
  // New smart tap key information
  let patchBody = {
    smartTapMerchantData: {
      authenticationKeys: [
        {
          id: 1,
          publicKeyPem: '-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEchyXj869zfmKhRi9xP7f2AK07kEo\n4lE7ZlWTN14jh4YBTny+hRGRXcUzevV9zSSPJlPHpqqu5pEwlv1xyFvE1w==\n-----END PUBLIC KEY-----'
        }
      ]
    }
  };

  let response = await this.httpClient.request({
    url: `${this.issuerUrl}/${issuerId}`,
    method: 'PATCH',
    data: patchBody
  });

  console.log('Issuer patch response');
  console.log(response);
}

سيتضمّن الردّ الرسالة التي أرسلتها بالإضافة إلى حقل إضافي smartTapMerchantData.smartTapMerchantId هذا هو الرقم التعريفي للمجمِّع حساب جهة إصدار تحصيل القيمة

الحصول على معرّف المجمِّع

بعد إضافة أي مفاتيح وإصدارات رئيسية، يمكنك استخدام Google Wallet API للحصول على رقم تعريف المجمِّع الخاص بك من خلال تقديم طلب GET إلى نقطة نهاية "جهة الإصدار"

GET https://walletobjects.googleapis.com/walletobjects/v1/issuer/{issuerId}

Java

/**
 * Get the Collector ID for an Issuer account.
 *
 * @param issuerId The issuer ID being used for this request.
 * @return The Collector ID
 * @throws IOException
 */
public Long GetCollectorId(Long issuerId) throws IOException {
  Issuer response = service.issuer().get(issuerId).execute();

  System.out.println("Issuer patch response");
  System.out.println(response.toPrettyString());

  return response.getSmartTapMerchantData().getSmartTapMerchantId();
}

PHP

/**
 * Get the Collector ID for an Issuer account.
 *
 * @param string $issuerId The issuer ID being used for this request.
 * @return string The Collector ID.
 */
public function getCollectorId(string $issuerId)
{
  $response = $this->service->issuer->get($issuerId);

  print "Issuer get response\n";
  print_r($response);

  return $response['smartTapMerchantData']['smartTapMerchantId'];
}

Python

def get_collector_id(self, issuer_id: str) -> str:
    """Get the Collector ID for an Issuer account.

    Args:
        issuer_id (str): The issuer ID being used for this request.
    """
    # Make the GET request
    response = self.http_client.get(url=f'{self.issuer_url}/{issuer_id}')

    print('Issuer get response')
    print(response.text)

    return response.json()['smartTapMerchantData']['smartTapMerchantId']

#C

/// <summary>
/// Get the Collector ID for an Issuer account.
/// </summary>
/// <param name="issuerId">The issuer ID being used for this request.</param>
/// <returns>The Collector ID</returns>
public string GetCollectorId(long issuerId)
{
  Stream responseStream = service.Issuer
      .Get(issuerId)
      .ExecuteAsStream();
  StreamReader responseReader = new StreamReader(responseStream);
  JObject jsonResponse = JObject.Parse(responseReader.ReadToEnd());

  Console.WriteLine("Issuer get response");
  Console.WriteLine(jsonResponse.ToString());

  return jsonResponse["smartTapMerchantData"]["smartTapMerchantId"].Value<string>();
}

Node.js

/**
 * Get the Collector ID for an Issuer account.
 *
 * @param {string} issuerId The issuer ID being used for this request.
 *
 * @returns {string} The Collector ID
 */
async getCollectorId(issuerId) {
  let response = await this.httpClient.request({
    url: `${this.issuerUrl}/${issuerId}`,
    method: 'GET'
  });

  console.log('Issuer patch response');
  console.log(response);

  return response.data.smartTapMerchantData.smartTapMerchantId;
}

سيتضمّن الردّ الحقل "smartTapMerchantData.smartTapMerchantId". هذا هو رقم تعريف المجمِّع لحساب جهة إصدار تحصيل القيمة.

إدارة حساب جهة الإصدار

تنظيم البطاقة

هناك نهجان شائعان لإدارة فئات البطاقات وكائناتها تجّار متعدّدون:

  • حساب جهة إصدار مركزي واحد لجميع التجّار
  • حساب جهة إصدار واحد جديد لكل تاجر

على سبيل المثال، يدير برنامج Foo- loyalty برامج ولاء منفصلة لتاجرَين: ILuvCoffee وTeaLuv. يمكن إدارة فئات البطاقات الخاصة بهم في أي من الطرق التالية:

الطريقة الوصف
حساب جهة إصدار واحدة تحتوي على جميع فئات الولاء ضمن جهة إصدار واحدة لحساب "Foo-navigation". يُنصح بهذا الخيار إذا كنت تنوي تتبّع أماكن البطاقات قابلة للاسترداد على مستوى الفئة. من المهم أيضًا خيارًا جيدًا إذا لم تمنح التجار مطلقًا إمكانية الوصول إلى واجهة برمجة التطبيقات لحساب جهة الإصدار هذا
حسابات جهات الإصدار المنفصلة يجب إنشاء حسابَين منفصلَين لجهة الإصدار: "iLuvCoffee. عبر Foo-ّْ و"teaLuv عبر Foo- loyalty". ويوصى بهذا الخيار إذا كنت تريد افتراض أن جميع الفئات ضمن حساب جهة إصدار معيّن قابلة للاسترداد على مستوى التاجر، أو إذا تخطّط لمنح التجّار إذن الوصول إلى حساب جهة الإصدار

حساب جهة إصدار عمليات تحصيل القيمة

هناك سيناريوهان يجب أخذهما في الاعتبار عند تحديد طريقة تحصيل القيمة الصحيحة حساب جهة الإصدار المراد استخدامه

السيناريو 1: يستخدم التاجر ميزة "الدفع الذكي" حاليًا

إذا أكّد التاجر أنّه يمكنه تحصيل قيمة الحزمة من "محفظة Google" باستخدام محطات الدفع (سبق أن تم إعداد التاجر كجهة إصدار مختلفة لتحصيل القيمة)، اتّبِع الخطوات أدناه:

  1. طلب الرقم التعريفي لجهة إصدار تحصيل القيمة الخاص بالتاجر
  2. أضِف رقم تعريف جهة إصدار تحصيل القيمة الخاصة بالتاجر إلى الموقع الإلكتروني redemptionIssuers. من فئة البطاقة

السيناريو 2: التاجر جديد في استخدام ميزة "الدفع الذكي"

في هذا السيناريو، يضمّ التاجر محطات دفع متوافقة مع "الدفع الذكي" ولكنّها غير متاحة. استخدمت الميزة. الإجراءات التي سينفّذها التاجر أو موفِّر محطات الدفع أو مطوِّر البطاقات يجب إعداد الميزة لمرة واحدة لتفعيل "الدفع الذكي" على محطات الدفع لدى التاجر.

لمزيد من المعلومات، يُرجى مراجعة إعدادات التاجر: