# Handle purchase

ก่อนจะไปลงรายละเอียดกันจะอ้างอิงถึงบทความก่อนหน้านี้ก่อน 👉 [products-subscriptions](https://khanate.gitbook.io/blog/learn/google-in-app/products-subscriptions "mention") จะเห็นเรา sku ที่เรา setup ไวที่ google ได้นั้นจะมี 2 แบบ (Product/Subscription) การ handle จะแตกต่างกันนะครับ

### SKU Product[​](https://khanate.netlify.app/docs/google-inapp/handle-purchase#sku-product) <a href="#sku-product" id="sku-product"></a>

เนื่องจาก SKU แบบนี้นั้น payment method ที่ Google แสดงให้ user เลือกใช้ได้นั้นมี 2 แบบด้วยกันคือ

* Purchase แบบทราบผลทันที
* Pending purchase แบบทราบผลภายหลัง

### **Purchase แบบทราบผลทันที**[**​**](https://khanate.netlify.app/docs/google-inapp/handle-purchase#purchase-%E0%B9%81%E0%B8%9A%E0%B8%9A%E0%B8%97%E0%B8%A3%E0%B8%B2%E0%B8%9A%E0%B8%9C%E0%B8%A5%E0%B8%97%E0%B8%B1%E0%B8%99%E0%B8%97%E0%B8%B5)

* แบบนี้เนื่องจาก App เราจะทราบผลจากการที่ google เก็บเงินกับ user เลยทันทีดังนั้นแบบนี้เป็น case ที่เราสามารถ handle ได้ง่ายสุดครับ ก็ไม่มีอะไรมากหากเราได้รับ callback จาก google แล้วว่า transaction นั้น purchased เราสามารถให้ App เรา call API backend เพื่อ update entitlement ได้เลยทันที ผมสรุปเป็น sequence diagram มาให้เห็นภาพ

<figure><img src="https://res.cloudinary.com/nameless/image/upload/v1650305330/blog/2022/google-inapp/handle-purchase/inapp-purchased.svg" alt="google-inapp handle inapp purchase"><figcaption></figcaption></figure>

### **Pending purchase แบบทราบผลภายหลัง**[**​**](https://khanate.netlify.app/docs/google-inapp/handle-purchase#pending-purchase-%E0%B9%81%E0%B8%9A%E0%B8%9A%E0%B8%97%E0%B8%A3%E0%B8%B2%E0%B8%9A%E0%B8%9C%E0%B8%A5%E0%B8%A0%E0%B8%B2%E0%B8%A2%E0%B8%AB%E0%B8%A5%E0%B8%B1%E0%B8%87)

* กรณีนี้จะมีความยุ่งยากกว่าเยอะครับ เนื่องจาก google จะส่งเป็น QR promptpay กลับมาให้ User แล้วจะ callback transaction กลับมาให้ App เราเป็น status pending หลังจากนั้นก็ขึ้นอยู่กับ User แล้วละว่าเค้าจะไปจ่ายเมื่อไหร่

  ดังนั้นเราต้อง handle event ต่างๆ ที่อาจจะเกิดขึ้นได้ เพราะการจ่ายด้วย QR นั้น User จำเป็นต้อง Switch app เพื่อไปเปิด App ธนาคารในการจ่าย มีโอกาสที่จ่ายแล้วจะไม่กลับมาที่ App เราทันทีเลยก็ได้ หรือ Kill App เราทิ้งไป หรืออาจจะไม่เอาไปจ่ายเลยก็ได้

  ลองดู sequence diagram เพื่อความเข้าใจมากขึ้น

**NOTE**

ในกรณีนี้หากรายการยังค้างเป็น pending ไวอยู่ google จะไม่อนุญาตให้ซื้อ SKU เดิมซ้ำไปได้นะครับ ต้องรอจนกว่า User จะจ่ายหรือ User ไป Cancel รายการออก หรือรอให้มันถึงเวลา Expired ไปเอง ผมไม่รู้เวลาที่แน่นอนนะครับ เวลาที่ใกล้จะหมดเวลา google จะส่ง push notification ไปหา User เองด้วยว่ารายการที่ pending อยู่นั้นนะจะ expired เมื่อไหร่

<figure><img src="https://res.cloudinary.com/nameless/image/upload/v1650305330/blog/2022/google-inapp/handle-purchase/inapp-pending-purchased.svg" alt="google-inapp handle inapp pending purchase"><figcaption></figcaption></figure>

* จาก sequence จะเห็นว่า google จะ notify มาหาที่ Backend เราผ่าน Google Pub/Sub ด้วยนะครับ ทำให้เราสามารถ handle ในเรื่องการ Allow entitlement ให้กับ User ได้ 2 ส่วนเลย

  ในเรื่องที่ google notify มาหา Backend เรานั้นผมจะลงรายละเอียดอีกทีในหัวข้อ [Realtime Notification](https://khanate.gitbook.io/blog/learn/google-in-app/realtime-notification) อีกทีครับ เพราะมีรายละเอียดที่ต้องเล่าเยอะพอสมควรเลย

### SKU Subscription[​](https://khanate.netlify.app/docs/google-inapp/handle-purchase#sku-subscription) <a href="#sku-subscription" id="sku-subscription"></a>

* สำหรับ SKU แบบนี้นั้น google ไม่อนุญาตให้จ่ายด้วย payment method แบบ pending purchase ได้นะครับ(สบายไป) เนื่องจาก model subscription นั้นมีความต้องการเก็บเงินต่อเนื่อง(Auto Recurring) ใน next bill หากปล่อยให้ User จ่ายด้วย QR promptpay ได้ละก็ next bill จะเก็บเงินยังไงละ แต่เราจะต้องปวดหัวในส่วนที่ Backend เราจะต้อง handle event ต่างๆ ที่จะเกิดขึ้นได้
* Event ที่เกิดขึ้นพวกนี้ไม่ได้เกิดจากการที่ User มาทำอะไรบน App เรา แต่เป็น System google ทำงาน Auto แล้ว Tigger มาบอกเรา หรือ User ไปเข้าหน้า Subscription management ของ Google โดยตรง
  * System ก็อย่างเช่น Renew, Expired
  * User action ก็อย่างเช่น Canceled หรือ Resubscribe
* ดังนั้นเมื่อได้รับ Trigger แล้วเราก็ต้อง Action ให้ถูกตามที่ควรจะเป็น เพื่อให้ User ไม่พบปัญหาใดๆ ครับ ลองดู sequence diagram เพื่อความเข้าใจมากขึ้น

<figure><img src="https://res.cloudinary.com/nameless/image/upload/v1650305330/blog/2022/google-inapp/handle-purchase/sub-purchased.svg" alt="google-inapp handle subscription"><figcaption></figcaption></figure>

* จาก sequence จะเห็นว่าผมแยกเป็น 2 ส่วนใหญ่ๆ คือ First time purchase และ Subscription process และจะเห็นว่าใน Section Subscription process นั้นจะทำให้ Profile ของ User เรานั้นเปลี่ยนไป เมื่อได้รับ Notify ที่ Google ส่งมาบอกเราผ่าน Google Pub/Sub

  ในเรื่องที่ google notify มาหา Backend เรานั้นผมจะลงรายละเอียดอีกทีในหัวข้อ [Realtime Notification](https://khanate.gitbook.io/blog/learn/google-in-app/realtime-notification) อีกทีครับ เพราะมีรายละเอียดที่ต้องเล่าเยอะพอสมควรเลย

### จากทั้งหมดสรุปได้ว่า[​](https://khanate.netlify.app/docs/google-inapp/handle-purchase#%E0%B8%88%E0%B8%B2%E0%B8%81%E0%B8%97%E0%B8%B1%E0%B9%89%E0%B8%87%E0%B8%AB%E0%B8%A1%E0%B8%94%E0%B8%AA%E0%B8%A3%E0%B8%B8%E0%B8%9B%E0%B9%84%E0%B8%94%E0%B9%89%E0%B8%A7%E0%B9%88%E0%B8%B2) <a href="#undefined" id="undefined"></a>

การ Handle Purchase เราควรแยกตามประเภท SKU โดยที่ SKU Product นั้นจะต้องระวังเป็นพิเศษกรณี User เลือกจ่ายด้วย Pending purchase(QR Promptpay) ส่วน SKU Subscription นั้นสิ่งที่ต้อง Handle เยอะเป็นพิเศษเลยคือ Backend ของเราเอง จาก Sequence ทั้ง 3 แบบที่ผมวาดขึ้นมาเป็นตัวอย่างให้ดู จะได้เป็น Architecture แบบคราวๆ ได้ดังนี้ครับ

<figure><img src="https://res.cloudinary.com/nameless/image/upload/w_700/v1650305330/blog/2022/google-inapp/handle-purchase/google-inapp-highlevel.png" alt="google-inapp highlevel"><figcaption><p>example app+backend to support google inapp feature</p></figcaption></figure>

ก็จบไปอีก 1 หัวข้อใหญ่ๆ ภายใต้หัวข้อ Google In-App นะครับ

**Reference**[**​**](https://khanate.netlify.app/docs/google-inapp/handle-purchase#reference)

* <https://developer.android.com/google/play/billing/subscriptions>
* <https://developer.android.com/google/play/billing/integrate>
