Google Cüzdan kartı geliştirme akışı

Google Cüzdan API'si, hediye kartları, biniş kartları, etkinlik biletleri gibi belirli kullanım alanları için optimize edilmiş, önceden tanımlanmış bir dizi kart türü sağlar. Belirli bir geçiş türünün kullanılamadığı durumlara yönelik kullanım amaçlı bir genel geçiş türü de mevcuttur.

Bu makale, Google Cüzdan API'sini kullanarak kart oluşturmak ve göndermek için gereken temel adımlar konusunda bilgi vermek amacıyla hazırlanmıştır. Aşağıda ayrıntılı olarak açıklanan adımlardan bazılarını gerçekleştirmenin birden çok yolu vardır ancak genel olarak tüm geçiş türleri, aynı temel geliştirme akışı izlenerek oluşturulur.

Kart oluşturmayla ilgili ayrıntılı bir adım adım açıklamalı kılavuz için web, e-posta ve SMS veya Android uygulamaları kılavuzlarını inceleyin.

Ne işe yarar?

Kartlar Sınıfı, şablona benzer şekilde birden fazla kartta ortak olan bir özellik kümesi tanımlar. Örneğin, bir etkinliğin biletlerini yayınlıyorsanız Kartlar Sınıfı, etkinlik adı, tarih ve saat gibi tüm biletlerde aynı alanları tanımlar.

Düzenlediğiniz her kartta bir Kartlar Sınıfı belirtilmelidir. Ayrıca, oluşturduğunuz her Kartlar Sınıfına benzersiz bir kimlik atamanız gerekir. Bu kimlik, kart oluştururken bu kimliği referans olarak kullanmak için kullanılır.

Nasıl yapılır?

Kartlar Sınıfı JSON biçiminde tanımlanır ve Google Cüzdan REST API'si, Android SDK'sı veya Google Cüzdan İşletme Konsolu ile oluşturulabilir.

Örnek Kartlar Sınıfını göster

{
  "id": "ISSUER_ID.EVENT_CLASS_ID",
  "issuerName": "[TEST ONLY] Heraldic Event",
  "localizedIssuerName": {
    "defaultValue": {
      "language": "en-US",
      "value": "[TEST ONLY] Heraldic Event"
    }
  },
  "logo": {
    "sourceUri": {
      "uri": "https://images.unsplash.com/photo-1475721027785-f74eccf877e2?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=660&h=660"
    },
    "contentDescription": {
      "defaultValue": {
        "language": "en-US",
        "value": "LOGO_IMAGE_DESCRIPTION"
      }
    }
  },
  "eventName": {
    "defaultValue": {
      "language": "en-US",
      "value": "Google Live"
    }
  },
  "venue": {
    "name": {
      "defaultValue": {
        "language": "en-US",
        "value": "Shoreline Amphitheater"
      }
    },
    "address": {
      "defaultValue": {
        "language": "en-US",
        "value": "ADDRESS_OF_THE_VENUE"
      }
    }
  },
  "dateTime": {
    "start": "2023-04-12T11:30"
  },
  "reviewStatus": "UNDER_REVIEW",
  "hexBackgroundColor": "#264750",
  "heroImage": {
    "sourceUri": {
      "uri": "https://images.unsplash.com/photo-1501281668745-f7f57925c3b4?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1032&h=336"
    },
    "contentDescription": {
      "defaultValue": {
        "language": "en-US",
        "value": "HERO_IMAGE_DESCRIPTION"
      }
    }
  }
}
    

Ne işe yarar?

Kartlar Nesnesi, belirli bir kullanıcıya verilecek benzersiz bir kartın özelliklerini tanımlar. Örneğin, bir etkinlik biletinin Kartlar nesnesi, koltuk numarası veya ilgili biletin QR kodu gibi belirli bir bilete özel alanları tanımlar.

Kartlar Nesnesi oluşturulduğunda, Google Cüzdan API'si yeni bir kartı saklar ve Kartı Veren hesabınızla ilişkilendirir. Depolanmış bu kart, Kartlar nesnesinin benzersiz özellikleri ile ilişkili Kartlar Sınıfının şablon özelliklerinin bir birleşimidir.

Ayrıca her Passes nesnesine benzersiz bir kimlik atamanız gerekir. Bu kimlik, kart verilirken bu kimliği referans göstermek için kullanılır.

Nasıl yapılır?

Kartlar Nesnesi, JSON biçimi olarak tanımlanır ve Google Cüzdan REST API veya Android SDK ile oluşturulabilir.

Örnek Kartlar Nesnesini Göster

{
  "id": "ISSUER_ID.OBJECT_ID",
  "classId": "ISSUER_ID.EVENT_CLASS_ID",
  "state": "ACTIVE",
  "seatInfo": {
    "seat": {
      "defaultValue": {
        "language": "en-us",
        "value": "5"
      }
    },
    "row": {
      "defaultValue": {
        "language": "en-us",
        "value": "G"
      }
    },
    "section": {
      "defaultValue": {
        "language": "en-us",
        "value": "40"
      }
    },
    "gate": {
      "defaultValue": {
        "language": "en-us",
        "value": "3A"
      }
    }
  },
  "barcode": {
    "type": "QR_CODE",
    "value": "BARCODE_VALUE",
    "alternateText": ""
  }
}
    

Ne işe yarar?

Bir kullanıcıya geçiş izni vermek için Passes Sınıfı ve Kartlar Nesnesi, JSON Web Token (JWT) olarak kodlanmalıdır. JWT biçimi, iki taraf arasındaki hak taleplerini temsil etme konusunda yaygın ve açık bir standarttır. Google Cüzdan API'siyle kart verilmesi durumunda JWT'ler, bir kullanıcının, Kartı Veren hesabınızla ilişkili belirli bir karta erişim hakkı olduğuna dair bir talep göndermek için kullanılır.

Google Cüzdan API'sine bir JWT gönderildiğinde, kodlanmış veriler belirli bir kartı tanımlamak ve kullanıcıya vermek için kullanılır. Kart daha önce verilmişse bu veriler Google Cüzdan API'sinin, ilgili kartın aynı olduğunu belirlemesine de olanak tanır. Böylece, söz konusu kart, kullanıcının Google Cüzdan hesabına birden fazla kez eklenmez.

Nasıl yapılır?

JWT'ler, JWT spesifikasyonuna göre JSON biçiminde tanımlanır. Google Cüzdan API'si ile kart vermek üzere JWT tanımlamak için, vermek istediğiniz kart ile ilgili bilgileri JWT'nin payload mülkünde sağlarsınız.

Örnek JWT'yi göster

{
  "iss": "issuer@example.com",
  "aud": "google",
  "typ": "savetowallet",
  "iat": 1696877738,
  "origins": [
    "www.example.com"
  ],
  "payload": {
    "eventTicketObjects": [
      {
        "id": "ISSUER_ID.LOYALTY_OBJECT_SUFFIX"
      }
    ]
  }
}
    

Ne işe yarar?

Kart düzenlemek için Google Cüzdan API'sine gönderilen tüm JWT'ler, daha önce Google Cüzdan İşletme Konsolu'nda sağladığınız kimlik bilgileriyle imzalanmalıdır. İmzalama işleminde, kartlarınızın güvende kalması için JWT'yi şifrelemek ve Google Cüzdan API'sinin, içinde kodlanan kart ayrıntılarının geçerli olduğunu ve Kartı Veren hesabınızla ilişkilendirilmiş olduğunu doğrulamasını sağlamak için kimlik bilgileriniz kullanılır.

Nasıl yapılır?

Google Cüzdan istemci kitaplıkları ve Android SDK'sı, JWT'lerinizi imzalamanız için daha kolay yöntemler sağlar. Ayrıca aralarından seçim yapabileceğiniz kod imzalamanın karmaşıklığını çözen çok sayıda açık kaynak kitaplığı da vardır.

Kart düzenlemek için Google Cüzdan REST API'sini kullananlar için JWT, Google Cloud Hizmet Hesabı anahtarıyla imzalanır. Google Cüzdan Android SDK'sını kullananlarda SDK, uygulama imzalama sertifikanızın SHA-1 parmak iziyle JWT'nin imzalanmasını otomatik olarak gerçekleştirir.

Kimlik bilgilerinizi korumak için JWT'ler yalnızca sunucunuzda oturum açmalı veya uygulamanızda Google Cüzdan Android SDK'sı kullanılmalıdır.

Örnek kod imzalamayı göster

Java

  // Create the JWT as a HashMap object
  HashMap claims = new HashMap();
  claims.put("iss", ((ServiceAccountCredentials) credentials).getClientEmail());
  claims.put("aud", "google");
  claims.put("origins", Arrays.asList("www.example.com"));
  claims.put("typ", "savetowallet");

  // Create the Google Wallet payload and add to the JWT
  HashMap payload = new HashMap();
  payload.put("eventTicketObjects", Arrays.asList(newObject));
  claims.put("payload", payload);

  // Google Cloud service account credentials are used to sign the JWT
  Algorithm algorithm =
      Algorithm.RSA256(
          null, (RSAPrivateKey) ((ServiceAccountCredentials) credentials).getPrivateKey());
  String token = JWT.create().withPayload(claims).sign(algorithm);
        

Node.JS

  // Create the JWT claims
  let claims = {
    iss: this.credentials.client_email,
    aud: 'google',
    origins: ['www.example.com'],
    typ: 'savetowallet',
    payload: {
      eventTicketObjects: [newObject]
    },
  };

  // The service account credentials are used to sign the JWT
  let token = jwt.sign(claims, this.credentials.private_key, { algorithm: 'RS256' });
        

Python

  # Create the JWT claims
  claims = {
      'iss': self.credentials.service_account_email,
      'aud': 'google',
      'origins': ['www.example.com'],
      'typ': 'savetowallet',
      'payload': {
          # The listed classes and objects will be created
          'eventTicketObjects': [new_object]
      }
  }

  # The service account credentials are used to sign the JWT
  signer = crypt.RSASigner.from_service_account_file(self.key_file_path)
  token = jwt.encode(signer, claims).decode('utf-8')
        

Ne işe yarar?

İmzalanmış bir JWT oluşturduktan sonra kartınızı bir Google Cüzdan kullanıcısına vermeye hazır olursunuz! Bunun için kullanıcıya "Google Cüzdan'a ekle" düğmesi veya bağlantısı sunulmalıdır. Kullanıcı düğmeyi veya köprüyü tıkladığında, imzalı JWT Google Cüzdan API'sine gönderilir ve daha sonra bu API, kayıtlı kimlik bilgilerinizi kullanarak mesajın şifresini çözer. JWT imzası doğrulandıktan sonra kart, Google Cüzdan'a kaydetmesi için kullanıcıya verilir.

Nasıl yapılır?

Bir Android uygulaması için "Google Cüzdan'a ekle" düğmesi oluşturmak üzere düğme oluşturma yöntemlerini içeren Google Cüzdan Android SDK'sını kullanın. Web, e-posta ve kısa mesajlar dahil olmak üzere diğer tüm platformlar için https://pay.google.com/gp/v/save/<signed_jwt> biçiminde bir köprü oluşturun. Mümkün olduğunda, en iyi yöntem bu bağlantının kullanıcıya bir "Google Cüzdan'a ekle" düğmesi olarak sunulmasıdır.

"Google Cüzdan'a ekle" düğmesinin kullanımı hakkında daha fazla bilgi için Google Cüzdan API'si Marka yönergeleri'ne bakın.

Örnek kodu göster

  https://pay.google.com/gp/v/save/<signed_jwt>
        

Android SDK

  private lateinit var walletClient: PayClient
  private val addToGoogleWalletRequestCode = 1000
  private lateinit var addToGoogleWalletButton: View

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    walletClient = Pay.getClient(this)
    addToGoogleWalletButton.setOnClickListener {
      walletClient.savePasses(newObjectJson, this, addToGoogleWalletRequestCode)
    }
  }
        

Kullanıcınız verdiği kartı kaydettikten sonra, kaydettiği diğer kartlarla birlikte Google Cüzdan uygulamasında görünür.

JWT'de Kartlar Nesneleri ve Kartlar Sınıfları Oluşturma

Kartlar Sınıfları ve Kartlar Nesneleri, Google Cüzdan REST API veya Android SDK kullanılarak önceden oluşturulabilir. Kullanıcılar, oluşturulduktan sonra kimlik bilgilerini referans alarak geçiş kartı yayınlamak için kullanılır.

Alternatif olarak, JSON'larını doğrudan kullanıcıya vermek için kullanılan JWT'nin içine yerleştirerek 'Geçiş Sınıfları ve Nesneleri 'tam zamanında' oluşturabilirsiniz. Bu yöntemde, Kartlar Sınıfları ve Kartlar Nesneleri, imzalı JWT bir "Google Cüzdan'a ekle" düğmesi veya bağlantısı kullanılarak gönderildiğinde Google Cüzdan API'si tarafından oluşturulur.

Örneğin, aşağıda payload.eventTicketClasses ve payload.eventTicketObjects özellikleri kullanılarak tanımlanmış yeni Kartlar Sınıfı ve Kartlar Nesnesine sahip bir JWT gösterilmektedir. Bu özelliklerin dizi olduğuna, dolayısıyla bir veya daha fazla Kartlar Sınıfı ya da Kartlar Nesnesi kabul edebileceklerine dikkat edin. Ayrıca JWT'de, mevcut bir Kartlar Sınıfına kimliğine referans veren yeni bir Passes Nesnesi de belirtebilirsiniz.

Örnek JWT'yi göster

  {
    "iss": "issuer@example.com",
    "aud": "google",
    "typ": "savetowallet",
    "iat": 1696877738,
    "origins": [
      "www.example.com"
    ],
    "payload": {
      "eventTicketClasses": [{
        "id": "ISSUER_ID.EVENT_CLASS_ID",
        "issuerName": "[TEST ONLY] Heraldic Event",
        "localizedIssuerName": {
          "defaultValue": {
            "language": "en-US",
            "value": "[TEST ONLY] Heraldic Event"
          }
        },
        "logo": {
          "sourceUri": {
            "uri": "https://images.unsplash.com/photo-1475721027785-f74eccf877e2?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=660&h=660"
          },
          "contentDescription": {
            "defaultValue": {
              "language": "en-US",
              "value": "LOGO_IMAGE_DESCRIPTION"
            }
          }
        },
        "eventName": {
          "defaultValue": {
            "language": "en-US",
            "value": "Google Live"
          }
        },
        "venue": {
          "name": {
            "defaultValue": {
              "language": "en-US",
              "value": "Shoreline Amphitheater"
            }
          },
          "address": {
            "defaultValue": {
              "language": "en-US",
              "value": "ADDRESS_OF_THE_VENUE"
            }
          }
        },
        "dateTime": {
          "start": "2023-04-12T11:30"
        },
        "reviewStatus": "UNDER_REVIEW",
        "hexBackgroundColor": "#264750",
        "heroImage": {
          "sourceUri": {
            "uri": "https://images.unsplash.com/photo-1501281668745-f7f57925c3b4?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1032&h=336"
          },
          "contentDescription": {
            "defaultValue": {
              "language": "en-US",
              "value": "HERO_IMAGE_DESCRIPTION"
            }
          }
        }
      }],
      "eventTicketObjects": [{
        "id": "ISSUER_ID.OBJECT_ID",
        "classId": "ISSUER_ID.EVENT_CLASS_ID",
        "state": "ACTIVE",
        "seatInfo": {
          "seat": {
            "defaultValue": {
              "language": "en-us",
              "value": "5"
            }
          },
          "row": {
            "defaultValue": {
              "language": "en-us",
              "value": "G"
            }
          },
          "section": {
            "defaultValue": {
              "language": "en-us",
              "value": "40"
            }
          },
          "gate": {
            "defaultValue": {
              "language": "en-us",
              "value": "3A"
            }
          }
        },
        "barcode": {
          "type": "QR_CODE",
          "value": "BARCODE_VALUE",
          "alternateText": ""
        }
      }]
    }
  }