최종 사용자가 Google 월렛에 저장하도록 발급할 수 있는 패스는 대부분 패스 클래스와 패스 객체라는 두 가지 구성요소로 정의됩니다. 사용자에게 패스를 발급할 때마다 Google Wallet API에 구성할 패스 유형과 패스에 표시할 세부정보(예: 기프트 카드의 값 또는 티켓 소지자 이름)를 알려주는 패스 클래스와 패스 객체의 인스턴스가 모두 필요합니다.
Google Wallet API는 인스턴스를 만든 후 사용자에게 발급되는 패스(예: GiftCardClass
, GiftCardObject
, GenericClass
, GenericObject
)를 만드는 데 사용할 수 있는 사전 정의된 패스 클래스 및 패스 객체 집합을 제공합니다.
각 패스 클래스 및 패스 객체 인스턴스는 해당 패스 유형의 특정 사용 사례에 해당하는 필수 및 선택적 속성 집합을 갖는 JSON 객체로 정의됩니다.
패스 클래스 만들기
패스 클래스는 패스를 만드는 공유 템플릿으로 생각하면 됩니다. 패스 클래스는 이 클래스를 사용하는 모든 패스에 포함될 특정 속성을 정의합니다. 패스 발급기관은 스타일과 모양과 같은 속성뿐 아니라 스마트 탭, 등록 및 로그인과 같은 추가 기능을 정의하는 고유한 속성 집합이 있는 여러 클래스를 만들 수 있습니다.
패스 클래스는 Google Wallet REST API, Google Wallet Android SDK 또는 Google 월렛 비즈니스 콘솔을 사용하여 만들 수 있습니다.
비즈니스 콘솔은 양식 필드를 작성하여 첫 번째 패스 클래스의 다양한 필드를 정의할 수 있는 간단한 사용자 인터페이스를 제공하므로 신규 사용자의 경우 패스 클래스 생성을 가장 쉽게 시작할 수 있습니다.
고급 사용자의 경우 프로그래매틱 방식으로 패스 클래스를 만드는 것이 가장 좋습니다.
Google 월렛 비즈니스 콘솔 사용
Google 월렛 비즈니스 콘솔에서 패스 클래스를 만들려면 다음 단계를 따르세요.
- Google Pay 및 월렛 비즈니스 콘솔로 이동하여 Google Wallet API 발급기관 계정으로 로그인합니다.
- 'Google Wallet API'에서 카드에서 '패스 관리'를 클릭합니다. 버튼을 클릭합니다.
- '게시 액세스 권한 얻기'에서 '수업 만들기'를 클릭합니다. 버튼을 클릭합니다.
- 대화상자에서 패스 유형을 선택합니다. Google 월렛에서는 다양한 패스 유형 (이벤트 티켓, 쿠폰, 포인트 카드 등)을 제공합니다. 유연한 사용 사례인 경우 '일반' 선택 을 패스 유형으로 설정할 수 있습니다.
- 필수 입력란에 적절한 값을 입력합니다.
- '수업 만들기'를 클릭합니다. 버튼을 클릭하여 수업을 저장합니다.
Google Wallet REST API 사용
Google Wallet REST API를 사용하여 패스 클래스를 만들려면 https://walletobjects.googleapis.com/walletobjects/v1/transitClass
에 POST
요청을 보냅니다. 자세한 내용은 참조 문서를 확인하세요.
Java에서 통합을 시작하려면 전체 <ph type="x-smartling-placeholder"></ph> 코드 샘플을 확인하세요.
/**
* 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.transitclass().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/tickets/transit-passes/qr-code/rest/v1/transitclass
TransitClass newClass =
new TransitClass()
.setId(String.format("%s.%s", issuerId, classSuffix))
.setIssuerName("Issuer name")
.setReviewStatus("UNDER_REVIEW")
.setLogo(
new Image()
.setSourceUri(
new ImageUri()
.setUri(
"https://live.staticflickr.com/65535/48690277162_cd05f03f4d_o.png"))
.setContentDescription(
new LocalizedString()
.setDefaultValue(
new TranslatedString()
.setLanguage("en-US")
.setValue("Logo description"))))
.setTransitType("BUS");
TransitClass response = service.transitclass().insert(newClass).execute();
System.out.println("Class insert response");
System.out.println(response.toPrettyString());
return response.getId();
}
PHP에서 통합을 시작하려면 전체 <ph type="x-smartling-placeholder"></ph> 코드 샘플을 확인하세요.
/**
* 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->transitclass->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/tickets/transit-passes/qr-code/rest/v1/transitclass
$newClass = new TransitClass([
'id' => "{$issuerId}.{$classSuffix}",
'issuerName' => 'Issuer name',
'reviewStatus' => 'UNDER_REVIEW',
'logo' => new Image([
'sourceUri' => new ImageUri([
'uri' => 'https://live.staticflickr.com/65535/48690277162_cd05f03f4d_o.png'
]),
'contentDescription' => new LocalizedString([
'defaultValue' => new TranslatedString([
'language' => 'en-US',
'value' => 'Logo description'
])
])
]),
'transitType' => 'BUS'
]);
$response = $this->service->transitclass->insert($newClass);
print "Class insert response\n";
print_r($response);
return $response->id;
}
Python에서 통합을 시작하려면 전체 <ph type="x-smartling-placeholder"></ph> 코드 샘플을 확인하세요.
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.transitclass().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/tickets/transit-passes/qr-code/rest/v1/transitclass
new_class = {
'id': f'{issuer_id}.{class_suffix}',
'issuerName': 'Issuer name',
'reviewStatus': 'UNDER_REVIEW',
'logo': {
'sourceUri': {
'uri':
'https://live.staticflickr.com/65535/48690277162_cd05f03f4d_o.png'
},
'contentDescription': {
'defaultValue': {
'language': 'en-US',
'value': 'Logo description'
}
}
},
'transitType': 'BUS'
}
response = self.client.transitclass().insert(body=new_class).execute()
print('Class insert response')
print(response)
return f'{issuer_id}.{class_suffix}'
C#에서 통합을 시작하려면 전체 <ph type="x-smartling-placeholder"></ph> 코드 샘플을 확인하세요.
/// <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.Transitclass
.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/tickets/transit-passes/qr-code/rest/v1/transitclass
TransitClass newClass = new TransitClass
{
Id = $"{issuerId}.{classSuffix}",
IssuerName = "Issuer name",
ReviewStatus = "UNDER_REVIEW",
Logo = new Image
{
SourceUri = new ImageUri
{
Uri = "https://live.staticflickr.com/65535/48690277162_cd05f03f4d_o.png"
},
ContentDescription = new LocalizedString
{
DefaultValue = new TranslatedString
{
Language = "en-US",
Value = "Logo description"
}
}
},
TransitType = "BUS"
};
responseStream = service.Transitclass
.Insert(newClass)
.ExecuteAsStream();
responseReader = new StreamReader(responseStream);
jsonResponse = JObject.Parse(responseReader.ReadToEnd());
Console.WriteLine("Class insert response");
Console.WriteLine(jsonResponse.ToString());
return $"{issuerId}.{classSuffix}";
}
노드에서 통합을 시작하려면 전체 <ph type="x-smartling-placeholder"></ph> 코드 샘플을 확인하세요.
/**
* 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.transitclass.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/tickets/transit-passes/qr-code/rest/v1/transitclass
let newClass = {
'id': `${issuerId}.${classSuffix}`,
'issuerName': 'Issuer name',
'reviewStatus': 'UNDER_REVIEW',
'logo': {
'sourceUri': {
'uri': 'https://live.staticflickr.com/65535/48690277162_cd05f03f4d_o.png'
},
'contentDescription': {
'defaultValue': {
'language': 'en-US',
'value': 'Logo description'
}
}
},
'transitType': 'BUS'
};
response = await this.client.transitclass.insert({
requestBody: newClass
});
console.log('Class insert response');
console.log(response);
return `${issuerId}.${classSuffix}`;
}
Go에서 통합을 시작하려면 GitHub의 전체 코드 샘플을 참고하세요. <ph type="x-smartling-placeholder"></ph> 코드 샘플을 확인하세요.
// Create a class.
func (d *demoTransit) createClass(issuerId, classSuffix string) {
logo := walletobjects.Image{
SourceUri: &walletobjects.ImageUri{
Uri: "http://farm8.staticflickr.com/7340/11177041185_a61a7f2139_o.jpg",
},
}
transitClass := new(walletobjects.TransitClass)
transitClass.Id = fmt.Sprintf("%s.%s", issuerId, classSuffix)
transitClass.IssuerName = "Issuer name"
transitClass.ReviewStatus = "UNDER_REVIEW"
transitClass.Logo = &logo
transitClass.TransitType = "BUS"
res, err := d.service.Transitclass.Insert(transitClass).Do()
if err != nil {
log.Fatalf("Unable to insert class: %v", err)
} else {
fmt.Printf("Class insert id:\n%v\n", res.Id)
}
}
패스 객체 만들기
<ph type="x-smartling-placeholder">패스 객체는 패스 클래스의 인스턴스입니다. 패스를 만들려면 객체에 다음 속성을 제공해야 합니다.
classId
: 패스 클래스의id
id
: 고객의 고유 ID입니다.자세한 내용은 레이아웃 템플릿 이러한 속성이 표시되는 방식에 대한 자세한 내용은 대중교통 이용권
패스 객체를 만드는 코드 샘플:
Java에서 통합을 시작하려면 전체 <ph type="x-smartling-placeholder"></ph> 코드 샘플을 확인하세요.
/**
* 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.transitobject().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/tickets/transit-passes/qr-code/rest/v1/transitobject
TransitObject newObject =
new TransitObject()
.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)))
.setPassengerType("SINGLE_PASSENGER")
.setPassengerNames("Passenger names")
.setTripType("ONE_WAY")
.setTicketLeg(
new TicketLeg()
.setOriginStationCode("LA")
.setOriginName(
new LocalizedString()
.setDefaultValue(
new TranslatedString()
.setLanguage("en-US")
.setValue("Origin name")))
.setDestinationStationCode("SFO")
.setDestinationName(
new LocalizedString()
.setDefaultValue(
new TranslatedString()
.setLanguage("en-US")
.setValue("Origin name")))
.setDepartureDateTime("2020-04-12T16:20:50.52Z")
.setArrivalDateTime("2020-04-12T20:20:50.52Z")
.setFareName(
new LocalizedString()
.setDefaultValue(
new TranslatedString()
.setLanguage("en-US")
.setValue("Fare name"))));
TransitObject response = service.transitobject().insert(newObject).execute();
System.out.println("Object insert response");
System.out.println(response.toPrettyString());
return response.getId();
}PHP에서 통합을 시작하려면 전체 <ph type="x-smartling-placeholder"></ph> 코드 샘플을 확인하세요.
/**
* 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->transitobject->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/tickets/transit-passes/qr-code/rest/v1/transitobject
$newObject = new TransitObject([
'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
])
],
'passengerType' => 'SINGLE_PASSENGER',
'passengerNames' => 'Passenger names',
'tripType' => 'ONE_WAY',
'ticketLeg' => new TicketLeg([
'originStationCode' => 'LA',
'originName' => new LocalizedString([
'defaultValue' => new TranslatedString([
'language' => 'en-US',
'value' => 'Origin name'
])
]),
'destinationStationCode' => 'SFO',
'destinationName' => new LocalizedString([
'defaultValue' => new TranslatedString([
'language' => 'en-US',
'value' => 'Destination name'
])
]),
'departureDateTime' => '2020-04-12T16:20:50.52Z',
'arrivalDateTime' => '2020-04-12T20:20:50.52Z',
'fareName' => new LocalizedString([
'defaultValue' => new TranslatedString([
'language' => 'en-US',
'value' => 'Fare name'
])
])
])
]);
$response = $this->service->transitobject->insert($newObject);
print "Object insert response\n";
print_r($response);
return $response->id;
}Python에서 통합을 시작하려면 전체 <ph type="x-smartling-placeholder"></ph> 코드 샘플을 확인하세요.
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.transitobject().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/tickets/transit-passes/qr-code/rest/v1/transitobject
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
}],
'passengerType': 'SINGLE_PASSENGER',
'passengerNames': 'Passenger names',
'tripType': 'ONE_WAY',
'ticketLeg': {
'originStationCode': 'LA',
'originName': {
'defaultValue': {
'language': 'en-US',
'value': 'Origin name'
}
},
'destinationStationCode': 'SFO',
'destinationName': {
'defaultValue': {
'language': 'en-US',
'value': 'Destination name'
}
},
'departureDateTime': '2020-04-12T16:20:50.52Z',
'arrivalDateTime': '2020-04-12T20:20:50.52Z',
'fareName': {
'defaultValue': {
'language': 'en-US',
'value': 'Fare name'
}
}
}
}
# Create the object
response = self.client.transitobject().insert(body=new_object).execute()
print('Object insert response')
print(response)
return f'{issuer_id}.{object_suffix}'C#에서 통합을 시작하려면 전체 <ph type="x-smartling-placeholder"></ph> 코드 샘플을 확인하세요.
/// <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.Transitobject
.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/tickets/transit-passes/qr-code/rest/v1/transitobject
TransitObject newObject = new TransitObject
{
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
}
},
PassengerType = "SINGLE_PASSENGER",
PassengerNames = "Passenger names",
TripType = "ONE_WAY",
TicketLeg = new TicketLeg
{
OriginStationCode = "LA",
OriginName = new LocalizedString
{
DefaultValue = new TranslatedString
{
Language = "en-US",
Value = "Origin name"
}
},
DestinationStationCode = "SFO",
DestinationName = new LocalizedString
{
DefaultValue = new TranslatedString
{
Language = "en-US",
Value = "Destination name"
}
},
DepartureDateTime = "2020-04-12T16:20:50.52Z",
ArrivalDateTime = "2020-04-12T20:20:50.52Z",
FareName = new LocalizedString
{
DefaultValue = new TranslatedString
{
Language = "en-US",
Value = "Fare name"
}
}
}
};
responseStream = service.Transitobject
.Insert(newObject)
.ExecuteAsStream();
responseReader = new StreamReader(responseStream);
jsonResponse = JObject.Parse(responseReader.ReadToEnd());
Console.WriteLine("Object insert response");
Console.WriteLine(jsonResponse.ToString());
return $"{issuerId}.{objectSuffix}";
}노드에서 통합을 시작하려면 전체 <ph type="x-smartling-placeholder"></ph> 코드 샘플을 확인하세요.
/**
* 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.transitobject.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/tickets/transit-passes/qr-code/rest/v1/transitobject
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
}
],
'passengerType': 'SINGLE_PASSENGER',
'passengerNames': 'Passenger names',
'tripType': 'ONE_WAY',
'ticketLeg': {
'originStationCode': 'LA',
'originName': {
'defaultValue': {
'language': 'en-US',
'value': 'Origin name'
}
},
'destinationStationCode': 'SFO',
'destinationName': {
'defaultValue': {
'language': 'en-US',
'value': 'Destination name'
}
},
'departureDateTime': '2020-04-12T16:20:50.52Z',
'arrivalDateTime': '2020-04-12T20:20:50.52Z',
'fareName': {
'defaultValue': {
'language': 'en-US',
'value': 'Fare name'
}
}
}
};
response = await this.client.transitobject.insert({
requestBody: newObject
});
console.log('Object insert response');
console.log(response);
return `${issuerId}.${objectSuffix}`;
}Go에서 통합을 시작하려면 GitHub의 전체 코드 샘플을 참고하세요. <ph type="x-smartling-placeholder"></ph> 코드 샘플을 확인하세요.
// Create an object.
func (d *demoTransit) createObject(issuerId, classSuffix, objectSuffix string) {
transitObject := new(walletobjects.TransitObject)
transitObject.Id = fmt.Sprintf("%s.%s", issuerId, objectSuffix)
transitObject.ClassId = fmt.Sprintf("%s.%s", issuerId, classSuffix)
transitObject.State = "ACTIVE"
transitObject.PassengerNames = "Passenger names"
transitObject.TripType = "ONE_WAY"
transitObject.PassengerType = "SINGLE_PASSENGER"
transitObject.TicketLeg = &walletobjects.TicketLeg{
DestinationStationCode: "SFO",
OriginStationCode: "LA",
}
transitObject.HeroImage = &walletobjects.Image{
SourceUri: &walletobjects.ImageUri{
Uri: "https://farm4.staticflickr.com/3723/11177041115_6e6a3b6f49_o.jpg",
},
}
transitObject.Barcode = &walletobjects.Barcode{
Type: "QR_CODE",
Value: "QR code",
}
transitObject.Locations = []*walletobjects.LatLongPoint{
&walletobjects.LatLongPoint{
Latitude: 37.424015499999996,
Longitude: -122.09259560000001,
},
}
transitObject.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",
},
},
}
transitObject.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",
},
},
},
}
transitObject.TextModulesData = []*walletobjects.TextModuleData{
&walletobjects.TextModuleData{
Body: "Text module body",
Header: "Text module header",
Id: "TEXT_MODULE_ID",
},
}
res, err := d.service.Transitobject.Insert(transitObject).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 월렛 사용자는 패스를 발급해야 합니다.