เกี่ยวกับการสมัครใช้บริการ

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

หากยังไม่ได้กำหนดค่าผลิตภัณฑ์การสมัครใช้บริการสำหรับแอป โปรดดูสร้างและ กำหนดค่าผลิตภัณฑ์

ภาพรวมการสมัครใช้บริการ

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

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

ดูภาพรวมโดยละเอียดของผลิตภัณฑ์การสมัครใช้บริการ แผนพื้นฐาน และข้อเสนอได้ใน เอกสารประกอบในศูนย์ช่วยเหลือของ Play Console

Play Billing Library รองรับการสมัครใช้บริการประเภทต่อไปนี้

  • การสมัครใช้บริการแบบไอเทมเดียว - ในประเภทนี้ ไอเทม 1 รายการจะสอดคล้องกับสิทธิ์ 1 รายการ เช่น การสมัครใช้บริการสตรีมมิงเพลง

  • การสมัครใช้บริการที่มีส่วนเสริม - ในประเภทนี้ การซื้อ 1 ครั้งอาจมีสิทธิ์ที่แตกต่างกันหลายรายการรวมอยู่ในการซื้อครั้งเดียว เช่น การสมัครใช้บริการทั้งบริการสตรีมมิงเพลงและการสมัครใช้บริการวิดีโอ ดูข้อมูลเฉพาะเกี่ยวกับการสมัครใช้บริการที่มีส่วนเสริมได้ที่การสมัครใช้บริการที่มีส่วนเสริม

การผสานรวมแพ็กเกจแบบชำระเงินล่วงหน้า

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

สำหรับการเติมเงิน ให้เปิดขั้นตอนการเรียกเก็บเงินเหมือนกับการซื้อครั้งแรก คุณไม่จำเป็นต้องระบุว่าการซื้อเป็นการเติมเงิน

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

หลังจากเติมเงินแล้ว ระบบจะอัปเดตช่องต่อไปนี้ในออบเจ็กต์ผลลัพธ์ของ Purchase เพื่อให้แสดงการซื้อการเติมเงินล่าสุด

  • รหัสคำสั่งซื้อ
  • เวลาที่ซื้อ
  • ลายเซ็น
  • โทเค็นการซื้อ
  • รับทราบแล้ว

Purchase ฟิลด์ต่อไปนี้จะมีข้อมูลเดียวกันกับที่พบในการซื้อครั้งแรกเสมอ

  • ชื่อแพ็กเกจ
  • สถานะการซื้อ
  • ผลิตภัณฑ์
  • การต่ออายุใหม่อัตโนมัติ

การรับทราบการซื้อแบบชำระล่วงหน้า

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

เนื่องจากแพ็กเกจแบบชำระล่วงหน้าอาจมีระยะเวลาสั้นๆ คุณจึงควร รับทราบการซื้อโดยเร็วที่สุด

คุณต้องรับทราบแพ็กเกจแบบชำระล่วงหน้าที่มีระยะเวลา 1 สัปดาห์ขึ้นไปภายใน 3 วัน

คุณต้องรับทราบแพ็กเกจแบบชำระล่วงหน้าที่มีระยะเวลาน้อยกว่า 1 สัปดาห์ภายใน ครึ่งหนึ่งของระยะเวลาแพ็กเกจ เช่น นักพัฒนาแอปมีเวลา 1.5 วันในการรับทราบแพ็กเกจแบบชำระเงินล่วงหน้า 3 วัน

การผสานรวมการสมัครใช้บริการแบบผ่อนชำระ

การสมัครใช้บริการแบบผ่อนชำระคือการสมัครใช้บริการประเภทหนึ่งที่ผู้ใช้ชำระค่า สมัครใช้บริการเป็นงวดๆ ในช่วงระยะเวลาหนึ่ง แทนที่จะชำระ ค่าสมัครใช้บริการทั้งหมดล่วงหน้า

ข้อควรพิจารณาเพิ่มเติมสำหรับการสมัครใช้บริการแบบผ่อนชำระ

  • ความพร้อมให้บริการในประเทศ: ฟีเจอร์การสมัครใช้บริการแบบผ่อนชำระพร้อมให้บริการในบราซิล ฝรั่งเศส อิตาลี และสเปนเท่านั้น (ตรวจสอบความพร้อมให้บริการล่าสุดใน Console)
  • การกำหนดราคา: เมื่อกำหนดราคาสำหรับการสมัครใช้บริการแบบผ่อนชำระใน Console ราคาจะแสดงจำนวนเงินที่ชำระรายเดือน เมื่อรวมกับระยะเวลาผูกมัดที่ตั้งไว้แล้ว จะทำให้เกิด จำนวนเงินทั้งหมดสำหรับการสมัครใช้บริการในหน้าจอการซื้อ
  • ระยะเวลาผูกมัด: ระยะเวลาทั้งหมดของการสมัครใช้บริการเริ่มต้น ซึ่งต้องมีการชำระเงินรายเดือน เช่น หาก แพ็กเกจเริ่มต้นมีระยะผูกมัด 15 เดือน ผู้ใช้จะชำระเงินรายเดือน 15 ครั้งในช่วงเวลานี้
  • การต่ออายุ: ในบริบทของการสมัครใช้บริการแบบผ่อนชำระ "การต่ออายุ" หมายถึงการสิ้นสุดระยะเวลาสัญญาผูกมัด ไม่ว่าจะเป็นระยะเวลาสัญญาผูกมัดเริ่มต้น หรือระยะเวลาสัญญาผูกมัดในภายหลัง หลังจากลงชื่อสมัครใช้ครั้งแรก การต่ออายุครั้งแรกจะเกิดขึ้นเมื่อสิ้นสุดระยะเวลา การผูกมัดเริ่มต้นทั้งหมด การต่ออายุครั้งต่อๆ ไปจะเกิดขึ้นหลังจากระยะเวลาผูกมัดครั้งต่อๆ ไปสิ้นสุดลง ประเภทการต่ออายุสำหรับการสมัครใช้บริการแบบผ่อนชำระอาจเป็น "ต่ออายุใหม่อัตโนมัติแบบรายเดือน" หรือ "ต่ออายุใหม่อัตโนมัติในระยะเวลาเดิม" สำหรับ "ต่ออายุอัตโนมัติรายเดือน" จะไม่มีการผูกมัดในภายหลังและแพ็กเกจจะ ทำงานเหมือนการสมัครใช้บริการรายเดือน โดยการเรียกเก็บเงินสำหรับการสมัครใช้บริการรายเดือนแต่ละครั้ง ถือเป็นการต่ออายุ
  • รอบการเรียกเก็บเงิน: ในบริบทของการสมัครใช้บริการแบบผ่อนชำระ คำนี้หมายถึง ช่วงเวลาที่เรียกเก็บเงินตามรอบซึ่งมีการชำระเงินแต่ละครั้ง ตามที่ ระบุไว้ในแพ็กเกจเริ่มต้น
  • ลักษณะการเปลี่ยนแพ็กเกจเทียบกับการเปลี่ยนแปลงราคา: สำหรับการเปลี่ยนแปลงราคาและการยกเลิก ข้อผูกมัดจะคงเดิม ซึ่งหมายความว่าหากผู้ใช้ต้องการยกเลิกหรือนักพัฒนาแอปต้องการเปลี่ยนราคา การเปลี่ยนแปลงจะมีผลเมื่อสิ้นสุดระยะเวลาผูกมัด สำหรับการเปลี่ยนแพ็กเกจ สัญญาผูกมัดจะไม่แน่นอน ซึ่งหมายความว่าการเปลี่ยนแพ็กเกจไม่จำเป็นต้องรอจนกว่าจะสิ้นสุดระยะเวลา สัญญา โดยจะมีผลทันทีหรือในวันที่ชำระเงินครั้งถัดไป ตามโหมดการแทนที่ที่ตั้งไว้
  • การเปลี่ยนแพ็กเกจการสมัครใช้บริการเดียวกัน: ระบบไม่อนุญาตให้เปลี่ยนแพ็กเกจจากแพ็กเกจเริ่มต้นแบบผ่อนชำระ เป็นแพ็กเกจเริ่มต้นแบบไม่ผ่อนชำระของผลิตภัณฑ์การสมัครใช้บริการเดียวกัน
  • การแจ้งเตือนแบบเรียลไทม์สำหรับนักพัฒนาแอป (RTDN): A SUBSCRIPTION_CANCELLATION_SCHEDULED ระบบจะส่ง RTDN ทันทีเมื่อ ผู้ใช้ยกเลิกการสมัครใช้บริการด้วยตนเองในกรณีที่ยังมีการชำระเงินสำหรับระยะเวลาตามข้อตกลง การยกเลิกอยู่ระหว่างรอดำเนินการและจะมีผลเมื่อสิ้นสุดระยะเวลา สัญญาเท่านั้น จากนั้นหากผู้ใช้ไม่กู้คืน ระบบจะส่ง SUBSCRIPTION_CANCELED และ SUBSCRIPTION_EXPIRED RTDN เมื่อสิ้นสุด ระยะเวลาข้อผูกมัด

  • การชำระคืน / การรับรู้รายได้: การชำระคืนให้แก่นักพัฒนาแอปจะเกิดขึ้นเมื่อผู้ใช้ชำระเงินรายเดือน โดยเป็นไปตามข้อกำหนดเดียวกันกับการสมัครใช้บริการอื่นๆ ทั้งหมด นักพัฒนาแอปจะไม่ได้รับการชำระเงินล่วงหน้าเมื่อผู้ใช้ลงชื่อสมัครใช้บริการแบบผ่อนชำระ

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

  • ความพร้อมใช้งานของ Play Billing Library: ฟิลด์ installmentDetails จะใช้ได้กับ PBL 7 ขึ้นไปเท่านั้น สำหรับ PBL 5 ขึ้นไป ระบบจะแสดงการสมัครใช้บริการแบบผ่อนชำระโดยใช้ queryProductDetails() แต่การสมัครใช้บริการจะไม่รวมข้อมูลการผ่อนชำระแบบละเอียด เช่น จำนวนการชำระเงินที่ผูกมัดของแพ็กเกจ

ใช้ Deep Link เพื่อให้ผู้ใช้จัดการการสมัครใช้บริการได้

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

คุณสามารถใส่ Deep Link จากแอปไปยังศูนย์การจัดการการสมัครใช้บริการของ Google Play สำหรับการสมัครใช้บริการที่ยังไม่หมดอายุ ซึ่งคุณสามารถระบุได้โดยใช้ฟิลด์ subscriptionState ของแหล่งข้อมูลการสมัครใช้บริการ จากข้อมูลนี้ คุณสามารถ Deep Link ไปยังศูนย์การจัดการการสมัครใช้บริการใน Play Store ได้หลายวิธี

ใช้ URL ต่อไปนี้เพื่อนำผู้ใช้ไปยังหน้าเว็บที่แสดงการติดตามทั้งหมด ตามที่แสดงในรูปที่ 1 และ 2

https://play.google.com/store/account/subscriptions
หน้าจอการสมัครใช้บริการ Play Store จะแสดงสถานะของการสมัครใช้บริการทั้งหมดที่เรียกเก็บเงินผ่าน Google Play ของผู้ใช้
รูปที่ 1 หน้าจอการสมัครใช้บริการ Play Store จะแสดงสถานะของการสมัครใช้บริการทั้งหมดที่เรียกเก็บเงินผ่าน Google Play ของผู้ใช้


แตะการสมัครใช้บริการเพื่อดูรายละเอียดเพิ่มเติม
รูปที่ 2 แตะการติดตามเพื่อดูรายละเอียดเพิ่มเติม

Deep Link นี้อาจมีประโยชน์ในการช่วยผู้ใช้กู้คืนการสมัครใช้บริการที่ยกเลิกไปแล้ว จากศูนย์การสมัครใช้บริการของ Play Store

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

ใช้ URL ต่อไปนี้เพื่อนำผู้ใช้ไปยังหน้าจอการจัดการการสมัครใช้บริการที่เฉพาะเจาะจง โดยแทนที่ "your-sub-product-id" และ "your-app-package" ด้วย productIdและชื่อแพ็กเกจแอปตามลำดับ

https://play.google.com/store/account/subscriptions?sku=your-sub-product-id&package=your-app-package

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

อนุญาตให้ผู้ใช้อัปเกรด ดาวน์เกรด หรือเปลี่ยนการสมัครใช้บริการ

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

  • หากคุณขายการสมัครใช้บริการหลายระดับ เช่น การสมัครใช้บริการ "พื้นฐาน" และ "พรีเมียม" คุณสามารถอนุญาตให้ผู้ใช้เปลี่ยนระดับได้โดยการซื้อแพ็กเกจเริ่มต้นหรือข้อเสนอของการสมัครใช้บริการอื่น
  • คุณอนุญาตให้ผู้ใช้เปลี่ยนรอบการเรียกเก็บเงินปัจจุบันได้ เช่น เปลี่ยนจากแพ็กเกจรายเดือนเป็นรายปี
  • นอกจากนี้ คุณยังอนุญาตให้ผู้ใช้เปลี่ยนแพ็กเกจระหว่างแบบต่ออายุใหม่อัตโนมัติกับแบบชำระล่วงหน้าได้ด้วย

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

รูปที่ 3 แสดงตัวอย่างแอปที่มีแพ็กเกจ 3 แบบ ได้แก่

แอปนี้มีการสมัครใช้บริการ 3 ระดับ
รูปที่ 3 แอปนี้มีการสมัครใช้บริการ 3 ระดับ

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

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

โหมดการแทนที่

ตารางต่อไปนี้แสดงรายการโหมดการแทนที่ที่มีอยู่และตัวอย่างการใช้งาน รวมถึง จำนวนการชำระเงินที่ถือว่าชำระแล้ว

โหมดการแทนที่

คำอธิบาย

ตัวอย่างการใช้

บันทึกการชำระเงินที่ดำเนินการแล้วว่าชำระเงินแล้ว (สำหรับการเปลี่ยนการสมัครใช้บริการแบบผ่อนชำระ)

WITH_TIME_PRORATION

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

อัปเกรดเป็นแพ็กเกจที่แพงขึ้นโดยไม่ต้องชำระเงินเพิ่มเติมทันที

0

CHARGE_PRORATED_PRICE

ระบบจะอัปเกรดรายการการสมัครใช้บริการทันที และรอบการเรียกเก็บเงินจะยังคงเหมือนเดิม จากนั้นระบบจะเรียกเก็บเงินส่วนต่างของราคาสำหรับระยะเวลาที่เหลือจากผู้ใช้

หมายเหตุ: ตัวเลือกนี้ใช้ได้กับการอัปเกรดรายการการสมัครใช้บริการเท่านั้น ซึ่งราคาต่อหน่วยเวลาจะเพิ่มขึ้น

อัปเกรดเป็นแพ็กเกจที่แพงขึ้นโดยไม่ต้องเปลี่ยนวันที่เรียกเก็บเงิน

1

CHARGE_FULL_PRICE

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

หมายเหตุ: หากการสมัครใช้บริการใหม่มีช่วงทดลองใช้ฟรีหรือ ข้อเสนอช่วงแนะนำ ระบบจะเรียกเก็บเงินผู้ใช้เป็นจำนวน $0 หรือราคาของข้อเสนอ ช่วงแนะนำ (ขึ้นอยู่กับว่าข้อเสนอใดมีผล) ในเวลาที่อัปเกรดหรือดาวน์เกรด

อัปเกรดจากระยะเวลาการเรียกเก็บเงินที่สั้นกว่าเป็นระยะเวลาที่ยาวกว่า

1 (หมายเหตุ: 0 หากการสมัครใช้บริการใหม่มีช่วงทดลองใช้ฟรี)

WITHOUT_PRORATION

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

อัปเกรดเป็นแพ็กเกจการสมัครใช้บริการที่สูงขึ้นในขณะที่ยังคงระยะเวลาฟรีที่เหลืออยู่

0

DEFERRED

ระบบจะอัปเกรดหรือดาวน์เกรดรายการการสมัครใช้บริการเมื่อต่ออายุการสมัครใช้บริการเท่านั้น แต่จะออกการซื้อใหม่ทันทีพร้อมกับรายการต่อไปนี้

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

หมายเหตุ: สำหรับการสมัครใช้บริการแบบผ่อนชำระ การเปลี่ยนแพ็กเกจจะเกิดขึ้นเมื่อถึงวันที่ชำระเงินครั้งถัดไป

ดาวน์เกรดเป็นแพ็กเกจที่ราคาถูกกว่า

1

KEEP_EXISTING

กำหนดการชำระเงินสำหรับรายการการสมัครใช้บริการจะยังคงเหมือนเดิมในการเปลี่ยนแทน

เพิ่มหรือนำรายการการสมัครใช้บริการออกจากแพ็กเกจการสมัครใช้บริการที่มีส่วนเสริมเมื่อควรไม่มีการเปลี่ยนแปลงรายการที่เฉพาะเจาะจง

ไม่มี

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

ตั้งค่าโหมดการเปลี่ยนแทนสำหรับการซื้อ

คุณใช้โหมดการแทนที่ที่แตกต่างกันสำหรับการเปลี่ยนประเภทการสมัครใช้บริการ ประเภทต่างๆ ได้ตามค่ากำหนดและตรรกะทางธุรกิจ ส่วนนี้อธิบาย วิธีตั้งค่าโหมดการเปลี่ยนแทนสำหรับการเปลี่ยนแปลงในการสมัครใช้บริการและข้อจำกัด ที่มีผล

สมัครใช้บริการอีกครั้งหรือเปลี่ยนแพ็กเกจในการสมัครใช้บริการเดียวกัน

คุณระบุโหมดการแทนที่เริ่มต้นได้ใน Google Play Console การตั้งค่านี้ช่วยให้คุณเลือกเวลาที่จะเรียกเก็บเงินจากสมาชิกปัจจุบันหากสมาชิกซื้อแพ็กเกจเริ่มต้นหรือข้อเสนออื่นสำหรับการสมัครใช้บริการเดียวกัน หรือสมัครอีกครั้งหลังจากยกเลิก ตัวเลือกที่ใช้ได้คือเรียกเก็บเงินทันที ซึ่งเทียบเท่ากับ CHARGE_FULL_PRICE และเรียกเก็บเงินในวันที่เรียกเก็บครั้งถัดไป ซึ่งเทียบเท่ากับ WITHOUT_PRORATION โหมดการแทนที่ที่เกี่ยวข้องมีเพียงโหมดเหล่านี้เท่านั้นเมื่อเปลี่ยนแพ็กเกจเริ่มต้นภายในการสมัครใช้บริการเดียวกัน

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

เปลี่ยนแพ็กเกจในการสมัครใช้บริการ หรือลบล้างโหมดการแทนที่เริ่มต้น

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

หากต้องการระบุ ReplacementMode ใน SubscriptionProductReplacementParams หรือ SubscriptionUpdateParams อย่างถูกต้องเป็นส่วนหนึ่ง ของการกำหนดค่าขั้นตอนการซื้อรันไทม์ โปรดทราบข้อจำกัดต่อไปนี้

  • เมื่ออัปเกรด ดาวน์เกรด หรือเริ่มเปลี่ยนการสมัครใช้บริการเดียวกัน เป็นแพ็กเกจแบบชำระเงินล่วงหน้าจากแพ็กเกจแบบชำระเงินล่วงหน้า แพ็กเกจแบบต่ออายุใหม่อัตโนมัติ หรือ แพ็กเกจแบบผ่อนชำระ โหมดการแทนที่ที่อนุญาตเพียงโหมดเดียวคือ CHARGE_FULL_PRICE หากคุณระบุโหมดการแทนที่อื่นๆ การซื้อจะไม่สำเร็จและข้อผิดพลาด จะแสดงต่อผู้ใช้
  • เมื่อเปลี่ยนแพ็กเกจภายในแพ็กเกจการสมัครใช้บริการเดียวกันเป็นแพ็กเกจแบบต่ออายุใหม่อัตโนมัติ จากแพ็กเกจแบบชำระเงินล่วงหน้าหรือแพ็กเกจแบบต่ออายุใหม่อัตโนมัติ โหมดการปรับตามสัดส่วนที่ใช้ได้ คือ CHARGE_FULL_PRICE และ WITHOUT_PRORATION หากคุณระบุ โหมดการคิดตามสัดส่วนอื่นๆ การซื้อจะล้มเหลวและระบบจะแสดงข้อผิดพลาดต่อผู้ใช้
  • ไม่อนุญาตให้เปลี่ยนแพ็กเกจภายในผลิตภัณฑ์การสมัครใช้บริการเดียวกันจากแพ็กเกจเริ่มต้นแบบผ่อนชำระ เป็นแพ็กเกจเริ่มต้นแบบไม่ผ่อนชำระ
  • เมื่อใช้KEEP_EXISTINGโหมดการเปลี่ยนแทนใน SubscriptionProductReplacementParamsเพื่อให้การชำระเงินของสินค้าไม่เปลี่ยนแปลง ในระหว่างการเปลี่ยนแทน รหัสผลิตภัณฑ์เก่าควรเหมือนกับรหัสผลิตภัณฑ์ของ ผลิตภัณฑ์ใหม่ โหมด KEEP_EXISTING ไม่รองรับใน SubscriptionUpdateParams

ตัวอย่างและการทำงานของการแทนที่

โปรดลองดูสถานการณ์ต่อไปนี้เพื่อให้เข้าใจวิธีการทำงานของโหมดการปันส่วนตามสัดส่วนแต่ละโหมด

สามมีแพ็กเกจการสมัครใช้บริการเนื้อหาออนไลน์จากแอป Country Gardener โดยเขา สมัครใช้บริการเนื้อหาเวอร์ชันระดับ 1 แบบรายเดือน ซึ่งมีเฉพาะข้อความ การสมัครใช้บริการนี้มีค่าใช้จ่าย $2 ต่อเดือน และจะต่ออายุในวันที่ 1 ของเดือน

เมื่อวันที่ 15 เมษายน แซมไวส์เลือกอัปเกรดเป็นการสมัครใช้บริการ Tier 2 แบบรายปี ซึ่งรวมการอัปเดตวิดีโอและมีค่าใช้จ่าย $36 ต่อปี

เมื่ออัปเกรดการสมัครใช้บริการ นักพัฒนาแอปจะเลือกโหมดการปันส่วนตามสัดส่วน รายการต่อไปนี้อธิบายว่าโหมดการปันส่วนตามสัดส่วนแต่ละโหมดส่งผลต่อการสมัครใช้บริการของ Samwise อย่างไร

WITH_TIME_PRORATION

การสมัครใช้บริการระดับที่ 1 ของ Samwise จะสิ้นสุดลงทันที เนื่องจากเขาชำระเงินสำหรับทั้งเดือน (1-30 เมษายน) แต่อัปเกรดในช่วงกลางของระยะเวลาการสมัครใช้บริการ ระบบจึงนำค่าสมัครใช้บริการครึ่งเดือน ($1) ไปใช้กับการสมัครใช้บริการใหม่ของเขา อย่างไรก็ตาม เนื่องจาก การสมัครใช้บริการใหม่มีค่าใช้จ่าย $36 ต่อปี ยอดคงเหลือเครดิต $1 จึงชำระค่าบริการได้เพียง 10 วัน (16-25 เมษายน) ดังนั้นในวันที่ 26 เมษายน ระบบจะเรียกเก็บเงิน $36 จากเขาสำหรับการสมัครใช้บริการใหม่ และ อีก $36 ในวันที่ 26 เมษายนของทุกปีหลังจากนั้น

คุณควรเรียกใช้ PurchasesUpdatedListener ของแอปทันทีที่การซื้อสำเร็จและคุณสามารถเรียกข้อมูลการซื้อใหม่เป็นส่วนหนึ่งของการเรียกใช้ queryPurchasesAsync() ได้ แบ็กเอนด์จะได้รับ SUBSCRIPTION_PURCHASEDการแจ้งเตือนแบบเรียลไทม์สำหรับนักพัฒนาแอปทันที

CHARGE_PRORATED_PRICE

คุณใช้โหมดนี้ได้เนื่องจากราคาการสมัครใช้บริการระดับ 2 ต่อหน่วยเวลา (360 บาท/ปี = 30 บาท/เดือน) สูงกว่าราคาการสมัครใช้บริการระดับ 1 ต่อหน่วยเวลา (20 บาท/เดือน) การสมัครใช้บริการระดับที่ 1 ของ Samwise จะสิ้นสุดลงทันที เนื่องจากเขา ชำระเงินสำหรับทั้งเดือนแต่ใช้เพียงครึ่งเดือน ระบบจึงนำค่าสมัครใช้บริการครึ่งเดือน ($1) ไปใช้กับการสมัครใช้บริการใหม่ของเขา อย่างไรก็ตาม เนื่องจากค่าสมัครใช้บริการใหม่ อยู่ที่ $36/ปี ดังนั้นค่าสมัครใช้บริการที่เหลืออีก 15 วันจึงอยู่ที่ $1.50 ระบบจึงเรียกเก็บเงินส่วนต่าง จำนวน $0.50 สำหรับการสมัครใช้บริการใหม่ ในวันที่ 1 พฤษภาคม ระบบจะเรียกเก็บเงินจากแซมไวส์ $36 สำหรับระดับการสมัครใช้บริการใหม่ และเรียกเก็บเงินอีก $36 ในวันที่ 1 พฤษภาคมของทุกปีถัดไป

คุณควรเรียกใช้ PurchasesUpdatedListener ของแอปทันทีที่การซื้อสำเร็จและคุณสามารถเรียกข้อมูลการซื้อใหม่เป็นส่วนหนึ่งของการเรียกใช้ queryPurchasesAsync() ได้ แบ็กเอนด์จะได้รับ SUBSCRIPTION_PURCHASEDการแจ้งเตือนแบบเรียลไทม์สำหรับนักพัฒนาแอปทันที

WITHOUT_PRORATION

ระบบจะอัปเกรดการสมัครใช้บริการระดับที่ 1 ของ Samwise เป็นระดับที่ 2 ทันทีโดยไม่มีค่าใช้จ่ายเพิ่มเติม และในวันที่ 1 พฤษภาคม ระบบจะเรียกเก็บเงิน $36 สำหรับการสมัครใช้บริการระดับใหม่และ อีก $36 ในวันที่ 1 พฤษภาคมของทุกปีหลังจากนั้น

คุณควรเรียกใช้ PurchasesUpdatedListener ของแอปทันทีที่การซื้อสำเร็จและคุณสามารถเรียกข้อมูลการซื้อใหม่เป็นส่วนหนึ่งของการเรียกใช้ queryPurchasesAsync() ได้ แบ็กเอนด์จะได้รับ SUBSCRIPTION_PURCHASEDการแจ้งเตือนแบบเรียลไทม์สำหรับนักพัฒนาแอปทันที

DEFERRED

การสมัครใช้บริการระดับที่ 1 ของ Samwise จะดำเนินต่อไปจนกว่าจะหมดอายุในวันที่ 30 เมษายน ในวันที่ 1 พฤษภาคม การสมัครใช้บริการระดับ 2 จะมีผล และระบบจะเรียกเก็บเงินจาก Samwise เป็นจำนวน $36 สำหรับการสมัครใช้บริการระดับใหม่

คุณควรเรียกใช้ PurchasesUpdatedListener ของแอปทันทีที่การซื้อสำเร็จและคุณสามารถเรียกข้อมูลการซื้อใหม่เป็นส่วนหนึ่งของการเรียกใช้ queryPurchasesAsync() ได้ แบ็กเอนด์จะได้รับ SUBSCRIPTION_PURCHASEDการแจ้งเตือนแบบเรียลไทม์สำหรับนักพัฒนาแอปทันที คุณควรดำเนินการ ซื้อในลักษณะเดียวกับการดำเนินการซื้อใหม่อื่นๆ ณ จุดนั้น โดยเฉพาะอย่างยิ่ง โปรดตรวจสอบว่าคุณรับทราบการซื้อใหม่ โปรดทราบว่า startTimeของการสมัครใช้บริการใหม่จะได้รับการป้อนข้อมูลในขณะที่การแทนที่ มีผล ซึ่งจะเกิดขึ้นเมื่อการสมัครใช้บริการเก่าหมดอายุ ในขั้นตอนนี้ คุณจะได้รับ SUBSCRIPTION_RENEWED RTDN สำหรับแพ็กเกจการสมัครใช้บริการใหม่ อ่านข้อมูลเพิ่มเติมเกี่ยวกับReplacementMode.DEFERREDลักษณะการทำงานในจัดการการเปลี่ยนทดแทนที่เลื่อนออกไป

CHARGE_FULL_PRICE

การสมัครใช้บริการระดับที่ 1 ของ Samwise จะสิ้นสุดลงทันที การสมัครใช้บริการระดับ 2 เริ่มตั้งแต่วันนี้และระบบจะเรียกเก็บเงิน $36 เนื่องจากเขาชำระเงินสำหรับทั้งเดือน แต่ใช้ไปเพียงครึ่งเดือน ระบบจึงนำค่าสมัครใช้บริการครึ่งเดือน (30 บาท) ไปใช้กับการสมัครใช้บริการใหม่ของเขา เนื่องจากการสมัครใช้บริการใหม่มีค่าใช้จ่าย $36/ปี เขาจึงจะได้รับระยะเวลาการสมัครใช้บริการเพิ่มขึ้น 1/36 ของปี (~10 วัน) ดังนั้น การเรียกเก็บเงินครั้งถัดไปของ Samwise จะเป็น 1 ปีกับอีก 10 วันนับจากวันนี้ในราคา $36 หลังจากนั้น ระบบจะเรียกเก็บเงินจากเขาปีละ $36

เมื่อเลือกโหมดการปันส่วนตามสัดส่วน โปรดอ่านคำแนะนำในการแทนที่

KEEP_EXISTING

แซมไวส์สมัครใช้บริการเนื้อหาออนไลน์จากแอป Country Gardener โดยเขา สมัครใช้บริการแพ็กเกจ 1 แบบรายเดือนสำหรับเนื้อหาพื้นฐาน การสมัครใช้บริการนี้ มีราคาช่วงแนะนำอยู่ที่ $2 ต่อเดือนเป็นเวลา 3 เดือน จากนั้นจะอยู่ที่ $4 ต่อเดือน แซมไวส์ซื้อรายการนี้เมื่อวันที่ 1 เมษายน แอป Country Gardener เสนอแพ็กเกจ 2 เป็น เนื้อหาพิเศษแบบส่วนเสริมในราคา $3 ต่อเดือน เมื่อวันที่ 15 เมษายน แซมไวส์ได้เพิ่มแพ็กเกจ 2 ลงในการสมัครใช้บริการแอป Country Gardener โดยยังคงใช้แพ็กเกจ 1 ที่มีอยู่ กำหนดการชำระเงินของ Samwise มีดังนี้

  • ราคาตามสัดส่วนของแพ็กเกจ 2 คือ $1.50 ซึ่งครบกำหนดชำระในวันที่ 15 เมษายน
  • ราคา $5.00 ต่อเดือนสำหรับ 2 เดือนถัดไป ซึ่งครอบคลุมทั้ง ราคาแนะนำสำหรับแพ็กเกจ 1 และราคาปกติสำหรับแพ็กเกจ 2
  • หลังจากนั้นจะมีการชำระเงินรายเดือนอย่างสม่ำเสมอที่ $7.00

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

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

ใช้ SubscriptionProductReplacementParams สำหรับการเปลี่ยนแทน (แนะนำ)

ตัวอย่างต่อไปนี้แสดงวิธีอัปเดตการสมัครใช้บริการโดยใช้ SubscriptionProductReplacementParams

  • ตอนนี้ออบเจ็กต์ BillingFlowParams.ProductDetailsParams มีเมธอด setSubscriptionProductReplacementParams() สำหรับระบุข้อมูลการเปลี่ยนทดแทนระดับผลิตภัณฑ์แล้ว

  • SubscriptionProductReplacementParams มีเมธอดตัวตั้งค่า 2 รายการ ได้แก่

    • setOldProductId:นี่คือผลิตภัณฑ์รุ่นเก่าที่จะแทนที่ด้วยผลิตภัณฑ์ในProductDetails.
    • setReplacementMode:นี่คือโหมดการแทนที่ระดับสินค้า โดยพื้นฐานแล้ว โหมดต่างๆ จะเหมือนกับ SubscriptionUpdateParams แต่ มีการอัปเดตการแมปค่า
  • ควรกำหนดค่าพารามิเตอร์การอัปเดตระดับการซื้อที่มีอยู่ BillingFlowParams.setSubscriptionUpdateParams()ด้วย setOldPurchaseToken()

  • เมื่อเรียกใช้ setSubscriptionProductReplacementParams() สำหรับ ProductDetailsParams SubscriptionUpdateParams.setSubscriptionReplacementMode() จะไม่มีผล

ตัวอย่างโค้ดต่อไปนี้แสดงวิธีเปลี่ยนแพ็กเกจการสมัครใช้บริการ จาก (old_product_1, old_product_2) เป็น (product_1, product_2, product_3) ในสถานการณ์นี้ product_1 จะแทนที่ old_product_1 product_2 จะแทนที่ old_product_2 และระบบจะเพิ่ม product_3 ลงในการสมัครใช้บริการ ทันที

Kotlin

val billingClient: BillingClient = ...
val replacementModeForBasePlan: Int = ...
val replacementModeForAddon: Int = ...

val purchaseTokenOfExistingSubscription: String = "your_old_purchase_token"

// ProductDetails instances obtained from queryProductDetailsAsync();

val productDetailsParams1 =
    ProductDetailsParams.newBuilder()
        .setProductDetails(productDetails1_obj) // Required: Set the ProductDetails object
        .setSubscriptionProductReplacementParams(
            SubscriptionProductReplacementParams.newBuilder()
                .setOldProductId("old_product_id_1")
                .setReplacementMode(replacementModeForBasePlan)
                .build()
        )
        .build()

val productDetailsParams2 =
    ProductDetailsParams.newBuilder()
        .setProductDetails(productDetails2_obj) // Required: Set the ProductDetails object
        .setSubscriptionProductReplacementParams(
            SubscriptionProductReplacementParams.newBuilder()
                .setOldProductId("old_product_id_2")
                .setReplacementMode(replacementModeForAddon)
                .build()
        )
        .build()

// Example for a third item without replacement params
val productDetailsParams3 =
    ProductDetailsParams.newBuilder()
        .setProductDetails(productDetails3_obj) // Required: Set the ProductDetails object
        .build()

val newProductDetailsList = listOf(
    productDetailsParams1,
    productDetailsParams2,
    productDetailsParams3
)

val billingFlowParams =
    BillingFlowParams.newBuilder()
        .setSubscriptionUpdateParams(
            SubscriptionUpdateParams.newBuilder()
                .setOldPurchaseToken(purchaseTokenOfExistingSubscription)
                .build()
        )
        .setProductDetailsParamsList(newProductDetailsList)
        .build()

// To launch the billing flow:
// billingClient.launchBillingFlow(activity, billingFlowParams)

Java

BillingClient billingClient = ;

int replacementModeForBasePlan =;
int replacementModeForAddon =;
// ProductDetails obtained from queryProductDetailsAsync().
ProductDetailsParams productDetails1 =
  ProductDetailsParams.newBuilder()
      .setSubscriptionProductReplacementParams(
           SubscriptionProductReplacementParams.newBuilder()
               .setOldProductId("old_product_id_1")
               .setReplacementMode(replacementModeForBasePlan))
               .build();
ProductDetailsParams productDetails2 =
  ProductDetailsParams.newBuilder()
      .setSubscriptionProductReplacementParams(
           SubscriptionProductReplacementParams.newBuilder()
               .setOldProductId("old_product_id_2")
               .setReplacementMode(replacementModeForAddon))
               .build();
ProductDetailsParams productDetails3 = ...;

ArrayList newProductDetailsList = new ArrayList<>();
newProductDetailsList.add(productDetails1);
newProductDetailsList.add(productDetails2);
newProductDetailsList.add(productDetails3);

BillingFlowParams billingFlowParams =
    BillingFlowParams.newBuilder()
        .setSubscriptionUpdateParams(
          SubscriptionUpdateParams.newBuilder()
              .setOldPurchaseToken(purchaseTokenOfExistingSubscription)
             .build())
        .setProductDetailsParamsList(productDetailsList)
        .build();

billingClient.launchBillingFlow(billingFlowParams);

ตั้งค่า SubscriptionUpdateParams สำหรับการเปลี่ยนแทน (เลิกใช้งานแล้ว)

ตัวอย่างต่อไปนี้แสดงวิธีอัปเดตการสมัครใช้บริการโดยใช้ SubscriptionUpdateParams

Kotlin

val offerToken = productDetails
        .getSubscriptionOfferDetails(selectedOfferIndex)
        .getOfferToken()

val billingParams = BillingFlowParams.newBuilder().setProductDetailsParamsList(
       listOf(
           BillingFlowParams.ProductDetailsParams.newBuilder()
               .setProductDetails(productDetails)
               .setOfferToken(offerToken)
               .build()
       )
       ).setSubscriptionUpdateParams(
           BillingFlowParams.SubscriptionUpdateParams.newBuilder()
               .setOldPurchaseToken("old_purchase_token")
               .setSubscriptionReplacementMode(
                 BillingFlowParams.ReplacementMode.CHARGE_FULL_PRICE
               )
               .build()
       ).build()

billingClient.launchBillingFlow(
    activity,
    billingParams
   )
// ...

Java

String offerToken = productDetails
    .getSubscriptionOfferDetails(selectedOfferIndex)
    .getOfferToken();

BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
    .setProductDetailsParamsList(
        ImmuableList.of(
            ProductDetailsParams.newBuilder()
                // fetched via queryProductDetailsAsync
                .setProductDetails(productDetails)
                // offerToken can be found in
                // ProductDetails=>SubscriptionOfferDetails
                .setOfferToken(offerToken)
                .build()))
    .setSubscriptionUpdateParams(
        SubscriptionUpdateParams.newBuilder()
            // purchaseToken can be found in Purchase#getPurchaseToken
            .setOldPurchaseToken("old_purchase_token")
            .setSubscriptionReplacementMode(ReplacementMode.CHARGE_FULL_PRICE)
            .build())
    .build();

BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams);
// ...

คำแนะนำในการเปลี่ยน

ตารางต่อไปนี้แสดงสถานการณ์การปันส่วนตามสัดส่วนต่างๆ พร้อมกับสิ่งที่เรา แนะนำสำหรับแต่ละสถานการณ์

สถานการณ์ โหมดการแทนที่ที่แนะนำ ผลลัพธ์
การอัปเกรดเป็นแพ็กเกจที่มีราคาสูงขึ้น CHARGE_PRORATED_PRICE ผู้ใช้จะได้รับสิทธิ์เข้าถึงทันทีในขณะที่ยังคงใช้รอบการเรียกเก็บเงินเดิม
การดาวน์เกรดเป็นแพ็กเกจที่ถูกกว่า DEFERRED ผู้ใช้ได้ชำระเงินสำหรับระดับที่มีราคาสูงกว่าแล้ว จึงยังคงมีสิทธิ์เข้าถึงจนถึงวันที่เรียกเก็บเงินครั้งถัดไป
การอัปเกรดขณะอยู่ในช่วงทดลองใช้ฟรี การคงช่วงทดลองใช้ WITHOUT_PRORATION ผู้ใช้จะอัปเกรดเป็นแพ็กเกจที่สูงขึ้นสำหรับ ช่วงเวลาที่เหลือของช่วงทดลองใช้โดยไม่มีค่าใช้จ่ายเพิ่มเติม
การอัปเกรดขณะอยู่ในช่วงทดลองใช้ฟรี - การสิ้นสุดสิทธิ์เข้าถึงช่วงทดลองใช้ฟรี CHARGE_PRORATED_PRICE ผู้ใช้จะได้รับสิทธิ์เข้าถึงระดับใหม่ทันที และระบบจะโอนมูลค่าที่เหลือของช่วงทดลองใช้ฟรีไปให้ ระบบจะคำนวณมูลค่าที่โอนตามราคาแพ็กเกจเริ่มต้น
คงกำหนดการชำระเงินของบางรายการในการสมัครใช้บริการไว้ตามเดิม ขณะที่เพิ่มหรือนำรายการอื่นๆ ในการสมัครใช้บริการออกจาก "การสมัครใช้บริการที่มีส่วนเสริม" KEEP_EXISTING ผู้ใช้จะยังคงชำระเงินในราคาเดิมสำหรับรายการที่ไม่เปลี่ยนแปลง ระบบจะเพิ่มรายการใหม่ทันที คุณสามารถแทนที่รายการเก่าอื่นๆ ได้โดยการระบุโหมดการแทนที่หรือนำออก

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

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

ลักษณะการทำงานในแอปจะเหมือนกับการซื้อใหม่ แอปของคุณจะได้รับ ผลลัพธ์ของการซื้อใหม่ใน PurchasesUpdatedListener และ การซื้อใหม่จะพร้อมใช้งานใน queryPurchasesAsync

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

เมื่อได้รับโทเค็นการซื้อใหม่ ให้ทำตามกระบวนการยืนยันตัวตนเดียวกันกับการยืนยันโทเค็นการซื้อใหม่ อย่าลืมรับทราบการซื้อเหล่านี้ด้วย BillingClient.acknowledgePurchase() จาก Google Play Billing Library หรือ Purchases.subscriptions:acknowledge จาก Google Play Developer API

จัดการการเปลี่ยนทดแทนที่เลื่อนออกไป

โหมดการเปลี่ยนแทนที่แบบเลื่อนเวลาช่วยให้คุณอนุญาตให้ผู้ใช้ใช้สิทธิ์ที่เหลือ ในแพ็กเกจเดิมจนหมดก่อนที่จะเริ่มใช้แพ็กเกจใหม่

เมื่อใช้ ReplacementMode.DEFERRED สำหรับการซื้อใหม่ queryPurchasesAsync() จะแสดงโทเค็นการซื้อใหม่หลังจากขั้นตอนการซื้อ ที่ยังคงเชื่อมโยงกับผลิตภัณฑ์เก่าจนกว่าการเปลี่ยนทดแทนที่เลื่อนออกไป จะเกิดขึ้นในวันที่ต่ออายุครั้งถัดไป หลังจากนั้นระบบจะคืนผลิตภัณฑ์ใหม่

ในอดีต คุณสามารถมอบประสบการณ์ของผู้ใช้เช่นนี้ได้ด้วย ProrationMode.DEFERRED ที่เลิกใช้งานแล้ว แต่ ProrationMode.DEFERRED จะเลิกใช้งานพร้อมกับ Play Billing Library 6 ดูตารางต่อไปนี้เพื่อทำความเข้าใจว่าลักษณะการทำงานแตกต่างกันอย่างไร

เวลา

ProrationMode.DEFERRED (เลิกใช้งานแล้ว)

ReplacementMode.DEFERRED

ทันทีหลังจากขั้นตอนการซื้อสำเร็จ (แอป)

PurchasesUpdatedListener จะเรียกใช้หลังจากการซื้อพร้อมสถานะว่าการอัปเกรดหรือดาวน์เกรดสำเร็จหรือไม่

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

ระบบจะไม่แสดงโทเค็นการซื้อใหม่ จึงไม่สามารถประมวลผลได้ในตอนนี้

PurchasesUpdatedListener จะเรียกใช้หลังการซื้อพร้อมสถานะว่าการอัปเกรดหรือดาวน์เกรดสำเร็จหรือไม่

queryPurchasesAsync() จะคืนการซื้อพร้อมกับโทเค็นการซื้อใหม่ทันที และสิทธิ์เดิมที่เชื่อมโยงกับการซื้อนั้น

ระบบจะแสดงโทเค็นการซื้อใหม่ ดังนั้นคุณควรประมวลผลโทเค็นนี้ในตอนนี้โดยคำนึงถึงเวลาที่จะเปลี่ยนทดแทนด้วย

ทันทีหลังจากขั้นตอนการซื้อสำเร็จ (แบ็กเอนด์)

ระบบไม่ส่ง RTDN ของ SUBSCRIPTION_PURCHASED หลังจากขั้นตอนการซื้อ แบ็กเอนด์ยังไม่ทราบเกี่ยวกับการซื้อใหม่

ระบบจะส่ง RTDN ของ SUBSCRIPTION_PURCHASED ที่มี product_id เก่าทันทีหลังจากขั้นตอนการซื้อโทเค็นการซื้อใหม่

การเรียกใช้เมธอด purchases.subscriptionsv2.get ด้วยโทเค็นการซื้อใหม่จะแสดงผลการซื้อที่มี "startTime" ซึ่งระบุเวลาที่ซื้อพร้อมรายการโฆษณา 2 รายการ ดังนี้

  • รายการหนึ่งแสดงถึงสิทธิ์เก่าและมี "expiryTime" ในอนาคต การให้สิทธิ์แบบเดิมจะไม่ได้รับการต่ออายุและจะมี DeferredItemReplacement ที่มีผลิตภัณฑ์ของการให้สิทธิ์ใหม่ ซึ่งบ่งชี้ว่ามีการแทนที่สิทธิ์เดิมที่รอดำเนินการเมื่อสิทธิ์หมดอายุ
  • รายการหนึ่งแสดงถึงสิทธิ์ที่ซื้อใหม่ ไม่มีการตั้งค่าสำหรับ "expiryTime"

ส่ง SUBSCRIPTION_EXPIRED สำหรับโทเค็นการซื้อเก่า เมื่อเรียกใช้เมธอด purchases.subscriptionsv2.get ด้วยโทเค็นการซื้อเก่า โทเค็นจะปรากฏเป็นหมดอายุ (ระบบจะโอนสิทธิ์สำหรับแพ็กเกจเดิมไปยังการซื้อใหม่สำหรับเวลาที่เหลือ)

ในการเปลี่ยน - การต่ออายุครั้งแรกหลังจากขั้นตอนการซื้อ (แอป)

queryPurchasesAsync() จะแสดงออบเจ็กต์ Purchase ใหม่ที่มีโทเค็นการซื้อและสิทธิ์ใหม่

ตอนนี้ระบบได้แสดงโทเค็นการซื้อใหม่แล้ว คุณจึงควรประมวลผลโทเค็นดังกล่าว

queryPurchasesAsync() จะส่งคืนการซื้อพร้อมกับโทเค็นการซื้อใหม่ทันที รวมถึงสิทธิ์ใหม่ที่เชื่อมโยงกับการซื้อนั้น

ระบบควรประมวลผลการซื้อใหม่แล้วเมื่อขั้นตอนการซื้อสำเร็จ ดังนั้นแอปจึงไม่ควรดำเนินการใดๆ เป็นพิเศษนอกเหนือจากการตรวจสอบว่าได้ให้สิทธิ์ที่ถูกต้องแล้ว

ในการเปลี่ยนทดแทน - การต่ออายุครั้งแรกหลังจากขั้นตอนการซื้อ (แบ็กเอนด์)

ตอนนี้ระบบประมวลผลและรับทราบการซื้อใหม่ได้แล้วเมื่อมีการส่ง RTDN ของ SUBSCRIPTION_RENEWED ครั้งแรก

คุณใช้ linkedPurchaseToken ในทรัพยากรการสมัครใช้บริการเพื่อพิจารณาว่าควรจะอัปเดตสิทธิ์ใหม่ให้ผู้ใช้รายใดในแบ็กเอนด์การสมัครใช้บริการ (หากมี)

ระบบประมวลผลและรับทราบการซื้อใหม่เมื่อส่ง RTDN ของ SUBSCRIPTION_PURCHASED สำหรับโทเค็นการซื้อใหม่และบันทึกเป็น "startTime"

เมื่อใช้ ReplacementMode.DEFERRED การต่ออายุครั้งแรกจะเป็นไปตามลักษณะการทำงานมาตรฐานของการต่ออายุอื่นๆ และคุณไม่จำเป็นต้องจัดการตรรกะพิเศษสำหรับการเปลี่ยนทดแทนเมื่อเกิดเหตุการณ์นี้

เมื่อเรียกใช้เมธอด purchases.subscriptionsv2.get ด้วยโทเค็นการซื้อใหม่ ระบบจะแสดงผลการซื้อที่มีรายการโฆษณาสองรายการ

  • รายการหนึ่งแสดงถึงสิทธิ์เดิม โดยมี `expiryTime` ในอดีตและไม่มีการตั้งค่าสำหรับ DeferredItemReplacement
  • รายการหนึ่งแสดงถึงสิทธิ์ใหม่ โดยมี `expiryTime` ในอนาคตและเปิดค่าสถานะ auto_renewing_enabled

คุณควรใช้ ReplacementMode.DEFERRED ตั้งแต่นี้เป็นต้นไปแทน ProrationMode.DEFERRED ที่เลิกใช้งานแล้ว เนื่องจากมีลักษณะการทำงานเหมือนกันเกี่ยวกับการเปลี่ยนแปลงการให้สิทธิ์ แต่มีวิธีจัดการการซื้อที่สอดคล้องกับลักษณะการทำงานสำหรับการซื้อใหม่อื่นๆ มากกว่า

การจัดการลูกค้า

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

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

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

แอปที่ไม่มี Billing Library 2.0 ขึ้นไป: ไม่

แอปที่มี Billing Library 2.0 ขึ้นไป: ได้ นักพัฒนาแอปเลือกไม่ใช้ใน Console ได้

เมื่อมีการเรียกเก็บเงินจากผู้ใช้

หากใช้ SKU เดียวกัน: สิ้นสุดช่วงเวลาที่เรียกเก็บเงินปัจจุบัน

หากใช้ SKU อื่น: ขึ้นอยู่กับโหมดการคิดตามสัดส่วน

สิ้นสุดช่วงเวลาที่เรียกเก็บเงินปัจจุบัน ทันที ทันที
ต้องติดตั้งใช้งาน ระบุ UI การลงชื่อสมัครใช้อีกครั้งในแอป

ตรวจหาการเปลี่ยนแปลงสถานะการสมัครใช้บริการ

Deep Link ไปยัง Play Store

ระบุ UI การลงชื่อสมัครใช้อีกครั้งในแอป จัดการการซื้อนอกแอป

ก่อนการสมัครใช้บริการจะหมดอายุ - ในแอป

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

ส่วนใหญ่แล้ว คุณจะต้องการเสนอราคาและ SKU เดียวกันกับที่ผู้ใช้สมัครใช้บริการอยู่แล้ว ดังนี้

  • เริ่มการซื้อการสมัครใช้บริการใหม่ด้วย SKU เดียวกัน
  • การสมัครใช้บริการใหม่จะแทนที่การสมัครใช้บริการเก่าและจะต่ออายุในวันหมดอายุเดียวกัน ระบบจะทำเครื่องหมายการสมัครใช้บริการเดิมว่าหมดอายุทันที
  • ตัวอย่างเช่น อคิลลิสสมัครใช้บริการแอป Example Music และ การสมัครใช้บริการจะหมดอายุในวันที่ 1 สิงหาคม ในวันที่ 10 กรกฎาคม เขาได้สมัครใช้บริการอีกครั้ง โดยสมัครใช้บริการแบบ 1 เดือนในราคาต่อเดือนเท่าเดิม การสมัครใช้บริการใหม่ จะคิดตามสัดส่วนของเครดิตที่เหลือ โดยจะใช้งานได้ทันทีและยังคง ต่ออายุในวันที่ 1 สิงหาคม

หากต้องการเสนอราคาอื่น เช่น ช่วงทดลองใช้ฟรีใหม่หรือส่วนลดดึงดูดผู้ใช้ให้กลับมาสมัครใช้บริการ คุณสามารถเสนอ SKU อื่นให้ผู้ใช้แทนได้โดยทำดังนี้

  • เริ่มอัปเกรดหรือดาวน์เกรดด้วย SKU อื่นโดยใช้โหมดการเปลี่ยนแทน WITHOUT_PRORATION
  • การสมัครใช้บริการใหม่จะแทนที่การสมัครใช้บริการเก่าและจะต่ออายุในวันหมดอายุเดียวกัน ระบบจะเรียกเก็บเงินจากผู้ใช้ในราคาของ SKU ใหม่ ซึ่งรวมถึง ราคาช่วงแนะนำ ในวันที่การสมัครใช้บริการเดิมหมดอายุ หากสร้างการสมัครใช้บริการเดิมโดยใช้รหัสบัญชีที่ผ่านการปกปิด คุณควรส่งรหัสเดียวกันนั้นไปยัง BillingFlowParams เพื่ออัปเกรดและดาวน์เกรด
  • ตัวอย่างเช่น อคิลลิสสมัครใช้บริการแอป Example Music และ การสมัครใช้บริการจะหมดอายุในวันที่ 1 สิงหาคม ในวันที่ 10 กรกฎาคม เขาได้ลงชื่อสมัครใช้ การสมัครใช้บริการรายปีอีกครั้งในราคาช่วงแนะนำ การสมัครใช้บริการใหม่จะ ใช้งานได้ทันที และระบบจะเรียกเก็บเงินจากผู้ใช้ในราคาช่วงแนะนำในวันที่ 1 สิงหาคม
  • หากตัดสินใจที่จะรวมช่วงทดลองใช้ฟรีหรือราคาช่วงแนะนำไว้ใน SKU สำหรับดึงดูดผู้ใช้ให้กลับมาสมัครใช้บริการ โปรดตรวจสอบว่าผู้ใช้มีสิทธิ์โดยยกเลิกการเลือกช่องอนุญาตให้ทดลองใช้ฟรี 1 ครั้งต่อแอปใน Google Play Console ซึ่งจะจำกัดให้ผู้ใช้ทดลองใช้ฟรีได้ 1 ครั้งต่อแอป

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

ก่อนการสมัครใช้บริการจะหมดอายุ - ใน Play Store

ในขณะที่การสมัครใช้บริการถูกยกเลิกแต่ยังใช้งานได้ ผู้ใช้จะคืนค่าการสมัครใช้บริการในศูนย์การสมัครใช้บริการ Google Play ได้โดยคลิกสมัครใช้บริการอีกครั้ง (เดิมคือคืนค่า) ซึ่งจะทำให้โทเค็นการสมัครใช้บริการและโทเค็นการซื้อยังคงเหมือนเดิม

ส่วนการสมัครใช้บริการในแอป Google Play Store แสดงการสมัครใช้บริการที่ยกเลิกแล้วพร้อมปุ่มสมัครอีกครั้ง
รูปที่ 8 ส่วนบัญชี > การสมัครใช้บริการใน แอป Google Play Store ซึ่งแสดงการสมัครใช้บริการที่ยกเลิกแล้วพร้อมปุ่มสมัครใช้บริการอีกครั้ง

ดูข้อมูลเพิ่มเติมเกี่ยวกับการคืนค่าการสมัครใช้บริการได้ที่การคืนค่า

หลังจากที่การสมัครใช้บริการหมดอายุ - ในแอป

คุณอนุญาตให้ผู้สมัครใช้บริการที่การสมัครใช้บริการหมดอายุแล้วสมัครใช้บริการอีกครั้งภายในแอปได้โดยใช้ ขั้นตอนการซื้อผลิตภัณฑ์ในแอปเดียวกันกับผู้สมัครใช้บริการใหม่ ข้อควรทราบ

  • หากต้องการเสนอส่วนลดให้ผู้ใช้ คุณอาจต้องเสนอรหัสผลิตภัณฑ์ที่มี การกำหนดราคาพิเศษสำหรับการสมัครใช้บริการ ซึ่งเรียกอีกอย่างว่า SKU สำหรับการดึงดูดลูกค้าให้กลับมา คุณสามารถแสดงข้อเสนอในแอปหรือแจ้งให้ผู้ใช้ทราบเกี่ยวกับข้อเสนอภายนอกแอป เช่น ในอีเมล
  • หากต้องการเริ่มการสมัครใช้บริการเพื่อดึงดูดลูกค้าเก่า ให้เปิดตัวขั้นตอนการซื้อในแอป Android โดยใช้ Google Play Billing Library กระบวนการนี้เหมือนกับการสมัครใช้บริการใหม่ แต่คุณสามารถกำหนด SKU ที่ผู้ใช้จะใช้ได้
  • หากตัดสินใจที่จะรวมช่วงทดลองใช้ฟรีหรือราคาช่วงแนะนำไว้ใน SKU ดึงดูดผู้ใช้ให้กลับมาสมัครใช้บริการ โปรดตรวจสอบว่าผู้ใช้มีสิทธิ์โดยยกเลิกการเลือกช่อง อนุญาตให้ทดลองใช้ฟรี 1 ครั้งต่อแอปใน Google Play Console ซึ่ง จำกัดให้ผู้ใช้ทดลองใช้ฟรีได้ 1 ครั้งต่อแอป
  • หากผู้ใช้สมัครใช้บริการ SKU เดียวกันอีกครั้ง ผู้ใช้จะไม่มีสิทธิ์รับช่วงทดลองใช้ฟรีหรือราคาช่วงแนะนำอีกต่อไป ตรวจสอบว่า UI ของคุณแสดงสิ่งนี้

เมื่อได้รับโทเค็นการซื้อ ให้ประมวลผลการซื้อเช่นเดียวกับ การสมัครใช้บริการใหม่ คุณจะไม่ได้รับ linkedPurchaseToken ในทรัพยากรการสมัครใช้บริการ

หลังจากที่การสมัครใช้บริการหมดอายุ - ใน Play Store

หากเปิดใช้ ผู้ใช้จะสมัครใช้บริการ SKU เดียวกันอีกครั้งได้นานสูงสุด 1 ปีหลังจาก การหมดอายุโดยคลิกสมัครใช้บริการอีกครั้งในศูนย์การสมัครใช้บริการของ Google Play ซึ่งจะสร้างโทเค็นการสมัครใช้บริการและการซื้อใหม่

ส่วนการสมัครใช้บริการในแอป Google Play Store แสดงการสมัครใช้บริการที่
            ยกเลิกและหมดอายุแล้วพร้อมปุ่มสมัครใช้บริการอีกครั้งและปุ่มนำออก
รูปที่ 9 บัญชี > การสมัครใช้บริการ ในแอป Google Play Store ซึ่งแสดงการสมัครใช้บริการที่ยกเลิกและหมดอายุ พร้อมปุ่มสมัครใช้บริการอีกครั้งและนำออก

การสมัครใช้บริการอีกครั้งถือเป็นการซื้อนอกแอป ดังนั้นโปรดทำตามแนวทางปฏิบัติแนะนำสำหรับการจัดการการซื้อที่ทำจากภายนอกแอป

โปรโมตการสมัครสมาชิก

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

สำหรับช่วงทดลองใช้ฟรี Google Play จะยืนยันว่าผู้ใช้มีวิธีการชำระเงินที่ใช้ได้ ก่อนที่จะเริ่มช่วงทดลองใช้ฟรี ผู้ใช้บางรายอาจเห็นการยืนยันนี้เป็นการระงับ หรือการเรียกเก็บเงินในวิธีการชำระเงิน การกันวงเงินหรือการเรียกเก็บเงินนี้เป็นการดำเนินการชั่วคราว และจะมีการ ยกเลิกหรือคืนเงินให้ในภายหลัง

หลังจากสิ้นสุดระยะทดลองใช้ ระบบจะเรียกเก็บเงินค่าสมัครใช้บริการเต็มจำนวนจากวิธีการชำระเงินของผู้ใช้

หากผู้ใช้ยกเลิกการสมัครใช้บริการเมื่อใดก็ตามในระหว่างช่วงทดลองใช้ฟรี การสมัครใช้บริการจะยังคงมีผลต่อไปจนกว่าจะสิ้นสุดช่วงทดลองใช้และจะไม่มีการเรียกเก็บเงินจากผู้ใช้เมื่อสิ้นสุดช่วงทดลองใช้ฟรี

ยกเลิกหรือเพิกถอน

คุณใช้ Google Play Developer API เพื่อยกเลิก หรือเพิกถอน การสมัครใช้บริการได้ ฟังก์ชันนี้ยังพร้อมใช้งานใน Google Play Console ด้วย

  • ยกเลิก: ผู้ใช้สามารถยกเลิกการสมัครใช้บริการใน Google Play ได้ นอกจากนี้ คุณยัง ให้ตัวเลือกแก่ผู้ใช้ในการยกเลิกในแอปหรือบนเว็บไซต์ได้ด้วย แอปของคุณควรจัดการการยกเลิกเหล่านี้ตามที่อธิบายไว้ในการยกเลิก

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

ตารางต่อไปนี้แสดงความแตกต่างระหว่างการยกเลิกและการเพิกถอน

หยุดการต่ออายุ เพิกถอนสิทธิ์เข้าถึง
ยกเลิก มี ไม่
เพิกถอน มี มี

เลื่อนการเรียกเก็บเงินสำหรับผู้ติดตาม

คุณสามารถเลื่อนวันที่เรียกเก็บเงินครั้งถัดไปสำหรับผู้สมัครใช้บริการที่ต่ออายุอัตโนมัติได้โดยใช้ Purchases.subscriptions:defer จาก Google Play Developer API ในระหว่างระยะเวลาที่เลื่อนออกไป ผู้ใช้จะ สมัครใช้บริการเนื้อหาของคุณโดยมีสิทธิ์เข้าถึงแบบเต็ม แต่จะไม่มีการเรียกเก็บเงิน ระบบจะอัปเดตวันที่ต่ออายุการสมัครใช้บริการเพื่อให้ตรงกับวันที่ใหม่

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

การเรียกเก็บเงินภายหลังช่วยให้คุณทำสิ่งต่อไปนี้ได้

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

คุณสามารถเลื่อนการเรียกเก็บเงินได้ตั้งแต่ 1 วันไปจนถึง 1 ปีต่อการเรียก API 1 ครั้ง หากต้องการเลื่อนการเรียกเก็บเงินออกไปอีก คุณสามารถเรียก API อีกครั้งก่อน ถึงวันที่เรียกเก็บเงินใหม่

ตัวอย่างเช่น ดาร์ซีมีการสมัครใช้บริการเนื้อหาออนไลน์รายเดือนสำหรับแอป Fishing Quarterly โดยปกติแล้วระบบจะเรียกเก็บเงินจากเธอ £1.25 ในวันที่ 1 ของทุกเดือน ในเดือนมีนาคม เธอได้เข้าร่วมตอบแบบสำรวจออนไลน์สำหรับผู้เผยแพร่แอป สำนักพิมพ์ให้รางวัลแก่เธอด้วยการให้ใช้ฟรี 6 สัปดาห์โดยเลื่อนการชำระเงินครั้งถัดไปจนถึงวันที่ 15 พฤษภาคม ซึ่งเป็นเวลา 6 สัปดาห์หลังจากวันที่เรียกเก็บเงินที่กำหนดไว้ก่อนหน้านี้ในเดือนเมษายน

  1. ระบบจะไม่เรียกเก็บเงินจากดาร์ซีสำหรับเดือนเมษายนหรือช่วงต้นเดือนพฤษภาคม และดาร์ซียังคงมีสิทธิ์เข้าถึงเนื้อหา ในวันที่ 15 พฤษภาคม ระบบจะเรียกเก็บค่าธรรมเนียมการสมัครใช้บริการตามปกติที่ £1.25 สำหรับเดือนนั้น ตอนนี้วันที่ต่ออายุครั้งถัดไปของเธอคือวันที่ 15 มิถุนายน

เมื่อเลื่อนการเรียกเก็บเงิน คุณอาจต้องแจ้งให้ผู้ใช้ทราบทางอีเมลหรือภายในแอปเพื่อ แจ้งให้ทราบว่าวันที่เรียกเก็บเงินมีการเปลี่ยนแปลง

การจัดการการชำระเงินที่ถูกปฏิเสธ

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

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

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

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

หากต้องการเพิ่มโอกาสในการกู้คืนการสมัครใช้บริการระหว่างการชำระเงินถูกปฏิเสธ คุณสามารถแจ้งให้ผู้ใช้ทราบถึงปัญหาการชำระเงินและขอให้ผู้ใช้แก้ไขปัญหาดังกล่าว

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

การรับส่งข้อความในแอป

หากคุณเปิดใช้การรับส่งข้อความในแอปด้วย InAppMessageCategoryId.TRANSACTIONAL Google Play จะแสดงข้อความแก่ผู้ใช้ในระหว่างระยะเวลาผ่อนผันและการระงับบัญชีวันละ 1 ครั้ง และให้โอกาสผู้ใช้ในการแก้ไขการชำระเงินโดยไม่ต้องออกจากแอป

แถบแสดงข้อความแจ้งให้ผู้ใช้แก้ไขการชำระเงิน
รูปที่ 20 แถบแสดงข้อความที่แจ้งให้ผู้ใช้แก้ไขการชำระเงิน

เราขอแนะนำให้คุณเรียก API นี้ทุกครั้งที่ผู้ใช้เปิดแอปเพื่อพิจารณา ว่าควรแสดงข้อความหรือไม่

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

ผสานรวมการรับส่งข้อความในแอป

หากต้องการแสดงข้อความในแอปต่อผู้ใช้ ให้ใช้ BillingClient.showInAppMessages()

ตัวอย่างการทริกเกอร์โฟลว์การรับส่งข้อความในแอปมีดังนี้

Kotlin

val inAppMessageParams = InAppMessageParams.newBuilder()
        .addInAppMessageCategoryToShow(InAppMessageCategoryId.TRANSACTIONAL)
        .build()

billingClient.showInAppMessages(activity,
        inAppMessageParams,
        object : InAppMessageResponseListener() {
            override fun onInAppMessageResponse(inAppMessageResult: InAppMessageResult) {
                if (inAppMessageResult.responseCode == InAppMessageResponseCode.NO_ACTION_NEEDED) {
                    // The flow has finished and there is no action needed from developers.
                } else if (inAppMessageResult.responseCode
                        == InAppMessageResponseCode.SUBSCRIPTION_STATUS_UPDATED) {
                    // The subscription status changed. For example, a subscription
                    // has been recovered from a suspend state. Developers should
                    // expect the purchase token to be returned with this response
                    // code and use the purchase token with the Google Play
                    // Developer API.
                }
            }
        })

Java

InAppMessageParams inAppMessageParams = InAppMessageParams.newBuilder()
        .addInAppMessageCategoryToShow(InAppMessageCategoryId.TRANSACTIONAL)
        .build();

billingClient.showInAppMessages(activity,
        inAppMessageParams,
        new InAppMessageResponseListener() {
            @Override
            public void onInAppMessageResponse(InAppMessageResult inAppMessageResult) {
                if (inAppMessageResult.responseCode
                        == InAppMessageResponseCode.NO_ACTION_NEEDED) {
                    // The flow has finished and there is no action needed from developers.
                } else if (inAppMessageResult.responseCode
                        == InAppMessageResponseCode.SUBSCRIPTION_STATUS_UPDATED) {
                    // The subscription status changed. For example, a subscription
                    // has been recovered from a suspend state. Developers should
                    // expect the purchase token to be returned with this response
                    // code and use the purchase token with the Google Play
                    // Developer API.
                }
            }
        });

จัดการธุรกรรมการสมัครใช้บริการที่รอดำเนินการ

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

การเปลี่ยนสถานะการสมัครใช้บริการสำหรับการซื้อครั้งแรกที่มีธุรกรรมที่รอดำเนินการนั้น ทำได้ง่ายๆ แอปของคุณจะได้รับ Purchase ที่มีสถานะ PENDING เมื่อผู้ใช้เริ่มธุรกรรมที่รอดำเนินการ เมื่อธุรกรรมเสร็จสมบูรณ์ แอปของคุณจะได้รับ Purchase อีกครั้งโดยมีการอัปเดตสถานะเป็น PURCHASED ระบบจะส่งข้อความ SubscriptionNotification ที่มีประเภท SUBSCRIPTION_PURCHASED ไปยัง ไคลเอ็นต์ RTDN ของคุณ ทำตามกระบวนการปกติเพื่อยืนยันการซื้อ ให้สิทธิ์ผู้ใช้เข้าถึงเนื้อหา และรับทราบการซื้อ หากธุรกรรม หมดอายุหรือถูกยกเลิก ระบบจะส่งSubscriptionNotificationข้อความที่มีประเภท SUBSCRIPTION_PENDING_PURCHASE_CANCELED ไปยังไคลเอ็นต์ RTDN ของคุณ ในกรณีเช่นนี้ ผู้ใช้ไม่ควรได้รับสิทธิ์เข้าถึงเนื้อหา

การเติมเงิน อัปเกรด หรือดาวน์เกรดที่มีธุรกรรมที่รอดำเนินการจะเกี่ยวข้องกับการเปลี่ยนแปลงสถานะ สำหรับการสมัครใช้บริการทั้งแบบเก่าและแบบใหม่ เมื่อผู้ใช้เริ่มธุรกรรมการเติมเงิน การอัปเกรด หรือการดาวน์เกรดที่รอดำเนินการ แอปของคุณจะได้รับ Purchase สำหรับการสมัครใช้บริการเก่าที่มีออบเจ็กต์ PendingPurchaseUpdate ในตอนนี้ ผู้ใช้ยังคงเป็นเจ้าของการสมัครใช้บริการเดิมและยังไม่ได้สมัครใช้บริการใหม่ การเรียกใช้ getProducts() และ getPurchaseToken() ในออบเจ็กต์ PendingPurchaseUpdate จะแสดงรหัสผลิตภัณฑ์และโทเค็นการซื้อของการสมัครใช้บริการใหม่ เมื่อธุรกรรมเสร็จสมบูรณ์ แอปจะได้รับ Purchase โดยมีโทเค็นการซื้อระดับบนสุดที่ตั้งค่าไว้สำหรับการสมัครใช้บริการใหม่ และสถานะที่ตั้งค่าเป็น PURCHASED ระบบจะส่งข้อความ SubscriptionNotification ที่มีประเภท SUBSCRIPTION_PURCHASED ไปยังไคลเอ็นต์ RTDN ในตอนนี้ คุณควรแทนที่โทเค็นการซื้อเก่าด้วยโทเค็นการซื้อใหม่และอัปเดตสิทธิ์เข้าถึงเนื้อหาของผู้ใช้ หากธุรกรรมหมดอายุหรือถูกยกเลิก ระบบจะส่งข้อความ SubscriptionNotification ที่มีประเภท SUBSCRIPTION_PENDING_PURCHASE_CANCELED ไปยังไคลเอ็นต์ RTDN ของคุณ ในกรณีเช่นนี้ ผู้ใช้ควรยังคงมีสิทธิ์เข้าถึงเนื้อหาของการสมัครใช้บริการเก่า