ระบบการเรียกเก็บเงินของ Google Play เป็นบริการที่ ช่วยให้คุณขายผลิตภัณฑ์และเนื้อหาดิจิทัลในแอป Android ได้ ในการเปิดตัวเดือนพฤษภาคม 2022 เราได้เปลี่ยนวิธี กำหนดผลิตภัณฑ์การสมัครใช้บริการ ซึ่งจะส่งผลต่อวิธีขายผลิตภัณฑ์ดังกล่าวในแอปและวิธีจัดการผลิตภัณฑ์ใน แบ็กเอนด์ หากผสานรวมกับ Google Play Billing เป็นครั้งแรก คุณสามารถเริ่มต้นการผสานรวมได้โดยอ่านหัวข้อการเตรียมความพร้อม
หากคุณขายการสมัครใช้บริการด้วยการเรียกเก็บเงินของ Google Play ก่อนเดือนพฤษภาคม 2022 คุณควรทำความเข้าใจวิธีใช้ฟีเจอร์ใหม่ๆ ในขณะที่ยังคง การสมัครใช้บริการที่มีอยู่
สิ่งแรกที่ควรทราบคือการสมัครใช้บริการ แอป และการผสานรวมแบ็กเอนด์ที่มีอยู่ทั้งหมดจะทํางานเหมือนก่อนการเปิดตัวในเดือนพฤษภาคม 2022 คุณไม่จําเป็นต้องทําการเปลี่ยนแปลงใดๆ ในทันที และสามารถใช้ฟีเจอร์ใหม่เหล่านี้ได้ทุกเวลาที่ต้องการ Google Play Billing Library แต่ละรุ่นสำคัญจะได้รับการสนับสนุนเป็นเวลา 2 ปีหลังจากการเปิดตัว การผสานรวมที่มีอยู่กับ Google Play Developer API จะยังคงทำงานได้ตามปกติ
ภาพรวมของการอัปเดตเดือนพฤษภาคม 2022 มีดังนี้
- Google Play Console เวอร์ชันใหม่ ช่วยให้คุณสร้างและจัดการการสมัครใช้บริการ แพ็กเกจเริ่มต้น และข้อเสนอได้ ซึ่งรวมถึงการสมัครใช้บริการใหม่และการสมัครใช้บริการที่ย้ายข้อมูล
- Play Developer API มีการอัปเดตเพื่อรองรับฟังก์ชันการทำงานของ UI ใหม่ของ Google Play Console ในรูปแบบ API โดยเฉพาะอย่างยิ่ง Subscription Purchases API มีเวอร์ชันใหม่ ใช้ API นี้เพื่อตรวจสอบสถานะการสมัครใช้บริการและจัดการการซื้อการสมัครใช้บริการ
- Play Billing Library เวอร์ชัน 5 ใหม่ช่วยให้แอปของคุณได้รับประโยชน์จากฟีเจอร์การสมัครใช้บริการใหม่ทั้งหมด เมื่อพร้อมที่จะอัปเกรดเป็นเวอร์ชัน 5 แล้ว ให้ทําตามคําแนะนําในคําแนะนําในการย้ายข้อมูล
การกำหนดค่าการสมัครใช้บริการ
การจัดการการสมัครใช้บริการผ่าน Google Play Console
ตั้งแต่เดือนพฤษภาคม 2022 เป็นต้นไป คุณจะเห็นความแตกต่างบางอย่างใน Google Play Console
ตอนนี้การสมัครใช้บริการหนึ่งๆ สามารถมีแพ็กเกจเริ่มต้นและ ข้อเสนอได้หลายแบบ SKU การสมัครใช้บริการที่สร้างไว้ก่อนหน้านี้จะปรากฏใน Play Console เป็นออบเจ็กต์การสมัครใช้บริการ แพ็กเกจเริ่มต้น และข้อเสนอใหม่เหล่านี้ หากยังไม่ได้ดำเนินการ โปรดดู การเปลี่ยนแปลงล่าสุดในการสมัครใช้บริการใน Play Console เพื่อดูคำอธิบายของออบเจ็กต์ใหม่ รวมถึงฟังก์ชันและการกำหนดค่า ผลิตภัณฑ์การสมัครใช้บริการที่มีอยู่ทั้งหมดจะปรากฏใน Google Play Console ในรูปแบบใหม่นี้ ตอนนี้ SKU แต่ละรายการจะแสดงด้วย ออบเจ็กต์การสมัครใช้บริการที่มีแพ็กเกจเริ่มต้นเดียวและข้อเสนอ ที่เข้ากันได้แบบย้อนหลัง (หากมี)
เนื่องจากการผสานรวมที่เก่ากว่าคาดหวังให้การสมัครใช้บริการแต่ละรายการมีข้อเสนอเดียว
ซึ่งแสดงโดยออบเจ็กต์ SkuDetails
การสมัครใช้บริการแต่ละรายการจึงมีแพ็กเกจเริ่มต้นหรือข้อเสนอที่เข้ากันได้แบบย้อนหลังได้เพียงรายการเดียว
ระบบจะแสดงแพ็กเกจเริ่มต้นหรือข้อเสนอที่เข้ากันได้แบบย้อนหลังเป็นส่วนหนึ่งของ SKU
สำหรับแอปที่ใช้เมธอด querySkuDetailsAsync() ที่เลิกใช้แล้วในตอนนี้
ดูข้อมูลเพิ่มเติมเกี่ยวกับการกำหนดค่าและการจัดการข้อเสนอที่เข้ากันได้แบบย้อนหลังได้ที่ทำความเข้าใจการสมัครใช้บริการ
เมื่อแอปใช้เฉพาะ queryProductDetailsAsync() และเมื่อไม่มีแอปเวอร์ชันเก่าที่ยังคงมีการซื้ออีกต่อไป คุณก็ไม่จำเป็นต้องใช้ข้อเสนอที่เข้ากันได้แบบย้อนหลังแล้ว
การจัดการการสมัครใช้บริการผ่าน Subscriptions Publishing API
Play Developer API
มีฟังก์ชันใหม่สำหรับการซื้อการสมัครใช้บริการ API สำหรับการจัดการ SKU จะยังคงทำงานได้เหมือนเดิม รวมถึงการจัดการไอเทมแบบซื้อครั้งเดียวและการสมัครใช้บริการ ดังนั้นคุณจึงไม่จำเป็นต้องทำการเปลี่ยนแปลงใดๆ โดยทันทีเพื่อรักษาการผสานรวมinappproducts
อย่างไรก็ตาม โปรดทราบว่า Google Play Console จะใช้เฉพาะเอนทิตีการสมัครใช้บริการใหม่
เท่านั้น เมื่อเริ่มแก้ไขการสมัครใช้บริการใน
Console คุณจะใช้
inappproducts
API กับการสมัครใช้บริการไม่ได้อีกต่อไป
หากคุณใช้ Publishing API ก่อนเดือนพฤษภาคม 2022 เพื่อหลีกเลี่ยงปัญหา
การสมัครใช้บริการที่มีอยู่จะปรากฏเป็นแบบอ่านอย่างเดียวใน
Google Play Console หากพยายามทำการเปลี่ยนแปลง คุณอาจได้รับคำเตือนที่อธิบาย
ข้อจำกัดนี้ ก่อนที่จะแก้ไขการสมัครใช้บริการเพิ่มเติมใน Console คุณควร
อัปเดตการผสานรวมแบ็กเอนด์เพื่อใช้ปลายทางการเผยแพร่
การสมัครใช้บริการใหม่ ปลายทางใหม่
monetization.subscriptions
monetization.subscriptions.baseplans
และ
monetization.subscriptions.offers
ช่วยให้คุณจัดการแพ็กเกจเริ่มต้นและข้อเสนอทั้งหมดที่มีได้ คุณดูได้ว่าฟิลด์ต่างๆ แมปจากเอนทิตี InAppProduct ไปยังออบเจ็กต์ใหม่ในส่วน monetization.subscriptions ได้อย่างไรในตารางต่อไปนี้
| InAppProduct | การสมัครใช้บริการ |
|---|---|
packageName |
packageName |
sku |
productId |
status |
basePlans[0].state |
prices |
basePlans[0].regionalConfigs.price |
listings |
ข้อมูล |
defaultPrice |
ไม่มีความเท่าเทียม |
subscriptionPeriod |
basePlans[0].autoRenewingBasePlanType.billingPeriodDuration |
trialPeriod |
basePlans[0].offers[0].phases[0].regionalConfigs[0].free |
gracePeriod |
basePlans[0].autoRenewingBasePlanType.gracePeriodDuration |
subscriptionTaxesAndComplianceSettings |
taxAndComplianceSettings |
การอัปเดต API ที่จำเป็นนี้มีผลกับ Publishing API (การจัดการ SKU) เท่านั้น
การเปลี่ยนแปลงใน Play Billing Library
Play Billing Library มีเมธอดและออบเจ็กต์ทั้งหมดที่มีในเวอร์ชันก่อนหน้าเพื่อรองรับการย้ายข้อมูลแบบค่อยเป็นค่อยไป
SkuDetails
ออบเจ็กต์และฟังก์ชัน เช่น
querySkuDetailsAsync()
จะยังคงมีอยู่เพื่อให้คุณอัปเกรดไปใช้ฟังก์ชันการทำงานใหม่
ได้โดยไม่ต้องอัปเดตโค้ดการสมัครใช้บริการที่มีอยู่ทันที
นอกจากนี้ คุณยังควบคุมได้ว่าจะให้ข้อเสนอใดพร้อมใช้งานผ่านวิธีการเหล่านี้
โดยทำเครื่องหมายข้อเสนอว่าเข้ากันแบบย้อนหลังได้
นอกเหนือจากการเก็บรักษาวิธีการเดิมแล้ว ตอนนี้ Play Billing Library 5 ยังมีออบเจ็กต์ ProductDetails ใหม่และเมธอด queryProductDetailsAsync() ที่เกี่ยวข้อง
เพื่อจัดการเอนทิตีและฟังก์ชันการทำงานใหม่ๆ ขณะนี้ ProductDetails รองรับไอเทมที่ซื้อในแอปที่มีอยู่แล้ว
(การซื้อแบบครั้งเดียวและไอเทมที่ใช้แล้วหมดไป) ด้วย
สำหรับการสมัครใช้บริการ ProductDetails.getSubscriptionOfferDetails()
จะแสดงรายการแพ็กเกจเริ่มต้นและข้อเสนอทั้งหมดที่ผู้ใช้มีสิทธิ์ซื้อ
ซึ่งหมายความว่าคุณสามารถเข้าถึงแพ็กเกจเริ่มต้นและข้อเสนอทั้งหมดที่มีสิทธิ์
สำหรับผู้ใช้ได้ ไม่ว่าแพ็กเกจหรือข้อเสนอเหล่านั้นจะเข้ากันได้แบบย้อนหลังหรือไม่ก็ตาม
getSubscriptionOfferDetails()การคืนสินค้าnullสำหรับผลิตภัณฑ์ที่ไม่ใช่การสมัครใช้บริการ สำหรับการซื้อครั้งเดียว คุณสามารถใช้ getOneTimePurchaseOfferDetails() ได้
นอกจากนี้ Play Billing Library 5 ยังมีทั้งวิธีการใหม่และวิธีการเดิมสำหรับ
เปิดตัวขั้นตอนการซื้อ หากมีการกำหนดค่าออบเจ็กต์ BillingFlowParams ที่ส่งไปยัง
BillingClient.launchBillingFlow()
โดยใช้ออบเจ็กต์ SkuDetails ระบบจะดึงข้อมูลข้อเสนอ
เพื่อขายจากแพ็กเกจเริ่มต้นหรือข้อเสนอที่เข้ากันได้แบบย้อนหลังซึ่ง
สอดคล้องกับ SKU หากกำหนดค่าออบเจ็กต์ BillingFlowParams ที่ส่งไปยัง BillingClient.launchBillingFlow() โดยใช้ออบเจ็กต์ ProductDetailsParams ซึ่งรวมถึง ProductDetails และ String ที่แสดงโทเค็นข้อเสนอที่เฉพาะเจาะจงสำหรับข้อเสนอที่ซื้อ ระบบจะใช้ข้อมูลดังกล่าวเพื่อระบุผลิตภัณฑ์ที่ผู้ใช้ได้รับ
queryPurchasesAsync() แสดงผลการซื้อทั้งหมดที่ผู้ใช้เป็นเจ้าของ หากต้องการระบุประเภทผลิตภัณฑ์ที่ขอ คุณสามารถส่งค่า BillingClient.SkuType ได้เหมือนในเวอร์ชันเก่า หรือส่งออบเจ็กต์ QueryPurchasesParams ที่มีค่า BillingClient.ProductType ซึ่งแสดงถึงเอนทิตีการสมัครใช้บริการใหม่
เราขอแนะนำให้อัปเดตแอปเป็นไลบรารีเวอร์ชัน 5 โดยเร็วเพื่อเริ่มใช้ประโยชน์ จากฟีเจอร์การสมัครใช้บริการใหม่เหล่านี้
การจัดการสถานะการสมัครใช้บริการ
ส่วนนี้จะอธิบายการเปลี่ยนแปลงหลักๆ ในคอมโพเนนต์แบ็กเอนด์ของ การผสานรวมระบบการเรียกเก็บเงินของ Google Play ที่ต้องนำไปใช้เพื่อ ย้ายข้อมูลไปยังเวอร์ชัน 5
การแจ้งเตือนแบบเรียลไทม์สำหรับนักพัฒนาแอป
ในเร็วๆ นี้ ออบเจ็กต์ SubscriptionNotification
จะไม่มี subscriptionId อีกต่อไป หากคุณใช้
ฟิลด์นี้เพื่อระบุผลิตภัณฑ์การสมัครใช้บริการ คุณควร
อัปเดตเพื่อรับข้อมูลนี้จากสถานะการสมัครใช้บริการโดยใช้
purchases.subscriptionv2:get
เมื่อได้รับการแจ้งเตือน องค์ประกอบ SubscriptionPurchaseLineItem แต่ละรายการ
ในคอลเล็กชัน lineItems ที่แสดงผลเป็นส่วนหนึ่งของสถานะการซื้อ
จะมี productId ที่เกี่ยวข้อง
Subscriptions Purchases API: การรับสถานะการสมัครใช้บริการ
ใน API การซื้อการสมัครใช้บริการเวอร์ชันก่อนหน้า คุณสามารถ
ค้นหาสถานะการสมัครใช้บริการได้โดยใช้
purchases.subscriptions:get
ปลายทางนี้จะไม่เปลี่ยนแปลงและจะยังคงใช้ได้กับการซื้อการสมัครใช้บริการที่เข้ากันได้แบบย้อนหลัง
ปลายทางนี้ไม่รองรับฟังก์ชันการทำงานใหม่
ที่เปิดตัวในเดือนพฤษภาคม 2022
ใน Subscriptions Purchases API เวอร์ชันใหม่ ให้ใช้
purchases.subscriptionsv2:get
เพื่อดูสถานะการซื้อการสมัครใช้บริการ API นี้ใช้ได้กับการสมัครใช้บริการที่ย้ายข้อมูล การสมัครใช้บริการใหม่ (ทั้งแบบชำระเงินล่วงหน้าและแบบต่ออายุอัตโนมัติ) และการซื้อทุกประเภท คุณใช้ปลายทางนี้
เพื่อตรวจสอบสถานะการติดตามเมื่อได้รับการแจ้งเตือนได้ ออบเจ็กต์ที่ส่งคืน SubscriptionPurchaseV2 มีฟิลด์ใหม่
แต่ก็ยังมีข้อมูลเดิมที่จำเป็นต่อการรองรับ
การสมัครใช้บริการที่มีอยู่ต่อไป
ฟิลด์ SubscriptionPurchaseV2 สำหรับแพ็กเกจแบบชำระเงินล่วงหน้า
เราได้เพิ่มฟิลด์ใหม่เพื่อรองรับแพ็กเกจแบบชำระเงินล่วงหน้า ซึ่งผู้ใช้จะเป็นผู้ขยายเวลาแทนที่จะต่ออายุโดยอัตโนมัติ ฟิลด์ทั้งหมดใช้ได้กับแพ็กเกจแบบชำระเงินล่วงหน้าเช่นเดียวกับการสมัครใช้บริการแบบต่ออายุใหม่อัตโนมัติ โดยมีข้อยกเว้นดังนี้
- [ฟิลด์ใหม่] lineItems[0].prepaid_plan.allowExtendAfterTime: ระบุ เวลาที่ระบบจะอนุญาตให้ผู้ใช้ซื้อการเติมเงินอีกครั้งเพื่อต่ออายุแพ็กเกจ แบบชำระเงินล่วงหน้า เนื่องจากระบบอนุญาตให้ผู้ใช้มีการเติมเงินที่ยังไม่ได้ใช้เพียงครั้งละ 1 รายการ
- [ฟิลด์ใหม่] SubscriptionState: ระบุสถานะออบเจ็กต์การสมัครใช้บริการ
สำหรับแพ็กเกจแบบชำระล่วงหน้า ค่านี้จะเป็น
ACTIVE,PENDINGหรือCANCELEDเสมอ - lineItems[0].expiryTime: ฟิลด์นี้จะแสดงเสมอสำหรับแพ็กเกจแบบชำระล่วงหน้า
- paused_state_context: ฟิลด์นี้จะไม่มีอยู่เนื่องจากแพ็กเกจแบบชำระล่วงหน้า หยุดชั่วคราวไม่ได้
- lineItems[0].auto_renewing_plan: ไม่มีสำหรับแพ็กเกจแบบชำระเงินล่วงหน้า
- canceled_state_context: ไม่มีสำหรับแพ็กเกจแบบชำระล่วงหน้า เนื่องจากฟิลด์นี้ ใช้ได้กับผู้ใช้ที่ยกเลิกการสมัครใช้บริการอย่างแข็งขันเท่านั้น
- lineItems[0].productId: ฟิลด์นี้จะแทนที่
subscriptionIdจาก เวอร์ชันก่อนหน้า
ฟิลด์ SubscriptionPurchaseV2 สำหรับการสมัครใช้บริการแบบเกิดซ้ำ
purchases.subscriptionv2 มีฟิลด์ใหม่ที่ให้รายละเอียดเพิ่มเติม
เกี่ยวกับออบเจ็กต์การสมัครใช้บริการใหม่ ตารางต่อไปนี้แสดงวิธีแมปฟิลด์จาก
ปลายทางการสมัครใช้บริการเดิมกับฟิลด์ที่เกี่ยวข้องใน
purchases.subscriptionv2
| SubscriptionPurchase | SubscriptionPurchaseV2 |
|---|---|
countryCode |
regionCode |
orderId |
latestOrderId |
| (ไม่มีฟิลด์ที่เทียบเท่า) | lineItems.offerPhase (ระบุเฟสปัจจุบัน: ช่วงทดลองใช้ฟรี ราคาช่วงแนะนำ การปรับตามสัดส่วน ราคาฐาน) |
| (ไม่มีฟิลด์ที่เทียบเท่า) | lineItems (รายการ
SubscriptionPurchaseLineItem)
ที่แสดงถึงผลิตภัณฑ์ที่ได้จากการซื้อ |
| (ไม่มีฟิลด์ที่เทียบเท่า) | lineItems.offerDetails.basePlanId |
| (ไม่มีฟิลด์ที่เทียบเท่า) | lineItems.offerDetails.offerId |
| (ไม่มีฟิลด์ที่เทียบเท่า) | lineItems.offerDetails.offerTags |
startTimeMillis |
startTime |
expiryTimeMillis |
lineItems.expiryTime (การสมัครใช้บริการแต่ละรายการที่ได้มา
ในการซื้อจะมี expiryTime ของตัวเอง) |
| (ไม่มีฟิลด์ที่เทียบเท่า) | subscriptionState (ระบุ
สถานะของการสมัครใช้บริการ) |
| (ไม่มีฟิลด์ที่เทียบเท่า) | pausedStateContext (จะแสดงก็ต่อเมื่อสถานะการสมัครใช้บริการเป็น SUBSCRIPTION_STATE_PAUSED เท่านั้น) |
autoResumeTimeMillis |
pausedStateContext.autoResumeTime |
| (ไม่มีฟิลด์ที่เทียบเท่า) | canceledStateContext (จะแสดงก็ต่อเมื่อสถานะการสมัครใช้บริการเป็น SUBSCRIPTION_STATE_CANCELED เท่านั้น) |
| (ไม่มีฟิลด์ที่เทียบเท่า) | testPurchase (มีเฉพาะในการซื้อของผู้ทดสอบที่ได้รับอนุญาต
เท่านั้น) |
autoRenewing |
lineItems.autoRenewingPlan.autoRenewEnabled |
priceCurrenceCode,
priceAmountMicros |
lineItems.autoRenewingPlan.recurringPrice |
introductoryPriceInfo |
lineItems.offerPhase.introductoryPriceคุณยังดูข้อมูลนี้ได้ใน offerของ
การสมัครใช้บริการแต่ละรายการที่ซื้อ |
| developerPayload | เพย์โหลดของนักพัฒนาแอป (ไม่มีฟิลด์ที่เทียบเท่า) ถูกเลิกใช้งานแล้ว |
| paymentState | (ไม่มีฟิลด์ที่เทียบเท่า) คุณสามารถอนุมานสถานะการชำระเงินจาก subscriptionState ได้โดยทำดังนี้
|
cancelReason,
userCancellationTimeMillis,
cancelSurveyResult |
canceledStateContext |
linkedPurchaseToken |
linkedPurchaseToken (ไม่มีการเปลี่ยนแปลง) |
purchaseType |
การทดสอบ: ผ่าน testPurchaseโปรโมชัน: signupPromotion |
priceChange |
lineItems.autoRenewingPlan.priceChangeDetails |
profileName,
emailAddress,
givenName,
familyName,
profileId |
subscribeWithGoogleInfo |
acknowledgementState |
acknowledgementState (no change) |
promotionType,
promotionCode |
signupPromotion |
externalAccountId,
obfuscatedExternalAccountId,
obfuscatedExteranlProfileId |
externalAccountIdentifiers |
ฟังก์ชันการจัดการการสมัครใช้บริการอื่นๆ
แม้ว่า
purchases.subscriptions:get
จะได้รับการอัปเกรดเป็น
purchases.subscriptionsv2:get
แล้ว แต่ฟังก์ชันการจัดการการสมัครใช้บริการของนักพัฒนาแอปที่เหลือจะยังคง
ไม่เปลี่ยนแปลงในตอนนี้ในปลายทาง purchases.subscriptions
เพื่อให้คุณใช้
purchases.subscriptions:acknowledge
purchases.subscriptions:cancel
purchases.subscriptions:defer
purchases.subscriptions:refund
และ
purchases.subscriptions:revoke
ได้ต่อไปเช่นเดิม
Pricing API
ใช้ปลายทาง
monetization.convertRegionPrices
เพื่อคำนวณราคาระดับภูมิภาคเช่นเดียวกับที่คุณทำผ่าน Play Console วิธีนี้ยอมรับราคาเดียวในสกุลเงินใดก็ได้ที่ Play รองรับ
และแสดงราคาที่แปลงแล้ว (รวมถึงอัตราเริ่มต้นของ
ภาษีในกรณีที่เกี่ยวข้อง) สำหรับทุกภูมิภาคที่ Google Play รองรับการซื้อ