การสร้างและลิงก์บัญชีย่อย AdWords กับ Merchant Center

1. บทนำ

ใน Codelab นี้ คุณจะได้เรียนรู้พื้นฐานบางอย่างเกี่ยวกับการทำงานกับ Content API for Shopping และ AdWords API รวมถึงสร้างแอปพลิเคชันที่ใช้ทั้ง 2 อย่าง โดยเฉพาะอย่างยิ่ง คุณจะสร้างแอปพลิเคชันบรรทัดคำสั่งที่จะสร้างและลิงก์บัญชี AdWords กับบัญชี Merchant Center

สิ่งที่คุณจะได้เรียนรู้

  • วิธีสร้างบัญชี AdWords ที่บัญชีดูแลจัดการจัดการ
  • วิธีสร้างบัญชี Merchant Center ที่จัดการโดยบัญชีหลายลูกค้า
  • วิธีส่งคำขอลิงก์จากบัญชี Merchant Center ไปยังบัญชี AdWords
  • วิธียอมรับลิงก์ Merchant Center ที่รอดำเนินการในบัญชี AdWords

สิ่งที่คุณต้องมี

2. การเริ่มตั้งค่า

ดาวน์โหลดโค้ด

คลิกลิงก์ต่อไปนี้เพื่อดาวน์โหลดโค้ดทั้งหมดสำหรับ Codelab นี้

แตกไฟล์ ZIP ที่ดาวน์โหลด การดำเนินการนี้จะแตกโฟลเดอร์รูท (shopping-account-linking-master) ซึ่งมีโปรเจ็กต์ Maven พร้อมกับทรัพยากรทั้งหมดที่คุณต้องการ โดยมีโฟลเดอร์ย่อยที่ควรทราบเป็นพิเศษดังนี้

  • src/main/java คือรูทของโปรเจ็กต์ Maven และมีโครงร่างโค้ดให้คุณทำงาน
  • src/main/java/solution มีโซลูชันที่เสร็จสมบูรณ์

ติดตั้งแพ็กเกจที่จำเป็นและสร้าง

หากใช้ IDE ที่รองรับ Maven เช่น Eclipse หรือ IntelliJ คุณจะนำเข้าโฟลเดอร์ที่แยกออกมาเป็นโปรเจ็กต์ Maven แล้วคอมไพล์โปรเจ็กต์ตามปกติได้

หากใช้ Maven จากบรรทัดคำสั่ง คุณสามารถเรียกใช้คำสั่งต่อไปนี้เพื่อดึงแพ็กเกจที่จำเป็นและคอมไพล์โปรเจ็กต์จากโฟลเดอร์รูทของโปรเจ็กต์ที่คลายแพ็กเกจแล้ว (shopping-account-linking-master)

mvn compile

3. ตั้งค่าการตรวจสอบสิทธิ์

ในขั้นตอนนี้ เราจะไม่เขียนโค้ดใดๆ แต่จะตั้งค่าไฟล์ที่มีโทเค็นการตรวจสอบสิทธิ์ที่เหมาะสมสำหรับ AdWords API และ Content API for Shopping

ตั้งค่าการตรวจสอบสิทธิ์ AdWords API

Codelab นี้ใช้การโหลดข้อมูลเข้าสู่ระบบแบบเดียวกับไลบรารีของไคลเอ็นต์ ดังนั้นหากคุณเคยใช้ไลบรารีของไคลเอ็นต์ Google Ads API สำหรับ Java กับบัญชีดูแลจัดการแล้ว คุณก็ควรจะตั้งค่าเรียบร้อยแล้ว ไม่เช่นนั้น ให้ทำตามขั้นตอนที่ 1-3 เพื่อเริ่มต้นใช้งานไลบรารีของไคลเอ็นต์ Google Ads API สำหรับ Java

ตั้งค่าการตรวจสอบสิทธิ์ Content API

หากยังไม่มีคีย์บัญชีบริการ ให้ทำดังนี้

  1. ไปที่ Merchant Center สำหรับบัญชีหลายลูกค้า แล้วเลือก Content API จากเมนูรายการเพิ่มเติม 89507d635c51a3dc.png
  2. เลือกการตรวจสอบสิทธิ์ แล้วคลิกปุ่ม + สีน้ำเงิน c465d8dc314ec158.png
  3. หลังจากยอมรับข้อกำหนดในการให้บริการของ Google Cloud Platform และ Google APIs แล้ว เบราว์เซอร์จะดาวน์โหลดไฟล์ JSON ที่มีคีย์บัญชีบริการใหม่โดยอัตโนมัติ

ตอนนี้ให้ทำตามวิธีการตั้งค่าการตรวจสอบสิทธิ์สำหรับตัวอย่าง Shopping ด้วยบัญชีบริการ กล่าวคือ สำเนาคีย์บัญชีบริการควรอยู่ในเส้นทางต่อไปนี้จากไดเรกทอรีหน้าแรก shopping-samples/content/service-account.json คุณไม่จำเป็นต้องตั้งค่าตัวอย่าง เว้นแต่คุณจะสนใจลองใช้ตัวอย่างหลังจากทำ Codelab นี้เสร็จแล้ว

ทดสอบเลย

ตอนนี้คุณมีโทเค็นการตรวจสอบสิทธิ์ในตำแหน่งที่ถูกต้องแล้ว ลองเรียกใช้ตัวอย่าง หากใช้ Maven ในบรรทัดคำสั่ง ให้เรียกใช้คำสั่งต่อไปนี้

mvn compile
mvn exec:java -Dexec.mainClass="SolutionRunner"

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

4. เชื่อมต่อกับ API

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

สร้างออบเจ็กต์เซสชัน Content API

หากต้องการสร้างเซสชัน Content API เราจะสร้างออบเจ็กต์ ShoppingContent.Builder แล้วใช้ออบเจ็กต์ดังกล่าวเพื่อสร้างออบเจ็กต์ ShoppingContent ที่เหมาะสม โชคดีที่สิ่งที่เราต้องใช้ในการสร้างอดีตมีอยู่ในโครงสร้างโค้ดอยู่แล้ว เราจึงเพียงแค่ดึงข้อมูลมารวมกันดังนี้

SolutionRunner.java

// TODO(sessions): Create a ShoppingContent object using ShoppingContent.Builder.
contentApiSession =
    new ShoppingContent.Builder(httpTransport, jsonFactory, contentApiCredential)
        .setApplicationName("Linking AdWords and Merchant Center Accounts Codelab")
        .build();

การตั้งชื่อแอปพลิเคชันไม่จำเป็นอย่างเคร่งครัด แต่จะแสดงวิธีตั้งค่าตัวเลือกที่ต้องการผ่านออบเจ็กต์ ShoppingContent.Builder ก่อนเรียกใช้เมธอด build()

สร้างออบเจ็กต์เซสชัน AdWords API

ในทำนองเดียวกัน ก็มีคลาส AdWordsSession.Builder สำหรับสร้างออบเจ็กต์ AdWordsSession ความแตกต่างหลักในที่นี้คือแทนที่จะตั้งค่าตัวเลือกการกำหนดค่าในเครื่องมือสร้างโดยตรง เราจะใช้เมธอด fromFile() เพื่อโหลดจากไฟล์ ads.properties ที่เราตั้งค่าไว้ในขั้นตอนก่อนหน้า

SolutionRunner.java

// TODO(sessions): Create a AdWordsSession object using AdWordsSession.Builder.
adWordsSession =
    new AdWordsSession.Builder()
        .fromFile()
        .withOAuth2Credential(adwordsOAuth2Credential)
        .build();

ทดสอบเลย

เราจะใช้คำสั่งเดียวกับในส่วนสุดท้ายเพื่อสร้างและเรียกใช้โปรเจ็กต์ Maven อีกครั้ง หากคุณเรียกใช้จากบรรทัดคำสั่ง

mvn compile
mvn exec:java -Dexec.mainClass="SolutionRunner"

คราวนี้คุณไม่ควรได้รับข้อผิดพลาดใดๆ เลย แต่ก็จะไม่ได้รับเอาต์พุตที่น่าสนใจเช่นกัน เราจะเพิ่มข้อมูลดังกล่าวเมื่อเรียกใช้ API เพื่อสร้างและลิงก์บัญชีใหม่

5. สร้างบัญชี AdWords ที่มีการจัดการใหม่

ตอนนี้เราได้สร้างออบเจ็กต์เซสชัน API แล้ว เราจะไปสร้างบัญชีที่ต้องการลิงก์ เราจะเริ่มด้วย AdWords และสร้างบัญชีทดสอบภายใต้บัญชีดูแลจัดการ

เข้าถึง ManagedCustomerService

ใน AdWords API เราจะเข้าถึงบริการต่างๆ ที่พร้อมใช้งานได้โดยการเรียกข้อมูลอินสแตนซ์ของคลาส AdWordsServices ก่อนโดยใช้เมธอดแบบคงที่ getInstance() เมื่อใช้อินสแตนซ์นี้ เราจะสร้างไคลเอ็นต์สำหรับบริการเหล่านั้นผ่านเมธอด get() ซึ่งรับอาร์กิวเมนต์ 2 รายการ ได้แก่ เซสชันที่จะสร้างไคลเอ็นต์ และอินเทอร์เฟซสำหรับบริการที่ต้องการ

SolutionRunner.java

// TODO(newAWaccount): Using the ManagedCustomerService, create a new testing AdWords account
// under the given manager account.

AdWordsServicesInterface adWordsServices = AdWordsServices.getInstance();

ManagedCustomerServiceInterface managedCustomerService =
    adWordsServices.get(adWordsSession, ManagedCustomerServiceInterface.class);

ในที่นี้ เราจะเข้าถึง ManagedCustomerService ซึ่งช่วยให้เราจัดการ "ลูกค้า" (บัญชี) ของ AdWords จากบัญชีดูแลจัดการที่กำหนดได้

ระบุการตั้งค่าบัญชีใหม่

ก่อนอื่นเราจะสร้างออบเจ็กต์ ManagedCustomer ที่มีการตั้งค่าสำหรับบัญชีใหม่ เราจะสร้างบัญชีทดสอบสำหรับ Codelab นี้ โดยตั้งค่าสกุลเงินเป็น USD และเขตเวลาให้เหมือนกับชายฝั่งตะวันตกของสหรัฐอเมริกา

SolutionRunner.java

Random rand = new Random();
long run = rand.nextLong();

ManagedCustomer newAdWordsAccount = new ManagedCustomer();
newAdWordsAccount.setName(String.format("AdWords Account Created by Run %d", run));
newAdWordsAccount.setTestAccount(true);
newAdWordsAccount.setCurrencyCode("USD");
newAdWordsAccount.setDateTimeZone("America/Los_Angeles");

นอกจากนี้ เรายังสร้างหมายเลขสุ่มซึ่งจะรวมไว้ในชื่อบัญชีด้วย ทั้งนี้เพื่อให้เราจับคู่บัญชี AdWords ที่เราจะสร้างที่นี่กับบัญชี Merchant Center ที่เราจะสร้างในภายหลังได้ เพื่อให้เราตรวจสอบด้วยสายตาได้เมื่อโซลูชันเสร็จสมบูรณ์ และตรวจสอบว่าได้ลิงก์ทั้ง 2 บัญชีแล้วจริง

สร้างบัญชีที่จัดการใหม่

หากต้องการสร้างบัญชีใหม่จริงๆ เราจะใช้ ManagedCustomerOperation เพื่อระบุการดำเนินการ ADD ดังนี้

SolutionRunner.java

ManagedCustomerOperation operation = new ManagedCustomerOperation();
operation.setOperand(newAdWordsAccount);
operation.setOperator(Operator.ADD);

จากนั้นเราจะดำเนินการโดยใช้วิธี mutate() ของออบเจ็กต์ ManagedCustomerService วิธีนี้ต้องใช้อาร์เรย์ของการดำเนินการ แต่ในที่นี้เราต้องการดำเนินการเพียงอย่างเดียว ผลลัพธ์ของเมธอด mutate() คือค่าที่มีรายการของ ManagedCustomer ในที่นี้จะเป็นรายการที่มีลูกค้า 1 ราย ซึ่งก็คือบัญชีใหม่ที่เราสร้างขึ้น เราจะดึงรหัสสำหรับบัญชีใหม่นั้นเพื่อใช้ในอนาคต และจะพิมพ์รหัสออกมาด้วยเพื่อให้เราเห็นเป็นส่วนหนึ่งของเอาต์พุตของโซลูชัน

SolutionRunner.java

ManagedCustomerReturnValue result =
    managedCustomerService.mutate(new ManagedCustomerOperation[] {operation});
Long adWordsId = result.getValue()[0].getCustomerId();
System.out.printf("Created new AdWords account %d%n", adWordsId);

ทดสอบเลย

ลองเรียกใช้โซลูชันเช่นเดียวกับที่เคยทำ หากคุณใช้ Maven จากบรรทัดคำสั่ง ให้ทำดังนี้

mvn compile
mvn exec:java -Dexec.mainClass="SolutionRunner"

หากทุกอย่างเป็นไปด้วยดี คุณจะยังไม่เห็นข้อผิดพลาดใดๆ และครั้งนี้เราจะเห็นรหัสของบัญชี AdWords ใหม่ที่เราสร้างขึ้น ตรวจสอบเว็บไซต์ AdWords สำหรับบัญชีดูแลจัดการ แล้วคุณจะเห็นบัญชีใหม่แสดงอยู่ในนั้นด้วย

6. สร้างบัญชีย่อย Merchant Center ใหม่

ในขั้นตอนนี้ เราจะสร้างบัญชีย่อย Merchant Center ที่จะลิงก์กับบัญชี AdWords ที่เราสร้างขึ้นในขั้นตอนสุดท้าย เราสามารถขอลิงก์ในระหว่างการสร้างได้เลย เนื่องจากเรามีรหัสของบัญชี AdWords ที่เกี่ยวข้องอยู่แล้ว แทนที่จะขอลิงก์แยกต่างหากหลังจากสร้างบัญชีย่อย

ระบุการตั้งค่าสำหรับบัญชีย่อยใหม่

Setter สำหรับคลาสโมเดล Account จะแสดงผลออบเจ็กต์เพื่อให้เราเชื่อมโยงการเรียกไปยังออบเจ็กต์ใหม่ Account ได้ ซึ่งแตกต่างจาก AdWords API เราจะใช้หมายเลขสุ่มที่สร้างขึ้นระหว่างการสร้างบัญชี AdWords ในชื่อบัญชี Merchant Center ใหม่ด้วย

SolutionRunner.java

Account newMcAccount = new Account()
    .setName(String.format("Merchant Center Account Created by Run %d", run))
    .setAdwordsLinks(
        ImmutableList.of(
            new AccountAdwordsLink()
                .setAdwordsId(BigInteger.valueOf(adWordsId))
                .setStatus("active")));

ดังที่ได้กล่าวไว้ในส่วนแนะนำสำหรับขั้นตอนนี้ เนื่องจากเรามีรหัส Google Ads สำหรับบัญชีที่จัดการใหม่แล้ว เราจึงเพิ่มรหัสดังกล่าวลงในรายการ AdwordsLinks สำหรับบัญชีย่อยใหม่ได้เลย เมื่อสร้างบัญชีย่อยใหม่ ระบบจะขอลิงก์นี้โดยอัตโนมัติและลิงก์จะพร้อมใช้งานใน AdWords API

สร้างบัญชีย่อยใหม่

ใน Content API เราจะเรียกใช้เมธอด accounts() ของออบเจ็กต์เซสชันเพื่อเข้าถึงบริการ Accounts จากนั้นเรียกใช้เมธอด insert() โดยตรงแทนที่จะตั้งค่าออบเจ็กต์การดำเนินการ เมธอดนี้รับอาร์กิวเมนต์ 2 รายการ ได้แก่ รหัสของบัญชีหลายลูกค้าที่จะสร้างบัญชีย่อยใหม่ และออบเจ็กต์ Account ที่มีการตั้งค่าที่ต้องการ

SolutionRunner.java

newMcAccount = contentApiSession.accounts().insert(mcaId, newMcAccount).execute();

System.out.printf("Created new Merchant Center account %s%n", newMcAccount.getId());

เมธอด insert() จะแสดงผลออบเจ็กต์ Account ที่มีการตั้งค่าสำหรับบัญชีย่อยใหม่ เราเขียนทับออบเจ็กต์ Account เดิมเนื่องจากเวอร์ชันที่ส่งคืนมีข้อมูลสำคัญคือรหัสของบัญชีย่อยใหม่ เราจะพิมพ์ข้อมูลดังกล่าวในเอาต์พุตจากโซลูชันของเรา เพื่อให้เราเรียกใช้โซลูชันและยืนยันว่าบัญชีย่อยใหม่มีอยู่ใน Merchant Center ได้

ทดสอบเลย

ลองเรียกใช้โซลูชันเช่นเดียวกับที่เคยทำ หากคุณใช้ Maven จากบรรทัดคำสั่ง ให้ทำดังนี้

mvn compile
mvn exec:java -Dexec.mainClass="SolutionRunner"

หากทุกอย่างเป็นไปด้วยดี คุณจะยังไม่เห็นข้อผิดพลาดใดๆ และในครั้งนี้เราจะเห็นรหัสของทั้งบัญชี AdWords ใหม่และบัญชี Merchant Center ใหม่ ตรวจสอบ Merchant Center สำหรับบัญชีหลายลูกค้าเพื่อดูบัญชีย่อยใหม่

7. ยอมรับลิงก์จากบัญชี AdWords

ในขั้นตอนสุดท้าย เราได้สร้างบัญชีย่อย Merchant Center ใหม่พร้อมขอลิงก์ไปยังบัญชี AdWords ใหม่ในเวลาเดียวกัน ในขั้นตอนนี้ เราจะดำเนินการให้เสร็จสมบูรณ์โดยใช้ AdWords API เพื่อยอมรับลิงก์ที่ขอ

เข้าถึงโมเดล CustomerService

เช่นเดียวกับก่อนหน้านี้ เราจะใช้คลาส AdWordsServices เพื่อรับไคลเอ็นต์สำหรับ CustomerService อย่างไรก็ตาม ก่อนที่จะสร้างไคลเอ็นต์ เราจะเปลี่ยนออบเจ็กต์เซสชัน AdWords ก่อนเพื่อให้การใช้งานในอนาคตจะดำเนินการในบัญชีที่มีการจัดการใหม่แทนบัญชีดูแลจัดการ เนื่องจากบัญชี Merchant Center ขอลิงก์กับบัญชีที่มีการจัดการ ไม่ใช่บัญชีดูแลจัดการ

SolutionRunner.java

// TODO(acceptLink): Using the mutateServiceLinks method in CustomerService, accept the
// proposed link between the new AdWords account and the new Merchant Center account.

adWordsSession.setClientCustomerId(adWordsId.toString());

CustomerServiceInterface customerService =
    adWordsServices.get(adWordsSession, CustomerServiceInterface.class);

เช่นเดียวกับตอนที่เราสร้างบัญชี AdWords ใหม่ เราจะสร้างออบเจ็กต์ ServiceLink ที่มีการตั้งค่าลิงก์ จากนั้นสร้างออบเจ็กต์ ServiceLinkOperation ที่อธิบายการดำเนินการที่ต้องการ ในที่นี้ เราต้องการลิงก์บริการที่รอดำเนินการกับบัญชี MERCHANT_CENTER และSET กับ ACTIVE สำหรับserviceLinkId เราจะใช้รหัสของบัญชี Merchant Center ที่เพิ่งสร้าง เนื่องจากใช้สำหรับรหัสของลิงก์บริการใน AdWords

SolutionRunner.java

ServiceLink serviceLink = new ServiceLink();
serviceLink.setServiceLinkId(newMcAccount.getId().longValue());
serviceLink.setLinkStatus(ServiceLinkLinkStatus.ACTIVE);
serviceLink.setServiceType(ServiceType.MERCHANT_CENTER);

ServiceLinkOperation op = new ServiceLinkOperation();
op.setOperator(Operator.SET);
op.setOperand(serviceLink);

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

SolutionRunner.java

ServiceLink[] mutatedServiceLinks =
    customerService.mutateServiceLinks(new ServiceLinkOperation[] {op});
for (ServiceLink mutatedServiceLink : mutatedServiceLinks) {
  System.out.printf(
      "Service link with service link ID %d, type '%s' updated to status: %s.%n",
      mutatedServiceLink.getServiceLinkId(),
      mutatedServiceLink.getServiceType(),
      mutatedServiceLink.getLinkStatus());
}

ทดสอบเลย

ลองเรียกใช้โซลูชันเช่นเดียวกับที่เคยทำ หากคุณใช้ Maven จากบรรทัดคำสั่ง ให้ทำดังนี้

mvn compile
mvn exec:java -Dexec.mainClass="SolutionRunner"

หากทุกอย่างเป็นไปด้วยดี คุณจะยังไม่เห็นข้อผิดพลาดใดๆ และในครั้งนี้เราจะเห็นหมายเหตุว่าลิงก์บริการได้รับการอัปเดตให้ใช้งานได้แล้วด้วย ตรวจสอบ AdWords และ Merchant Center อีกครั้งเพื่อให้แน่ใจว่าบัญชีลิงก์กันแล้ว

8. รูปแบบต่างๆ ของธีม

ขอแสดงความยินดีที่ทำ Codelab นี้จนจบ ตอนนี้คุณมีโซลูชันที่ใช้งานได้อย่างเต็มรูปแบบแล้ว มาดูตัวอย่างวิธีแก้ไขหรือขยายโซลูชันเพื่อใช้ API ที่คุณเห็นใน Codelab นี้ให้มากขึ้นกัน

ใน Codelab เราได้สร้างบัญชี AdWords ก่อนอย่างชาญฉลาดเพื่อให้เราใช้ข้อมูลของบัญชีดังกล่าวเพื่อขอลิงก์เมื่อสร้างบัญชี Merchant Center ได้ อย่างไรก็ตาม หากมีบัญชี Merchant Center อยู่แล้ว คุณจะต้องอัปเดตการกำหนดค่าแทน ลองแก้ไขโค้ดเพื่อสร้างบัญชี Merchant Center ก่อน จากนั้นกลับไปหลังจากสร้างบัญชี AdWords แล้ว และอัปเดตการกำหนดค่าเพื่อขอลิงก์

ปัจจุบันแอปพลิเคชันจะถือว่าการไม่มีข้อผิดพลาดจากการเรียก API เป็นสัญญาณของความสำเร็จเท่านั้น ลองขยายตัวอย่างเพื่อตรวจสอบข้อมูลลิงก์สำหรับบัญชี Merchant Center และ AdWords ใหม่ และดูว่าลิงก์ใช้งานได้จริง

โลกทั้งใบเป็นของคุณ

หากคิดถึงการเปลี่ยนแปลงอื่นๆ ที่คุณทำได้ ก็ลองทำดู หากต้องการรหัสอ้างอิงสำหรับแนวคิด โปรดดูตัวอย่าง Google Shopping และexamplesไดเรกทอรีในแหล่งที่มาของไลบรารีไคลเอ็นต์ Java ของ Google Ads