ระบบการเรียกเก็บเงินของ Google Play เป็นบริการที่เปิดโอกาสให้คุณขายผลิตภัณฑ์และเนื้อหาดิจิทัลในแอป Android เราได้เปลี่ยนแปลงวิธีกำหนดผลิตภัณฑ์ที่ต้องสมัครใช้บริการในรุ่นเดือนพฤษภาคม 2022 ซึ่งส่งผลต่อวิธีขายผลิตภัณฑ์ที่ต้องสมัครใช้บริการในแอปและวิธีจัดการในแบ็กเอนด์ หากผสานรวมกับ Google Play Billing เป็นครั้งแรก คุณสามารถเริ่มการผสานรวมได้โดยอ่านการเตรียมพร้อม
หากคุณขายการสมัครใช้บริการด้วย Google Play Billing ก่อนเดือนพฤษภาคม 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 inappproducts
การจัดการ SKU จะยังคงทำงานต่อไปเช่นเดิม รวมถึงจัดการผลิตภัณฑ์แบบซื้อครั้งเดียวและการสมัครใช้บริการ คุณจึงไม่จำเป็นต้องทำการเปลี่ยนแปลงใดๆ ในทันทีเพื่อรักษาการผสานรวมไว้
อย่างไรก็ตาม โปรดทราบว่า 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: การดูสถานะการสมัครใช้บริการ
ใน Subscriptions Purchases API เวอร์ชันก่อนหน้า คุณสามารถค้นหาสถานะการสมัครใช้บริการได้โดยใช้ purchases.subscriptions:get
ปลายทางนี้ไม่มีการเปลี่ยนแปลงและยังคงทํางานต่อไปสําหรับการซื้อการสมัครใช้บริการที่เข้ากันได้แบบย้อนหลัง ปลายทางนี้ไม่รองรับฟังก์ชันการทำงานใหม่ทั้งหมดที่เปิดตัวในเดือนพฤษภาคม 2022
ใน Subscriptions Purchases API เวอร์ชันใหม่ ให้ใช้ purchases.subscriptionsv2:get
เพื่อดูสถานะการซื้อการสมัครใช้บริการ API นี้ใช้ได้กับการสมัครใช้บริการที่ย้ายข้อมูล การสมัครใช้บริการใหม่ (ทั้งแบบชำระเงินล่วงหน้าและแบบต่ออายุใหม่อัตโนมัติ) ตลอดจนการซื้อทุกประเภท คุณสามารถใช้ปลายทางนี้เพื่อตรวจสอบสถานะการสมัครรับข้อมูลเมื่อได้รับการแจ้งเตือน ออบเจ็กต์ SubscriptionPurchaseV2
ที่แสดงผลมีฟิลด์ใหม่ แต่ยังคงมีข้อมูลเดิมที่จําเป็นต่อการสนับสนุนการสมัครใช้บริการที่มีอยู่ต่อไป
ฟิลด์ SubscriptionPurchaseV2 สำหรับแพ็กเกจแบบชำระเงินล่วงหน้า
เราได้เพิ่มช่องใหม่เพื่อรองรับแพ็กเกจแบบชำระเงินล่วงหน้า ซึ่งผู้ใช้จะเป็นผู้ขยายเวลาแทนการต่ออายุใหม่อัตโนมัติ ฟิลด์ทั้งหมดมีผลกับแพ็กเกจแบบชำระเงินล่วงหน้าเช่นเดียวกับการสมัครใช้บริการแบบต่ออายุใหม่อัตโนมัติ โดยมีข้อยกเว้นต่อไปนี้
- [ช่องใหม่] lineItems[0].prepaid_plan.allowExtendAfterTime: ระบุเวลาที่ผู้ใช้จะได้รับอนุญาตให้ซื้อการเติมเงินอีกเพื่อขยายเวลาแพ็กเกจแบบชำระเงินล่วงหน้า เนื่องจากผู้ใช้มีสิทธิ์ใช้การเติมเงินที่ไม่ได้ใช้เพียงครั้งเดียวในแต่ละครั้ง
- [ช่องใหม่] 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 (รายการ 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 |
(ไม่มีช่องที่เทียบเท่า) ดูข้อมูลนี้ได้ใน offer สำหรับการสมัครใช้บริการแต่ละรายการที่ซื้อ |
developerPayload | (no equivalent field) เลิกใช้งานเพย์โหลดของนักพัฒนาแอปแล้ว |
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 รองรับการซื้อ