ใช้ Google Play Billing Library กับ Unity

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

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

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

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

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

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

  1. ทำตามขั้นตอนทั้งหมดในบทแนะนำของ Unity ต่อไปนี้: Set up your project for Unity Services
  2. ทำตามขั้นตอนทั้งหมดในบทแนะนำของ Unity ต่อไปนี้: Enable the Unity IAP service

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

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

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

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

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

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

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

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

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

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

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

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

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

หากเกมใช้สคริปต์ผู้ซื้อเดียวกันสำหรับหลายแพลตฟอร์ม คุณควรเพิ่มการตรวจสอบแพลตฟอร์มเพื่อให้แน่ใจว่า 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 คุณควรแทนที่การใช้งาน Unity IAP เริ่มต้นเฉพาะเมื่อเลือก 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 Billing ขยายบริการ Unity IAP ดังนั้นคุณจึงสามารถใช้ API เดียวกันของ Unity เพื่อจัดการเวิร์กโฟลว์การซื้อทั่วไปได้ โปรดทราบว่าลักษณะการทำงานของ API มีการเปลี่ยนแปลงเล็กน้อยเนื่องจากความแตกต่างระหว่าง Google Play Billing Library กับการใช้งาน IAP มาตรฐานของ Unity สำหรับ App Store อื่นๆ หากคุณยังไม่คุ้นเคยกับ API ของ Unity IAP โปรดดู ส่วน "Making a Purchase Script" ใน บทแนะนำ Unity IAP เพื่อดูตัวอย่างวิธีใช้โฟลว์การซื้อพื้นฐาน

นอกจากนี้ Google Play Billing Library ยังมีฟีเจอร์บางอย่างที่เฉพาะเจาะจงสำหรับ 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() จาก 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 Billing 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 Billing ไม่รองรับการใช้เมธอด SubscriptionManager.UpdateSubscription() และ SubscriptionManager.UpdateSubscriptionInGooglePlayStore() เพื่ออัปเกรดและดาวน์เกรดการสมัครใช้บริการ หากเกมเรียกใช้เมธอดเหล่านี้ ระบบจะแสดง GooglePlayStoreUnsupportedException

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

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

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

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