Products/Subscriptions

ประเภทของ SKU

Stock Keeping Unit หรือ SKU คือ รหัสสินค้าที่มีการจำแนกประเภทสินค้าแต่ละสินค้าที่เรามีครับ เช่น อาวุธนั้นๆ หรือ package นั้นๆ

ของที่เราขายอยู่ภายใน App เราไม่ว่าจะเป็น item หรือ package ต่างๆ เราแบ่งได้เป็น 2 ประเภทด้วยครับ

  1. ซื้อเป็นครั้งๆ และสามารถซื้อซ้ำๆ ได้ แบบนี้ Google จะเรียนว่า In-app products

  2. สมัครบริการและจ่ายเงินต่อเนื่องอาจจะเป็น ต่อเดือน ต่อสัปดาห์ หากยังไม่ยกเลิกไม่ควรซื้อซ้ำได้ แบบนี้ Google จะเรียกว่า Subscriptions

ไม่ว่าจะเป็นแบบไหนของที่เราขายอยู่ใน App จะต้อง Setup อยู่บน Google Play Console ด้วย โดยที่แต่ละ SKU จะอยู่ภายใต้ App package name เช่นเรามี App 2 version สำหรับ Mobile และ Tablet แบบนี้ เราจะต้องเข้าไป Setup SKU ทั้ง 2 package name เลยครับ

In-app products

ในการ Setup SKU ประเภทนี้ทำได้โดยเข้าไปที่ Google Play Console แล้วเลือก package name ของ App ที่ต้องการจะ Setup SKU จากนั้นเลือก menu Products -> In-app products และกด Create product

รายละเอียดที่เราจะต้องกำหนดจะมี

  • Product ID : ต้องเป็น id ของ SKU ต้องเป็น unique id และต้องเป็น lower case ครับ

  • Product details

    • Name : เป็นชื่อของ SKU ที่จะแสดงที่หน้า Google In-app ให้ user เห็นด้วยครับ

    • Description : เป็นรายละเอียดของ SKU ที่จะแสดงที่หน้า Google In-app ให้ user เห็นด้วยครับ

  • Price

    • Default price : เป็นราคาที่จะเรียกเก็บเงิน user ครับ ราคาต่ำสุดที่กำหนดได้ตอนนี้อยู่ที่ 7 บาทครับ (จริงๆ มีวิธีการทำ pricing template ด้วย ไวมีโอกาสจะมาเล่าให้ฟังครับ)

    • Multi-quantity : อันนี้เป็น checkbox ให้กำหนดว่าใน 1 transaction ที่ user submit มานั้นจะมีจำนวนมากกว่า 1 หรือไหม (ส่วนนี้ผมยังไม่เคยลองครับ)

  • Tax and compliance : นั้นเป็นเรื่องของภาษีซึ่งเป็น optional

google play console - create product - in-app

Subscriptions

ในการ Setup SKU ประเภทนี้ทำได้โดยเข้าไปที่ Google Play Console แล้วเลือก package name ของ App ที่ต้องการจะ Setup SKU จากนั้นเลือก menu Products -> Subscriptions และกด Create subscription

รายละเอียดที่เราจะต้องกำหนดจะมี

  • Product ID : ต้องเป็น id ของ SKU ต้องเป็น unique id และต้องเป็น lower case ครับ

  • Subscription details

    • Name : เป็นชื่อของ SKU ที่จะแสดงที่หน้า Google In-app ให้ user เห็นด้วยครับ

    • Description : เป็นรายละเอียดของ SKU ที่จะแสดงที่หน้า Google In-app ให้ user เห็นด้วยครับ

    • Benefits : เป็นรายละเอียดเพิ่มเติมสำหรับบอก user ครับ เป็น optional

  • Price

    • Billing period : เป็นตัวกำหนดรอบบิลครับ เมื่อครบกำหนดตามที่เรากำหนดแล้วระบบจะเรียกเก็บเงินลูกค้าใหม่ให้ทันที(recurring charge)

    • Default price : เป็นราคาที่จะเรียกเก็บเงิน user ครับ ราคาต่ำสุดที่กำหนดได้ตอนนี้อยู่ที่ 7 บาทครับ (จริงๆ มีวิธีการทำ pricing template ด้วย ไวมีโอกาสจะมาเล่าให้ฟังครับ)

  • Subscription options

    • Free trial : เป็นตัวระบุสำหรับให้ user สามารถทดสอบได้ กรณีกำหนดเป็น enabled จะมีให้เรากำหนดเพิ่มเติมว่าจะให้ trial จำนวนกี่วัน หลังจากครบกำหนดวัน trial แล้ว Google จะเรียกเก็บเงิน user ให้ทันที (ต่ำสุดได้แค่ 3 วันครับ)

    • Introductory price : เป็นตัวกำหนดราคาเริ่มต้นครับ มีให้กำหนด 3 option ด้วยกัน

      • None : ก็คือไม่กำหนดครับ Subscribe ครั้งแรกและการเรียกเก็บเงินครั้งต่อๆ ไปก็จะเรียกเก็บเท่ากันหมด

      • Single Payment : เมื่อ Subscribe ครั้งแรกและอยู่ในช่วงเวลาที่กำหนด(Duration - Days/Weeks/Months) จะเรียกเก็บเงินตามที่กำหนด เมื่อเลยช่วงเวลานี้ไปแล้วจะเรียกเก็บเงินตามจริงครับ

      • Recurring Payment : เมื่อ Subscribe ครั้งแรกละอยู่ในรอบบิลตามจำนวนปีที่กำหนด(Billing periods yearly) จะเรียกเก็บเงินตามที่กำหนด เมื่อเลยช่วงปีที่กำหนดแล้วจะเรียกเก็บเงินตามจริงครับ

    • Grace period : เป็นตัวกำหนดว่าจะมีช่วงเวลาผ่อนผันให้กับ user กรณีเรียกเก็บเงินไม่สำเร็จหรือเปล่า เช่นกรณี Subscribe ไปแล้วเข้าสู่รอบบิลที่ 2 เมื่อระบบทำการต่ออายุให้(Renew) แต่ไม่สามารถเรียกเก็บเงินจาก user ได้ จะยังคงยอมให้ user มีสิทธิ์มาแก้ไขช่องทางชำระเงิน(Payment method) เพื่อให้เรียกเก็บเงินได้อีกครั้ง ตามวันที่กำหนด

    • Resubscribe : หลังจาก user ได้ cancel subscribe ไปแล้ว จะให้ user สามารถ subscribe ได้เองโดยตรงผ่าน Play Store หรือไม

  • Tax and compliance นั้นเป็นเรื่องของภาษีซึ่งเป็น optional

google play console - create product - subscription
google play console - create product - subscription

Integration

Google Play's billing system นั้นเป็นระบบ billing ที่ google จะค่อยดูแลตั้งแต่ในส่วนการชำระเงินครั้งแรกไปจนถึงการเรียกเก็บเงินในครั้งต่อๆ สำหรับ Model Subscription

สิ่งที่เราจะต้อง Integrate เพื่อให้ cover ทั้งหมดนั้นจะมีทั้งในส่วนของ Android app และในส่วนของ Backend ของ Android app นั้นๆ

หัวข้อนี้จะพูดถึงแค่ในส่วน Android app ก่อนนะครับ ในส่วนของ Backend นั้นจะเล่าต่อในหัวข้อถัดไป(Realtime Notification) นะครับ

ผมคงไม่ได้พาลง coding ที่ละ step นะครับ แต่จะเล่าถึง flow หลักๆ ที่ต้องมีและต้อง handle ครับ หากต้องการลง detail ระดับ coding เลยผมแนะนำท google official document เลยครับ

📖 https://developer.android.com/google/play/billing/integrate

Life of a purchase

เริ่มด้วยวงจรชีวิตมันก่อนเลยครับเป็นสิ่งที่ Android app ตอน implement ต้องเจอแน่นอน

  • แสดง SKU ที่ User สามารถ ซื้อหรือสมัครได้

  • แสดง Google dialog สำหรับให้ User ชำระเงิน

  • Verify รายการที่ซื้อด้วย Backend ของระบบเราเอง

  • ให้สิทธิ์ User ได้รับของหรือเนื้อหาที่ User ต้องได้รับ

กรณีของ SKU ประเภท Subscriptions จะมี state ที่จะเกิดขึ้นได้เพิ่มเติมเนื่องจากจะมีเรียกเก็บเงินในรอบบิลถัดไป(Renew) เรื่อยๆ จนกว่า User จะทำการ Cancel ด้วย

  • Active: state ปกติ user สามารถเข้าถึงรายการที่สมัครได้ปกติ

  • Cancelled: state user ได้ทำการ cancelled แล้วผ่าน Google Play Store แต่ user ยังสามารถเข้าถึงเนื้อหาที่สมัครได้จนกว่าจะหมดอายุ

  • In grace period: state ที่เกิดหลังจากเรียกเก็บเงินครั้งที่ 2 เป็นต้นไป(Renew) แต่ Google ไม่สามารถเก็บเงินได้ User ยังสามารถเข้าถึงเนื้อหาได้ และสามารถแก้ไขช่องทางชำระเงินได้ เพื่อให้ Google ได้เรียกเก็บเงินซ้ำอีกครั้ง (อย่างที่เล่าไปตอนต้น ส่วนนี้เราต้อง enabled ตอนที่ setup SKU ด้วยนะครับ)

  • On hold: state ที่เกิดหลังจากเรียกเก็บเงินครั้งที่ 2 เป็นต้นไป(Renew) แต่ Google ไม่สามารถเก็บเงินได้ User ไม่สามารถเข้าถึงเนื้อหาได้ และสามารถแก้ไขช่องทางชำระเงินได้ เพื่อให้ Google ได้เรียกเก็บเงินซ้ำอีกครั้ง

  • Paused: state ที่ user ต้องการให้ระบบ recurring charge หยุดเรียกเงินชั่วคราว User ไม่สามารถเข้าถึงเนื้อหาได้ จนกว่าจะหมดระยะเวลา Paused(featrue นี้หากไม่ต้องการ เราสามารถ configuare ที่ google play console เพื่อ disable ได้ครับ)

  • Expired: state ที่เกิดหลังจาก user ได้ cancelled แล้ว ไม่สามารถเข้าถึงเนื้อหาที่สมัครได้แล้วเพราะหมดอายุแล้ว

Connect to Google Play

Android app จะต้อง Connect กับ Google Play Billing Lib ที่ Google ได้เตรียมไวให้ เมื่อถึงกระบวนการที่จะต้องให้ User ชำระเงินแล้ว จะต้อง Query SKU detail เพื่อ validate state ของ SKU นั้นๆ ว่ามีอยู่ state ไหน เช่นชำระเงินแล้วนะ, รอชำระเงิน รวมถึงเราจะต้องเอา detail ของ SKU นั้นๆ ไปใช้ใน step ต่อไปด้วยครับ

Launch the purchase flow

หากผ่าน Step validate ต่างๆ มาหมดแล้ว ก็จะต้องแสดง Dialog Google In-app ของ Google ขึ้นมา เพื่อให้ User กำหนด Payment method หรือ เลือก Payment Method ที่ต้องการใช้ชำระเงิน

หากผ่าน Step นี้แล้ว App จะได้ Callback กลับมาพร้อมกับ PurchaseToken ซึ่ง PurchaseToken นี้ถือว่าเป็น Value ที่สำคัญมากๆ เพราะคือ Primary Key เลยครับ

  • กรณี One-time product

    • PurchaseToken จะเปลี่ยนใหม่ทุกครั้งที่ทำการซื้อใหม่

  • กรณี Subscription

    • PurchaseToken จะเปลี่ยนต่อเมื่อซื้อใหม่เท่านั้น เท่ากับว่าทุกครั้งที่เกิดการ renew เราสามารถใช้ purchase token นี้ในการอ้างอิงถึง account ในระบบเราได้ว่าต้องต่ออายุในการเข้าถึงเนื้อหานั้นๆ ที่ account ไหน

google android app integration dialog google in-app

Handling purchases made outside your app

สิ่งที่อยากจะบอกไว้ เพราะอาจจะคิดไม่ถึง

กรณี User ได้ Subscribe ครั้งแรกบน App เราไปแล้ว หากเรา Enabled "Resubscribe" ของ SKU นั้นตอน Setup จะทำให้ User สามารถ Subscribe ได้ใหม่อีกครั้งโดยตรงผ่าน Google Play Store ครับ ใช่ครับ ผ่าน Google Play Store นะครับ ไม่ได้ผ่าน App เรา

ดังนั้นการ Implement ทั้งในส่วน Android app และ Backend นั้นเราต้องคำนึงถึงเรื่องนี้ไวด้วยครับ

Reference

Last updated

Was this helpful?