רקע
התכונה 'תמונות פרטיות מאובטחות' מאפשרת להגדיר תמונות בכרטיסים שלא צריכות להיות נגישות מכתובת URL שפתוחה לציבור (דרישה לתמונות רגילות כדי שהן יוצגו בכרטיסים בצורה תקינה). משתמשים ב-Wallet API כדי להעלות תמונה ולקבל מזהה שאפשר להשתמש בו כדי להפנות לתמונה הזו באובייקט של כרטיס ב-Wallet.
אלה סוגי הכרטיסים שנתמכים:
- כרטיס לאירוע
- כרטיס עלייה למטוס
- כרטיס לתחבורה ציבורית
- כרטיס מבצע
- כרטיס מתנה
- כרטיס מועדון לקוחות
- כרטיס גנרי
דוגמה לתכונה
|
| כרטיס חברות באמצעות תמונה פרטית מאובטחת |
תרחישים לדוגמה
תמונות פרטיות מאובטחות מאפשרות שימוש בתמונות שלא צריך שתהיה אליהן גישה לכולם, ולכן אפשר להשתמש בהן למטרות כמו תמונת פרופיל. האפשרות הזו שימושית במקרים שונים, למשל:
- כרטיס חברות שנתי
- כרטיס ביקור
- כרטיס לתחבורה ציבורית
הערה: תמונות פרטיות מאובטחות לא מיועדות לייצוג של כרטיסים כמסמכי זיהוי שהונפקו על ידי גורם ממשלתי, בהתאם להנחיות הנוספות שמפורטות במדיניות השימוש המקובל.
שיקולים מסוימים לשימוש בתמונות פרטיות מאובטחות
- אי אפשר להשתמש בהם עם כרטיסים פרטיים כלליים
- אפשר להוסיף אותו רק לאובייקטים של כרטיסים (לא למחלקות)
- אפשר להשתמש רק באובייקט אחד
- אפשר להשתמש רק ב-
ImageModuleData(אי אפשר להקצות תמונות פרטיות לשדות תמונה אחרים, כמוheroImage,logoאוwideLogo) - בכרטיסים שמשתמשים בתמונות פרטיות מאובטחות ב-
ImageModuleData, עדיין אפשר להציג בו-זמנית תמונות רגילות של גיבורים וסמלי לוגו (שמתארחים בכתובות URL שנגישות לכולם). הוספה של תמונה פרטית לא מגבילה או חוסמת את האפשרות להציג בכרטיס תמונות רגילות של גיבורים או לוגו.
תכונות בפיתוח
- תמיכה באינטרנט
- תמיכה בתמונות פרטיות בשדה
heroImage(שימוש בprivateImageIdכתמונה ראשית)
שלבי ההטמעה
- מעלים את התמונה הפרטית באמצעות Google Wallet API כדי לקבל
privateImageId. - מוסיפים תמונה לאובייקט הכרטיס (לדוגמה,
ImageModuleData). במקום להגדיר את השדהsourceUriבתמונה, מגדירים את השדהprivateImageIdעם הערך שהתקבל בשלב הקודם.
דיאגרמת רצף
|
| רצף תמונות פרטי מאובטח |
קוד לדוגמה
העלאת התמונה
String issuerId = "12345"; String keyFilePath = "/path/to/key.json"; GoogleCredential credential = GoogleCredential.fromStream(new FileInputStream(keyFilePath)) .createScoped(Arrays.asList("https://www.googleapis.com/auth/wallet_object.issuer")); HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport(); // Prepare request to upload image String contentType = "image/jpeg"; // MIME type of image String imageFilePath = "/path/to/image.jpg"; HttpContent content = new ByteArrayContent( contentType, ByteStreams.toByteArray(new FileInputStream(imageFilePath))); String url = String.format( "https://walletobjects.googleapis.com/upload/walletobjects/v1/privateContent/%s/uploadPrivateImage", issuerId); // Make request to upload image HttpResponse response = httpTransport .createRequestFactory(credential) .buildPostRequest(new GenericUrl(url), content) .execute(); // Get privateImageId from response Gson gson = new Gson(); JsonObject jsonObject = gson.fromJson(response.parseAsString(), JsonObject.class); String privateImageId = jsonObject.get("privateImageId").getAsString();
שימוש בתמונה פרטית באובייקט של הכרטיס
// Build GenericObject with privateImageId in ImageModuleData (also adding an optional TextModuleData) Image image = new Image().setPrivateImageId(privateImageId); ImageModuleData imageModuleData = new ImageModuleData().setId("imageId").setMainImage(image); TextModuleData textModuleData = new TextModuleData().setId("textId").setHeader("Card holder").setBody("John Doe"); GenericObject genericObject = new GenericObject() .setId(issuerId + ".objectId") // class must be inserted before inserting object .setClassId(issuerId + ".classId") .setCardTitle("Business name") .setHeader("My membership card") .setImageModulesData(Arrays.asList(imageModuleData)) .setTextModulesData(Arrays.asList(textModuleData)); // Insert GenericObject (or can use in JWT without inserting ahead of time) Walletobjects service = new Walletobjects.Builder(httpTransport, GsonFactory.getDefaultInstance(), credential) .setApplicationName("My Application") .build(); service.genericobject().insert(genericObject).execute();
עדכון הכרטיס כדי שהתמונה תוצג בחזית
אפשר להשתמש בתמונה הפרטית המאובטחת בכל שדה נתונים של imageModules. הדוגמה הבאה ממחישה איך להשתמש בשדה imageModulesData כדי למקם את התמונה בחזית הכרטיס באמצעות החלפה של תבנית. דוגמה להוספת מחלקה באמצעות החלפת תבנית:
CardTemplateOverride cardTemplateOverride =
new CardTemplateOverride()
.setCardRowTemplateInfos(
Arrays.asList(
new CardRowTemplateInfo()
.setTwoItems(
new CardRowTwoItems()
// The ids chosen here must be set on the object's TextModuleData and ImageModuleData
.setStartItem(
createTemplateItem("object.textModulesData['textId']"))
.setEndItem(
createTemplateItem("object.imageModulesData['imageId']")))));
GenericClass genericClass =
new GenericClass()
.setId(issuerId + ".classId")
.setClassTemplateInfo(
new ClassTemplateInfo().setCardTemplateOverride(cardTemplateOverride));
service.genericclass().insert(genericClass);
...
private static TemplateItem createTemplateItem(String fieldPath) {
return new TemplateItem()
.setFirstValue(
new FieldSelector()
.setFields(Arrays.asList(new FieldReference().setFieldPath(fieldPath))));
}טיפול בחריגים
יכולות להיות שגיאות פוטנציאליות בשימוש לא נכון ב-Google Wallet API, כולל:
| Message | סיבה |
|---|---|
| בתמונה לא יכולים להיות גם source_uri וגם private_image_id | המנפיק ניסה להגדיר source_uri ו-private_image_id בתמונה אחת, וזה אסור |
| לא נמצאה תמונה פרטית עם המזהה %s עבור המנפיק %s | הגדרת מזהה של תמונה פרטית שלא קיימת באובייקט |
| לא הייתה אפשרות להוסיף תמונה פרטית עם המזהה %s עבור המוסד המנפיק %s לאובייקט %s כי היא כבר בשימוש באובייקט %s. אפשר להשתמש בתמונה פרטית רק עם אובייקט אחד. | מנסים להשתמש באותה תמונה פרטית ביותר מאובייקט אחד. כדי להשתמש באותה תמונה פרטית עם יותר מאובייקט אחד, צריך להעלות אותה מחדש ולקבל מזהה חדש של תמונה פרטית, שאפשר להשתמש בו עם האובייקט השני. |