ใช้ Google Play Billing Library กับ Unity

ปลั๊กอินการเรียกเก็บเงินของ Google Play จะขยายบริการและเนื้อหาในตัวของ Unity สำหรับการซื้อในแอปที่เรียกว่า Unity IAP เพื่อมอบฟีเจอร์ล่าสุดทั้งหมดของ Google Play Billing Library ให้กับเกม คู่มือนี้จะอธิบายวิธีตั้งค่าโปรเจ็กต์ให้ใช้ปลั๊กอิน คู่มือนี้ยังอธิบายวิธีใช้ฟีเจอร์ Google Play Billing Library ในเกมของคุณใน Unity ด้วย

ตั้งค่าปลั๊กอิน Google Play Billing

หากต้องการตั้งค่าปลั๊กอิน ให้ทําตามขั้นตอนในส่วนที่ลิงก์แต่ละส่วนต่อไปนี้

  1. เปิดใช้เลเยอร์การแยกชั้น IAP ของ Unity
  2. ดาวน์โหลดและนําเข้าปลั๊กอิน
  3. กําหนดการตั้งค่าการสร้างของปลั๊กอิน
  4. เปิดใช้ปลั๊กอิน

เปิดใช้เลเยอร์การแยกชั้น IAP ของ Unity

ปลั๊กอิน Google Play Billing สร้างขึ้นจากเลเยอร์การแยกชั้นที่รวมอยู่ใน Unity IAP คุณจึงต้องเปิดใช้เลเยอร์การแยกชั้นนี้ก่อนดาวน์โหลดและนําเข้าปลั๊กอิน หากต้องการเปิดใช้เลเยอร์การแยกชั้น IAP ของ Unity ให้ทําดังนี้

  1. ทำตามขั้นตอนทั้งหมดในบทแนะนำ Unity ต่อไปนี้ ตั้งค่าโปรเจ็กต์สำหรับบริการของ Unity
  2. ทำตามขั้นตอนทั้งหมดในบทแนะนำ Unity ต่อไปนี้ เปิดใช้บริการ IAP ของ Unity

ดาวน์โหลดและนําเข้าปลั๊กอิน

ระบบจะจัดส่งปลั๊กอินเป็นแพ็กเกจ Unity ในรูปแบบ .unitypackage หากต้องการดาวน์โหลดและนําเข้าปลั๊กอิน ให้ทําตามขั้นตอนต่อไปนี้

  1. ดาวน์โหลดปลั๊กอิน Google Play สำหรับ Unity เวอร์ชันล่าสุดจากหน้ารุ่นใน GitHub ของที่เก็บ
  2. จากแถบเมนูของ Unity ให้คลิกเนื้อหา > นำเข้าแพ็กเกจ > แพ็กเกจที่กำหนดเอง

  3. ค้นหาตำแหน่งที่คุณดาวน์โหลดไฟล์ .unitypackage แล้วเลือกไฟล์

  4. ในกล่องโต้ตอบนําเข้าแพ็กเกจ Unity ให้เลือกชิ้นงานทั้งหมดไว้ แล้วคลิกนําเข้า

หลังจากนำเข้าแพ็กเกจแล้ว ระบบจะเพิ่มโฟลเดอร์ใหม่ชื่อ GooglePlayPlugins (ที่รูทของโฟลเดอร์ Assets) ลงในชิ้นงานโปรเจ็กต์ โฟลเดอร์นี้มีชิ้นงาน Google Play Billing Library ทั้งหมดสำหรับปลั๊กอิน

กำหนดการตั้งค่าบิลด์

เนื่องจากปลั๊กอินขยาย Unity IAP ทำให้ Unity จะพบข้อขัดแย้งและสร้าง APK ของ Android ไม่ได้ เว้นแต่จะมีการนําการพึ่งพาที่เก่ากว่าและทับซ้อนกันบางส่วนใน Unity IAP ออกจากบิลด์ ปลั๊กอินมีวิธีอัตโนมัติในการนําไลบรารีที่ทับซ้อนกันออกจากโปรเจ็กต์ หากต้องการแก้ไขความขัดแย้งเหล่านี้ ให้ทำตามขั้นตอนต่อไปนี้

  1. จากแถบเมนู Unity ให้เลือก Google > Play Billing > Build Settings

  2. คลิกแก้ไขในหน้าต่างการตั้งค่าบิลด์ Play Billing ซึ่งจะแก้ไขข้อขัดแย้งและย้ายไฟล์ Unity IAP ที่ขัดแย้งกันไปยังไดเรกทอรีสํารอง หลังจากคลิกแก้ไข ปุ่มจะเปลี่ยนเป็นกู้คืน ซึ่งคุณสามารถคลิกเพื่อกู้คืนไฟล์ต้นฉบับที่ทับซ้อนกันได้

เปิดใช้ปลั๊กอิน

หากต้องการเปิดใช้ปลั๊กอิน ให้แทนที่การใช้งาน Google Play ของ Unity IAP ด้วยปลั๊กอิน Google Play Billing ตัวอย่างเช่น เมื่อใช้สคริปต์ผู้ซื้อ IAP ของ Unity คุณจะต้องเปลี่ยน StandardPurchaseModule ที่ส่งไปยังเครื่องมือสร้าง IAP เพื่อใช้ Google.Play.Billing.GooglePlayStoreModule ดังนี้

// Create a builder using the GooglePlayStoreModule.
var configurationBuilder =
    ConfigurationBuilder.Instance(Google.Play.Billing.GooglePlayStoreModule.Instance());

หากเกมใช้สคริปต์ Purchaser เดียวกันสำหรับหลายแพลตฟอร์ม คุณควรเพิ่มการตรวจสอบแพลตฟอร์มเพื่อให้มั่นใจว่า Unity จะใช้โซลูชัน IAP ของตัวเองสำหรับแพลตฟอร์มอื่นๆ ต่อไป

ConfigurationBuilder builder;
if (Application.platform == RuntimePlatform.Android)
{
  builder = ConfigurationBuilder.Instance(
      Google.Play.Billing.GooglePlayStoreModule.Instance());
}
else
{
  builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance());
}

หากคุณเผยแพร่เกมใน App Store อื่นๆ ของ Android นอกเหนือจาก Google Play Store คุณควรแทนที่การใช้งาน IAP เริ่มต้นของ Unity เฉพาะเมื่อเลือก Google Play Store เท่านั้น โดยทำดังนี้

ConfigurationBuilder builder;
if (Application.platform == RuntimePlatform.Android
       && SelectedAndoidAppStore == AppStore.GooglePlay)
{
  builder = ConfigurationBuilder.Instance(
      Google.Play.Billing.GooglePlayStoreModule.Instance());
}
else
{
  builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance());
}

ใช้ฟีเจอร์ของ Google Play Billing Library ในเกม

ปลั๊กอินการเรียกเก็บเงินของ Google Play จะขยายบริการ IAP ของ Unity คุณจึงใช้ Unity API เดียวกันเพื่อจัดการเวิร์กโฟลว์การซื้อทั่วไปได้ โปรดทราบว่ามีการเปลี่ยนแปลงเล็กน้อยในลักษณะการทํางานของ API เนื่องจากความแตกต่างระหว่าง Google Play Billing Library กับการใช้งาน IAP มาตรฐานของ Unity สําหรับ App Store อื่นๆ หากคุณเพิ่งเริ่มใช้ Unity IAP API โปรดดูตัวอย่างวิธีใช้ขั้นตอนการซื้อพื้นฐานในส่วน "การสร้างสคริปต์การซื้อ" ในบทแนะนำ Unity IAP

นอกจากนี้ คลังการเรียกเก็บเงินของ Google Play ยังมีฟีเจอร์บางอย่างที่ Google Play Store เท่านั้นที่จะมี คุณสามารถเข้าถึงฟีเจอร์เหล่านี้ผ่านอินเทอร์เฟซแบบขยาย ส่วนที่เหลือของส่วนนี้จะอธิบายวิธีใช้ฟีเจอร์เฉพาะเหล่านี้ของ Google Play Billing Library ในเกม

เปิดใช้การซื้อแบบเลื่อนเวลา

Google Play รองรับการซื้อแบบเลื่อนเวลา หรือที่เรียกว่าธุรกรรมที่รอดำเนินการหรือการซื้อที่รอดำเนินการ ซึ่งผู้ใช้สามารถสร้างการซื้อและดำเนินการซื้อให้เสร็จสมบูรณ์ในภายหลังโดยใช้เงินสดที่ร้านค้า

หากต้องการเปิดใช้การซื้อแบบเลื่อนเวลาการชำระเงิน ให้ใช้เครื่องมือสร้าง IAP เพื่อแก้ไขการกำหนดค่าของข้อบังคับโดยเรียกใช้เมธอด EnableDeferredPurchase() ดังนี้

// Create a builder using a GooglePlayStoreModule.
var configurationBuilder =
    ConfigurationBuilder.Instance(Google.Play.Billing.GooglePlayStoreModule.Instance());
// Enable deferred purchases
configurationBuilder.Configure<Google.Play.Billing.IGooglePlayConfiguration>()
    .EnableDeferredPurchase();

ต่อไป ให้ใช้การเรียกกลับการซื้อที่รอดำเนินการโดยใช้ส่วนขยาย Play Store โดยทำดังนี้

// Get the plugin extensions for the Google Play Store.
_playStoreExtensions =
    extensions.GetExtension<Google.Play.Billing.IGooglePlayStoreExtensions>();

// Set the deferred purchases callback.
_playStoreExtensions.SetDeferredPurchaseListener(
    delegate(Product product)
    {
        // Do not grant the item here. Instead, record the purchase and remind
        // the user to complete the transaction in the Play Store.
    });

ส่งรหัสบัญชีที่มีการสร้างความสับสนไปยัง Google Play

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

หากต้องการส่งรหัสบัญชีที่มีการสร้างความสับสน ให้เรียกใช้เมธอด SetObfuscatedAccountId() จาก Extensions API ดังนี้

// Get the plugin extensions for the Google Play Store.
_playStoreExtensions =
    extensions.GetExtension<Google.Play.Billing.IGooglePlayStoreExtensions>();

// Pass an obfuscated account ID.
_playStoreExtensions.SetObfuscatedAccountId(obfuscatedAccountId);

ส่งรหัสโปรไฟล์ที่มีการสร้างความสับสนไปยัง Google Play

คุณสามารถส่งรหัสโปรไฟล์ที่มีการสร้างความสับสนไปยัง Google Play เพื่ออำนวยความสะดวกในการตรวจจับการประพฤติมิชอบ เช่น การตรวจจับว่าอุปกรณ์หลายเครื่องทำการซื้อในบัญชีเดียวกันในช่วงเวลาสั้นๆ หรือไม่ ซึ่งคล้ายกับการส่งรหัสบัญชีผู้ใช้ที่มีการสร้างความสับสน รหัสจะแสดงถึงผู้ใช้รายเดียวทั้งใน 2 กรณี แต่รหัสโปรไฟล์ช่วยให้คุณระบุผู้ใช้รายเดียวในโปรไฟล์หลายรายการที่มีภายในแอปเดียวได้ หลังจากที่ส่งรหัสโปรไฟล์ที่มีการสร้างความสับสนไปยัง Google Play แล้ว คุณจะเรียกดูรหัสดังกล่าวได้ในใบเสร็จการซื้อในภายหลัง

หากต้องการส่งรหัสโปรไฟล์ที่มีการสร้างความสับสน ให้ใช้เครื่องมือสร้าง IAP เพื่อแก้ไขการกําหนดค่าของโมดูลโดยการเรียกใช้เมธอด SetObfuscatedProfileId() ดังนี้

// Get the plugin extensions for the Google Play Store.
_playStoreExtensions =
    extensions.GetExtension<Google.Play.Billing.IGooglePlayStoreExtensions>();

// Pass an obfuscated profile ID.
_playStoreExtensions.SetObfuscatedProfileId(obfuscatedProfileId);

ยืนยันการเปลี่ยนแปลงราคาการสมัครใช้บริการ

Google Play ให้คุณเปลี่ยนราคาของการสมัครใช้บริการที่ใช้งานอยู่ได้ ผู้ใช้เกมของคุณต้องยืนยันการเปลี่ยนแปลงราคาก่อนการเปลี่ยนแปลงจะมีผล หากต้องการกระตุ้นให้ผู้ใช้ยืนยันการเปลี่ยนแปลงราคาการสมัครใช้บริการ ให้เรียกใช้เมธอด ConfirmSubscriptionPriceChange() ดังนี้

// Get the plugin extensions for the Google Play Store.
_playStoreExtensions =
    extensions.GetExtension<Google.Play.Billing.IGooglePlayStoreExtensions>();

_playStoreExtensions.ConfirmSubscriptionPriceChange(productId,
    delegate (bool success)
    {
        // Returns whether the user has accepted the new price or not.
    });

การเปลี่ยนแปลงลักษณะการทํางานของ Unity API

เมื่อใช้ปลั๊กอินการเรียกเก็บเงินของ Google Play API ส่วนใหญ่จะทํางานในลักษณะเดียวกับการใช้งาน IAP มาตรฐานของ Unity สําหรับ App Store อื่นๆ อย่างไรก็ตาม ก็มีบางกรณีที่ API จะทำงานแตกต่างกัน ส่วนนี้จะอธิบายความแตกต่างของลักษณะการทำงานเหล่านี้

ระบบไม่รองรับเพย์โหลดของนักพัฒนาแอป

Google Play ได้เลิกใช้งานเพย์โหลดของนักพัฒนาแอปและกำลังแทนที่ด้วยทางเลือกที่มีความหมายและตรงตามบริบทมากขึ้น ด้วยเหตุนี้ ระบบจึงไม่รองรับเพย์โหลดของนักพัฒนาแอป ดูข้อมูลเพิ่มเติมเกี่ยวกับทางเลือกอื่นๆ ได้ในหน้าเกี่ยวกับเพย์โหลดของนักพัฒนาแอป

คุณยังคงใช้อินเทอร์เฟซเดียวกันกับที่กําหนดโดยการใช้งาน IAP มาตรฐานของ Unity สําหรับ App Store อื่นๆ ได้ ซึ่งรวมถึง IStoreController เมื่อเริ่มการซื้อ คุณจะยังคงใช้ IStoreController และเรียกใช้เมธอด InitiatePurchase() ได้ ดังนี้

public void InitiatePurchase(Purchasing.Product product, string payload);

อย่างไรก็ตาม เพย์โหลดที่คุณส่งจะไม่มีผล (จะไม่ปรากฏในใบเสร็จสุดท้าย)

ไม่รองรับ SubscriptionManager

Unity IAP มีคลาส SubscriptionManager สําหรับจัดการการสมัครใช้บริการ เนื่องจากการใช้งาน IAP มาตรฐานของ Unity สำหรับคลาสนี้ใช้เพย์โหลดของนักพัฒนาแอป ระบบจึงไม่รองรับคลาสนี้ คุณยังคงสร้างคลาสนี้ได้ แต่อาจได้รับข้อมูลที่ไม่น่าเชื่อถือเมื่อใช้เมธอด getter ของคลาส

UpdateSubscription มีการเปลี่ยนแปลง API เล็กน้อย

ปลั๊กอินการเรียกเก็บเงินของ Google Play ไม่รองรับการใช้วิธี SubscriptionManager.UpdateSubscription() และ SubscriptionManager.UpdateSubscriptionInGooglePlayStore() เพื่ออัปเกรดและดาวน์เกรดการสมัครใช้บริการ หากเกมเรียกใช้เมธอดเหล่านี้ ระบบจะแสดงGooglePlayStoreUnsupportedException

ไลบรารี Google Play Billing มี API ทางเลือกให้ใช้แทนวิธีการเหล่านี้ หากต้องการอัปเกรดหรือดาวน์เกรดการสมัครใช้บริการ ให้เรียกใช้UpdateSubscription()วิธีนี้โดยใช้โหมดการแบ่งตามสัดส่วน

void UpdateSubscription(Product oldProduct, Product newProduct,
           GooglePlayStoreProrationMode prorationMode = GooglePlayStoreProrationMode.Unknown);

คุณสามารถรวมการเรียกเมธอดนี้ไว้ในการตรวจสอบแพลตฟอร์มหรือในบล็อก catch ได้เมื่อจับ GooglePlayStoreUnsupportedException

ดูข้อมูลเพิ่มเติมและตัวอย่างวิธีใช้โหมดการแบ่งตามสัดส่วนได้ที่ตั้งค่าโหมดการแบ่งตามสัดส่วน