วงจรการสมัครใช้บริการ

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

จัดการวงจรการสมัครใช้บริการแบบต่ออายุอัตโนมัติ

เมื่อสถานะการสมัครใช้บริการของผู้ใช้เปลี่ยนแปลง เซิร์ฟเวอร์แบ็กเอนด์จะได้รับข้อความ SubscriptionNotification

subs-auto-renew-state
รูปที่ 1 สถานะวงจรและเหตุการณ์การเปลี่ยนสถานะสําหรับ การซื้อการสมัครใช้บริการแบบต่ออายุอัตโนมัติ

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

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

การซื้อการสมัครใช้บริการแบบต่ออายุอัตโนมัติรายการใหม่

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

  1. ค้นหาปลายทาง purchases.subscriptionsv2.get เพื่อรับทรัพยากรการสมัครใช้บริการที่มีสถานะการสมัครใช้บริการล่าสุด
  2. ตรวจสอบว่าค่าของช่อง subscriptionState คือ SUBSCRIPTION_STATE_ACTIVE
  3. ยืนยันการซื้อ
  4. ให้สิทธิ์ผู้ใช้เข้าถึงเนื้อหา คุณสามารถระบุบัญชีผู้ใช้ที่เชื่อมโยงกับการซื้อได้ด้วยออบเจ็กต์ ExternalAccountIdentifiers จากทรัพยากรการสมัครใช้บริการ หากมีการตั้งค่าตัวระบุไว้ ณ เวลาที่ซื้อโดยใช้ setObfuscatedAccountId และ setObfuscatedProfileId

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

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

ทรัพยากรการสมัครใช้บริการสำหรับการซื้อใหม่จะมีลักษณะคล้ายกับตัวอย่างต่อไปนี้

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  "startTime": "2022-04-22T18:39:58.270Z",
  "regionCode": "US",
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  "latestOrderId": "GPA.3333-4137-0319-36762",
  "acknowledgementState": "ACKNOWLEDGEMENT_STATE_PENDING", // need to acknowledge new purchases
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": next_renewal_date,
      "autoRenewingPlan": {
        "autoRenewEnabled": true
      },
      "offerPhase": {
        "freeTrial": {}
      }
    }
  ],
}

การต่ออายุการสมัครใช้บริการ

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

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  "startTime": "2022-04-22T18:39:58.270Z",
  "regionCode": "US",
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  "latestOrderId": "GPA.3333-4137-0319-36762",
  "acknowledgementState": "ACKNOWLEDGEMENT_STATE_ACKNOWLEDGED",
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": next_renewal_date,
      "autoRenewingPlan": {
        "autoRenewEnabled": true
      },
      "offerPhase": {
        "basePrice": {}
      }
    }
  ]
}

คุณไม่จำเป็นต้องรับทราบการต่ออายุการสมัครใช้บริการ

ระยะเวลาผ่อนผัน

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

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

การซิงค์สถานะการสมัครใช้บริการกับแบ็กเอนด์จะช่วยให้คุณทราบถึงการชำระเงินที่ถูกปฏิเสธมากขึ้น และให้บริบทเพิ่มเติมขณะที่คุณพยายามลดการเลิกใช้งานโดยไม่ตั้งใจ ฟังข้อความ SubscriptionNotification ที่มีประเภท SUBSCRIPTION_IN_GRACE_PERIOD เพื่อรับการแจ้งเตือนเมื่อผู้ใช้เข้าสู่ระยะเวลาผ่อนผัน ขณะที่ผู้ใช้อยู่ในระยะเวลาผ่อนผัน resource การสมัครใช้บริการ จะมี autoRenewEnabled = true Google Play จะขยายค่า expiryTime แบบไดนามิกจนกว่าระยะเวลาผ่อนผันจะหมดอายุ เนื่องจากสิทธิ์ควรคงอยู่จนกว่าผู้ใช้จะยกเลิกหรือระยะเวลาผ่อนผันสิ้นสุดลงตามระยะเวลาสูงสุด ค่าของช่อง subscriptionState ในช่วงเวลานี้คือ SUBSCRIPTION_STATE_IN_GRACE_PERIOD ทรัพยากรการสมัครใช้บริการจะมีลักษณะคล้ายกับตัวอย่างต่อไปนี้

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_IN_GRACE_PERIOD",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": timestamp_in_future,
      "autoRenewingPlan": {
        "autoRenewEnabled": true
      }
    }
  ],
}

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

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

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

การเข้าถึงและการกู้คืนในช่วงระยะเวลาผ่อนผัน

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

รูปที่ 2 ไทม์ไลน์สำหรับการสมัครใช้บริการที่เข้าสู่ระยะเวลาผ่อนผัน และกู้คืนก่อนสิ้นสุดระยะเวลาผ่อนผัน

สิ่งสำคัญที่ควรคำนึงถึงมีดังนี้

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

ระยะเวลาผ่อนผันแบบเงียบ

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

วิธีที่ดีที่สุดในการติดตามการเปลี่ยนแปลงสถานะการสมัครใช้บริการคือการฟังและตอบสนองต่อการแจ้งเตือนแบบเรียลไทม์สำหรับนักพัฒนาแอป (RTDN) เรียกใช้เมธอด purchases.subscriptionsv2.get() ณ เวลาที่ได้รับ RTDN แทนเวลาหมดอายุเพื่อให้ได้สถานะการสมัครใช้บริการที่แม่นยำยิ่งขึ้น

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

  • SUBSCRIPTION_ON_HOLD (หากเปิดใช้)
  • SUBSCRIPTION_CANCELED (หากยกเลิก)
  • SUBSCRIPTION_EXPIRED (หากหมดอายุ)
  • SUBSCRIPTION_RENEWED (หากต่ออายุสำเร็จ)

นอกจากนี้ คุณยังเรียกใช้เมธอด subscriptionV2.get() ได้ทุกเมื่อหลังจากระยะเวลาผ่อนผันแบบไม่มีการแจ้งเตือน 24 ชั่วโมงเพื่อดูสถานะล่าสุดของการสมัครใช้บริการ

การระงับบัญชี

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

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

RTDN จะแจ้งให้คุณทราบเมื่อผู้ใช้เข้าสู่ช่วงการระงับบัญชี เพื่อให้คุณแจ้งผู้ใช้ได้โดยเร็วที่สุดถึงสาเหตุที่ระงับสิทธิ์เข้าถึงการสมัครใช้บริการ วิธีที่ตรงไปตรงมาในการดำเนินการนี้คือการใช้ In-App Messaging API การเรียกใช้ API นี้เมื่อผู้ใช้เปิดแอปจะแสดงข้อความในแถบแสดงสถานะชั่วคราวเพื่อแจ้งให้ผู้ใช้ทราบว่าการชำระเงินถูกปฏิเสธ ข้อความนี้ยังมี Deep Link สำหรับให้ผู้ใช้แก้ไขวิธีการชำระเงินใน Google Play ด้วย

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

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

เมื่อใช้การแจ้งเตือนแบบเรียลไทม์สำหรับนักพัฒนาแอป คุณจะได้รับข้อความ SubscriptionNotification ที่มีประเภท SUBSCRIPTION_ON_HOLD เมื่อการสมัครใช้บริการเข้าสู่การระงับบัญชี เรียกใช้เมธอด purchases.subscriptionsv2.get จากเซิร์ฟเวอร์แบ็กเอนด์ที่ปลอดภัยเพื่อดึงข้อมูลการสมัครใช้บริการใหม่ ในระหว่างการระงับบัญชี ระบบจะตั้งค่าช่อง expiryTime ของทรัพยากรการสมัครใช้บริการเป็นการประทับเวลาที่ผ่านมา และตั้งค่าช่อง subscriptionState เป็น SUBSCRIPTION_STATE_ON_HOLD ดังนี้

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_ON_HOLD",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": timestamp_in_past,
      ...
    }
  ],
}

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

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

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

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

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

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": next_renewal_date,
      ...
    }
  ],
}

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

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_CANCELED",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": timestamp_in_past,
      ...
    }
  ],
}

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

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

สิทธิ์เข้าถึงและการกู้คืนบัญชีที่ถูกระงับ

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

รูปที่ 3 ไทม์ไลน์สำหรับการสมัครใช้บริการที่เข้าสู่สถานะการระงับบัญชีและกู้คืนก่อนที่จะสิ้นสุด

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

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

สิ่งสำคัญที่ควรทราบมีดังนี้

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

วันหมดอายุ

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

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_EXPIRED",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": expiration_time_in_past,
      ...
    }
  ],
}

การยกเลิก

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

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

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

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_CANCELED",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": expiration_time,
      ...
    }
  ],
}

สำหรับการสมัครใช้บริการแบบผ่อนชำระ ระบบจะส่งการแจ้งเตือน SUBSCRIPTION_CANCELLATION_SCHEDULED เมื่อผู้ใช้เริ่มการยกเลิกในขณะที่ยังมีการชำระเงินเหลืออยู่ในระยะเวลาผูกมัด การยกเลิกอยู่ระหว่างรอดำเนินการและจะมีผลเมื่อสิ้นสุดระยะเวลาผูกมัดปัจจุบัน เมื่อคุณได้รับการแจ้งเตือนนี้ ทรัพยากรการสมัครใช้บริการที่แสดงผลจาก Google Play Developer API จะมีช่อง subscriptionState ที่ตั้งค่าเป็น SUBSCRIPTION_STATE_ACTIVE เนื่องจากยังมีการสมัครใช้บริการแบบผ่อนชำระอยู่จนกว่าจะสิ้นสุดระยะเวลาผูกมัด อย่างไรก็ตาม มีออบเจ็กต์ pendingCancellation ที่ว่างเปล่าอยู่ ระบบจะส่งการแจ้งเตือน SUBSCRIPTION_CANCELED ตามด้วย SUBSCRIPTION_EXPIRED เมื่อสิ้นสุดระยะเวลาผูกมัด

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

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  ...
  "lineItems": [
    {
      "productId": "sub_plan01",
      "expiryTime": expiration_time,
      "autoRenewingPlan": {
        "autoRenewEnabled": true,
        "recurringPrice": {
          "currencyCode": "USD",
          "units": "1",
          "nanos": 990000000
        },
        "installmentDetails": {
          "initialCommittedPaymentsCount": 6,
          "remainingCommittedPaymentsCount": 5,
          "pendingCancellation": {}
      ...
        }
      }
    }
  ],
}

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

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

การเพิกถอน

การสมัครใช้บริการอาจถูกเพิกถอนได้จากหลายสาเหตุ ซึ่งรวมถึงแบ็กเอนด์ของคุณเพิกถอนการสมัครใช้บริการโดยใช้ purchases.subscriptionsv2.revoke หรือการซื้อถูกดึงเงินคืน ในกรณีนี้ ให้เพิกถอนสิทธิ์ของผู้ใช้ทันที ระบบจะส่งข้อความ SubscriptionNotification ที่มีประเภท SUBSCRIPTION_REVOKED เมื่อเกิดเหตุการณ์นี้ขึ้น เมื่อคุณได้รับการแจ้งเตือนนี้ resource การสมัครใช้บริการ ที่ส่งคืนจาก Google Play Developer API จะมีฟิลด์ subscriptionState ตั้งค่าเป็น SUBSCRIPTION_STATE_EXPIRED

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

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_EXPIRED",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": expiration_time,
      ...
    }
  ]
}

การสมัครใช้บริการที่เลื่อนเวลาออกไป

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

คุณสามารถใช้ purchases.subscriptionsv2.defer API เพื่อเลื่อนวันที่เรียกเก็บเงินสำหรับการสมัครใช้บริการ (รวมถึงการสมัครใช้บริการที่มีแพ็กเกจเสริม) เมื่อคุณเลื่อนการสมัครใช้บริการที่มีส่วนเสริม ระบบจะเลื่อนรายการทั้งหมดในการสมัครใช้บริการออกไปเป็นระยะเวลาเท่ากัน

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

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

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

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": timestamp_in_future,
      ...
    }
  ],
}

การสมัครใช้บริการที่หยุดชั่วคราว

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

การเกิดซ้ำของการสมัครใช้บริการ รายสัปดาห์ รายเดือน 3 เดือน 6 เดือน รายปี
ระยะเวลาการหยุดชั่วคราวที่ใช้ได้* 1 สัปดาห์
2 สัปดาห์
3 สัปดาห์
4 สัปดาห์
1 เดือน
2 เดือน
3 เดือน
1 เดือน
2 เดือน
3 เดือน
1 เดือน
2 เดือน
3 เดือน
1 เดือน
2 เดือน
3 เดือน
*อาจมีการเปลี่ยนแปลงได้ทุกเมื่อ

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

รูปที่ 5 ผู้ใช้หยุดการสมัครใช้บริการชั่วคราวแล้วกลับมาสมัครใช้บริการอีกครั้ง
รูปที่ 6 ผู้ใช้หยุดการสมัครใช้บริการชั่วคราว แล้วป้อน การระงับบัญชี

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

เมื่อหยุดการสมัครใช้บริการของผู้ใช้ชั่วคราว Play Billing Library จะไม่แสดงการสมัครใช้บริการผ่านเมธอด queryPurchasesAsync() เว้นแต่จะตั้งค่าพารามิเตอร์ includeSuspendedSubscriptions เป็น true ใน QueryPurchasesParams หากการสมัครใช้บริการกลับมาทำงานอีกครั้ง เมธอด queryPurchasesAsync() จะแสดงผลการสมัครใช้บริการอีกครั้ง

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

ระบบจะส่งข้อความ SubscriptionNotification ที่มีประเภท SUBSCRIPTION_PAUSE_SCHEDULE_CHANGED เมื่อผู้ใช้เริ่มหยุดการสมัครใช้บริการชั่วคราว ในตอนนี้ ผู้ใช้ควรมีสิทธิ์เข้าถึงการสมัครใช้บริการจนถึงวันที่ต่ออายุครั้งถัดไป และทรัพยากรการสมัครใช้บริการจะมี autoRenewEnabled = true ค่าของช่อง subscriptionState คือ SUBSCRIPTION_STATE_ACTIVE ณ จุดนี้

ระบบจะส่งข้อความ SubscriptionNotification ที่มีประเภท SUBSCRIPTION_PAUSED เมื่อการหยุดชั่วคราวมีผล เมื่อเกิดกรณีนี้ ผู้ใช้ควรเสียสิทธิ์เข้าถึงการสมัครใช้บริการ และทรัพยากรการสมัครใช้บริการจะมี autoRenewEnabled = true และฟิลด์ subscriptionState จะตั้งค่าเป็น SUBSCRIPTION_STATE_PAUSED คุณสามารถดูวันที่คาดว่าการสมัครใช้บริการจะต่ออายุอีกครั้งได้โดยการตรวจสอบออบเจ็กต์ PausedStateContext

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

ระบบจะส่งข้อความ SubscriptionNotification ที่มีประเภท SUBSCRIPTION_ON_HOLD หากการชำระเงินไม่สำเร็จขณะพยายามกลับมาสมัครใช้บริการอีกครั้งหลังจากหยุดชั่วคราว

ทั้ง 2 สถานการณ์ควรได้รับการจัดการตามที่อธิบายไว้ในการระงับบัญชี

สมัครอีกครั้ง

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

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

แม้ว่าปุ่มจะมีป้ายกำกับเป็นสมัครใช้บริการอีกครั้งเสมอ แต่ฟังก์ชันการทำงานจะขึ้นอยู่กับ สถานะการสมัครใช้บริการ

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

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

กู้คืนก่อนหมดอายุ

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

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

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": next_renewal_date
      ...
    }
  ],
}

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

สมัครใช้บริการอีกครั้งหลังจากหมดอายุ

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

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

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

  1. เรียกใช้ purchases.subscriptionsv2.get ด้วยโทเค็นการซื้อใหม่จาก RTDN การตอบกลับสําหรับการซื้อนอกแอปประเภทนี้จะมีช่อง outOfAppPurchaseContext ซึ่งแสดงเฉพาะสําหรับการซื้อเพื่อสมัครอีกครั้งที่ยังไม่ได้ตอบรับ ช่องนี้จะแสดงข้อมูลต่อไปนี้

    • expiredExternalAccountIdentifiers: ออบเจ็กต์ ExternalAccountIdentifiers ที่มีช่อง obfuscatedAccountId และ obfuscatedProfileId ที่กำหนดค่าไว้สำหรับการสมัครใช้บริการที่หมดอายุก่อนหน้า หากมีการตั้งค่าไว้
    • expiredPurchaseToken: โทเค็นการซื้อของการสมัครใช้บริการที่หมดอายุล่าสุด

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

  2. โทรหา purchases.subscriptions.acknowledge เพื่อรับทราบการซื้อ

    • คุณสามารถส่ง obfuscatedAccountId และ obfuscatedProfileId ของผู้ใช้ได้หากกำหนดค่าไว้โดยใช้ setObfuscatedAccountId และ setObfuscatedProfileId ในระหว่างโฟลว์การเรียกเก็บเงินสำหรับการซื้อในแอป

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

การอัปเกรด ดาวน์เกรด และการสมัครอีกครั้ง

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

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

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

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

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

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  "linkedPurchaseToken": old_purchase_token,
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": next_renewal_date,
      "autoRenewingPlan": {
        "autoRenewEnabled": true
      }
    }
  ],
}

การเปลี่ยนแปลงราคา

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

เมื่อมีการเพิ่มการเปลี่ยนแปลงราคาและสำหรับการอัปเดตสถานะการเปลี่ยนแปลงราคา คุณจะได้รับ SUBSCRIPTION_PRICE_CHANGE_UPDATED RTDN คุณสามารถค้นหาปลายทาง purchases.subscriptionsv2.get เพื่อรับทรัพยากรการสมัครใช้บริการซึ่งจะมีรายละเอียดการเปลี่ยนแปลงราคาสำหรับแต่ละรายการในการสมัครใช้บริการ

เมื่อมีการใช้การเปลี่ยนแปลงราคากับสมาชิกเดิมในรูปแบบการเลือกใช้ คุณจะได้รับ RTDN หากผู้ใช้ดำเนินการเพื่อยืนยันหรือปฏิเสธราคาใหม่

จัดการการยืนยันของผู้ใช้เกี่ยวกับการเปลี่ยนแปลงราคาแบบเลือกรับ

เมื่อผู้ใช้ยอมรับการขึ้นราคาการสมัครใช้บริการ คุณจะได้รับข้อความ SubscriptionNotification ที่มีประเภท SUBSCRIPTION_PRICE_CHANGE_UPDATED

จัดการการต่ออายุหลังจากใช้การเปลี่ยนแปลงราคา

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

จัดการกรณีที่ผู้ใช้ไม่ยอมรับการขึ้นราคาแบบขอให้ผู้ใช้ยินยอม

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

ผู้ใช้ยังสามารถยกเลิกการสมัครใช้บริการสำหรับการขึ้นราคาแบบไม่ได้ขอให้ผู้ใช้ยินยอมได้ด้วยโดยใช้กลไกเดียวกัน

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

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

เมื่อระยะเวลาความยินยอมเริ่มต้นขึ้นหรือผู้ใช้ให้ความยินยอมแล้ว คุณจะได้รับข้อความ SubscriptionNotification ที่มีประเภท SUBSCRIPTION_PRICE_STEP_UP_CONSENT_UPDATED

ความแตกต่างระหว่างการเพิ่มราคาและการเปลี่ยนแปลงราคา

price step-up หมายถึงการเพิ่มราคาการสมัครใช้บริการเนื่องจากการเปลี่ยนจากช่วงข้อเสนอหนึ่งไปยังอีกช่วงหนึ่ง เช่น การสมัครใช้บริการที่เปลี่ยนจากช่วงทดลองใช้ฟรีเป็นราคาปกติ คุณใช้ฟิลด์ offerPhase ในทรัพยากรการสมัครใช้บริการเพื่อระบุระยะปัจจุบัน ของการสมัครใช้บริการได้

อย่างไรก็ตาม price change หมายถึงการอัปเดตราคาที่คุณ (นักพัฒนาแอป) เป็นผู้เริ่ม สำหรับราคาแพ็กเกจเริ่มต้นของการสมัครใช้บริการ เช่น การขึ้นราคาแบบขอให้ผู้ใช้ยินยอมหรือการขึ้นราคาแบบไม่ได้ขอให้ผู้ใช้ยินยอม

จัดการวงจรของแพ็กเกจแบบชำระเงินล่วงหน้า

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

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

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

ระบบจะส่งข้อความ SubscriptionNotification ที่มีประเภท SUBSCRIPTION_PURCHASED ไปยังไคลเอ็นต์ RTDN ทุกครั้งที่มีการซื้อการสมัครใช้บริการแพ็กเกจแบบชำระเงินล่วงหน้า ซึ่งรวมถึงการเติมเงินทุกครั้ง เรียกใช้เมธอด purchases.subscriptionsv2.get เพื่อตรวจสอบสถานะการสมัครใช้บริการแพ็กเกจแบบชำระเงินล่วงหน้าล่าสุด

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

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

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  "startTime": "2022-04-22T18:39:58.270Z",
  "regionCode": "US",
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  "latestOrderId": "GPA.3333-4137-0319-36762",
  "acknowledgementState": "ACKNOWLEDGEMENT_STATE_ACKNOWLEDGED",
  "lineItems": [
    {
      "productId": "prepaid_plan01",
      "expiryTime": expiry_date,
      "prepaidPlan": {
        "allowExtendAfterTime": timestamp_after_which_topups_are_allowed
      }
    }
  ]
}

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

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

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

ฟิลด์ 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 จาก เวอร์ชันก่อนหน้า