รูปภาพส่วนตัวที่ปลอดภัย

ฉากหลัง

ฟีเจอร์รูปภาพส่วนตัวที่ปลอดภัยช่วยให้คุณกำหนดรูปภาพในบัตรที่ไม่จำเป็นต้องเข้าถึงได้จาก URL ที่หันหน้าสู่สาธารณะ (ข้อกำหนดสำหรับรูปภาพปกติเพื่อให้แสดงอย่างถูกต้องในบัตร) คุณใช้ Wallet API เพื่ออัปโหลดรูปภาพและรับตัวระบุที่ใช้เพื่ออ้างอิงรูปภาพนั้นในออบเจ็กต์บัตร Wallet ได้

ระบบรองรับบัตรประเภทต่อไปนี้

  • ตั๋วกิจกรรม
  • บอร์ดดิ้งพาส
  • บัตรโดยสาร
  • บัตรข้อเสนอ
  • บัตรของขวัญ
  • บัตร Loyalty Pass
  • บัตรทั่วไป

ตัวอย่างฟีเจอร์

ตัวอย่างรูปภาพส่วนตัวที่ปลอดภัย
บัตรสมาชิกโดยใช้รูปภาพส่วนตัวที่ปลอดภัย

กรณีการใช้งาน

รูปภาพส่วนตัวที่ปลอดภัยช่วยให้ใช้รูปภาพที่ไม่จำเป็นต้อง เข้าถึงได้แบบสาธารณะได้ จึงสามารถใช้สำหรับสิ่งต่างๆ เช่น รูปโปรไฟล์ ซึ่งจะช่วยให้ใช้กรณีการใช้งานต่างๆ ได้ เช่น แต่ไม่จำกัดเพียงกรณีต่อไปนี้

  • บัตรสมาชิกรายปี
  • นามบัตร
  • บัตรโดยสาร

หมายเหตุ: รูปภาพส่วนตัวที่ปลอดภัยไม่ได้มีไว้เพื่อใช้แสดงบัตรเป็นบัตรประจำตัวที่ออกโดยรัฐบาล รวมถึงหลักเกณฑ์เพิ่มเติมที่กำหนดไว้ในนโยบายการใช้งานที่ยอมรับได้

ข้อควรพิจารณาบางประการเมื่อใช้ฟีเจอร์ Wallet

  • ใช้ร่วมกับบัตรส่วนตัวทั่วไปไม่ได้
  • เพิ่มได้เฉพาะในออบเจ็กต์บัตร (ไม่ใช่คลาส)
  • ใช้ได้กับออบเจ็กต์เดียวเท่านั้น
  • ใช้ได้กับ ImageModuleData เท่านั้น (ไม่ใช่รูปภาพอื่นๆ เช่น โลโก้และโลโก้ส่วนหัวแบบกว้าง)

ฟีเจอร์อยู่ระหว่างการพัฒนา

  • การสนับสนุนทางเว็บ
  • รูปภาพส่วนตัวในรูปภาพหลัก

ขั้นตอนการผสานรวม

  1. อัปโหลดรูปภาพส่วนตัวโดยใช้ Google Wallet API เพื่อรับ privateImageId
  2. เพิ่มรูปภาพลงในออบเจ็กต์บัตร (เช่น 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();

อัปเดตบัตรเพื่อแสดงรูปภาพที่ด้านหน้า

คุณใช้รูปภาพส่วนตัวที่ปลอดภัยใน imageModulesDatafield ใดก็ได้ ตัวอย่างต่อไปนี้แสดงวิธีใช้ฟิลด์ 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))));
}

การจัดการข้อยกเว้น

การใช้ Wallet FeatureAPI อย่างไม่ถูกต้องอาจทำให้เกิดข้อผิดพลาดได้ ซึ่งรวมถึง

ข้อความ เหตุผล
รูปภาพต้องไม่มีทั้ง source_uri และ private_image_id ผู้ออกพยายามตั้งค่า source_uri และ private_image_id ในรูปภาพเดียว ซึ่งไม่ได้รับอนุญาต
ไม่พบรูปภาพส่วนตัวที่มีรหัส %s สำหรับผู้ออก %s การตั้งค่ารหัสรูปภาพส่วนตัวที่ไม่มีอยู่จริงในออบเจ็กต์
เพิ่มรูปภาพส่วนตัวที่มีรหัส %s สำหรับผู้ออก %s ลงในออบเจ็กต์ %s ไม่ได้ เนื่องจากมีการใช้กับออบเจ็กต์ %s อยู่แล้ว รูปภาพส่วนตัวใช้ได้กับออบเจ็กต์เดียวเท่านั้น พยายามใช้รูปภาพส่วนตัวเดียวกันในออบเจ็กต์มากกว่า 1 รายการ หากต้องการใช้รูปภาพส่วนตัวเดียวกันกับออบเจ็กต์มากกว่า 1 รายการ คุณต้องอัปโหลดรูปภาพอีกครั้งและจะได้รับรหัสรูปภาพส่วนตัวใหม่ ซึ่งใช้กับออบเจ็กต์ที่ 2 ได้