เทคโนโลยี
BillingMeld: ทำไมเซิร์ฟเวอร์ควรตรวจสอบการซื้อ ไม่ใช่แค่แอปพลิเคชัน
BillingMeld กลายเป็นแหล่งข้อมูลหลักเกี่ยวกับการซื้อและสมัครสมาชิก มันตรวจสอบธุรกรรมผ่าน App Store และ Google Play ติดตามการเปลี่ยนแปลงสถานะ และบริการที่เชื่อมต่อทำงานเฉพาะกับสถานะที่ได้รับการยืนยันแล้วเท่านั้น
การซื้อภายในแอปพลิเคชันบนมือถือดูเหมือนเป็นเรื่องง่ายสำหรับผู้ใช้ แค่กดปุ่ม ยืนยันการชำระเงิน เข้าถึงฟีเจอร์หรือการสมัครสมาชิก — และคาดหวังให้ทุกอย่างทำงานโดยอัตโนมัติ
สำหรับนักพัฒนากระบวนการนี้ซับซ้อนกว่ามาก ต้องยืนยันการซื้อเอง คำนึงถึงการต่ออายุ การหมดอายุของการสมัคร การคืนเงิน การอัปเดตสถานะธุรกรรม การเปลี่ยนอุปกรณ์ และความแตกต่างระหว่างร้านค้า Apple กับ Google
ปัญหาหลักเกิดขึ้นเมื่อเซิร์ฟเวอร์เริ่มเชื่อถือข้อมูลจากแอปพลิเคชันของลูกค้าเป็นแหล่งความจริง
หากแอปแจ้งว่า: «ซื้อเสร็จสิ้น» เซิร์ฟเวอร์จะเปิดการเข้าถึงและอิงจากข้อมูลสถานะเดียวกันที่ได้รับครั้งแรก แต่กระบวนการชีวิตของการซื้อยังไม่สิ้นสุด
การสมัครอาจต่ออายุ การต่ออายุอัตโนมัติอาจถูกปิด การชำระเงินอาจถูกคืนเงิน หรือธุรกรรมสามารถถูกยกเลิกโดยร้านค้าเอง
ดังนั้นใน BillingMeld การยืนยันการซื้อไม่ใช่โดยแอป แต่เป็นโดยเซิร์ฟเวอร์
ลูกค้ารายงาน แต่ไม่ได้ตัดสินใจ
ในสถาปัตยกรรมของ BillingMeld แอปพลิเคชันบนมือถือไม่ใช่แหล่งข้อมูลหลักเกี่ยวกับการซื้อ
ลูกค้าสามารถส่งข้อมูลเกี่ยวกับธุรกรรมที่เกิดขึ้น แต่เป็นเพียงฐานสำหรับการตรวจสอบเท่านั้น ส่วนตัดสินใจสุดท้ายเป็นของส่วนเซิร์ฟเวอร์ BillingMeld ซึ่งตรวจสอบข้อมูลผ่านโครงสร้างพื้นฐานของ Apple หรือ Google
นี่คือความแตกต่างเชิงหลัก
แอปในโทรศัพท์อาจทำงานกับข้อมูลเก่าไม่ได้รับการอัปเดตทันเวลา หรือส่งข้อมูลที่ไม็ตรงกับสภาวะปัจจุบันของการซื้อ
นอกจากนี้ ลูกค้าไม่ควรมีสิทธิ์ในการตัดสินใจเองว่าผู้ใช้งานสมควรได้รับการเข้าถึงแบบพชำระแล้วหรือไม่
BillingMeld ตรวจสอบเช่น:
การซื้อดังกล่าวยังมีอยู่จริงหรือไม่;
เกี่ยวข้องกับแอปหรือผลิตภัณฑ์ที่ถูกต้องหรือไม่;
ระยะเวลาที่ชำระไว้ยังมีผลใช้ได้หรือไม่;
ต่ออายุล่าสุดเกิดขึ้นหรือไม่;
การต่ออายุอัตโนมัติถูกปิดใช้งานหรือไม่;
มีการขอคืนเงินหรือไม่;
ธุรกรรมถูกยกเลิกหรือไม่;
ระยะเวลาที่ชำระไว้หมดอายุหรือไม่
ดังนั้น ข้อความจากลูกค้าจึงไม่ใช่หลักฐานของการซื้อ แต่เป็นเหตุผลในการตรวจสอบสถานะที่แท้จริง
แหล่งข้อมูลเดียวของความจริงสำหรับเซิร์ฟเวอร์
บริการที่เชื่อมต่อไม่จำเป็นต้องดำเนินการรวมระบบเต็มรูปแบบพร้อมกันกับ Apple และ Google
พวกเขาสามารถอ้างอิงไปยัง BillingMeld พร้อมรับสถานะการซื้อที่เป็นปกติแล้ว
เช่น การเข้าถึงยังใช้งานได้ อยู่ระยะเวลาที่ชำระหมดแล้ว การต่ออายุใหม่ได้รับการยืนยัน การต่ออายุอัตโนมัติถูกปิด หรือลงทะเบียนการยกเลิกการซื้อ
นี่ช่วยให้แบ่งความรับผิดชอบได้อย่างชัดเจน
Apple และ Google เป็นแหล่งข้อมูลสถานะของธุรกรรมร้านค้า BillingMeld จะตรวจสอบข้อมูลเหล่านี้ ปรับให้เป็นโมเดลเดียวกัน และเก็บสถานะปัจจุบันไว้ ซึ่งระบบปลายทางจะทำการตัดสินใจเข้าถึงบนฐานข้อมูลสถานะของ BillingMeld
สำหรับเซิร์ฟเวอร์ของผลิตภัณฑ์ นี่คือข้อตกลงเดียวแทนการผนึกระบบหลายแห่ง
ไม่จำเป็นต้องดำเนินการตามกฎของ App Store หรือ Google Play แยกกันในแต่ละบริการ แล้วพยายามปรับให้เข้ากันในรูปแบบ สถานะ หรือเหตุการณ์ต่าง ๆ
ทำไมไม่ควรพึ่งพาแค่ลูกค้าเต็มที่
แอปพลิเคชันบนอุปกรณ์ทำงานบนเครื่องของผู้ใช้
มันสามารถปิดได้ รีสตาร์ทได้ กู้คืนจากแบ็คอัป อัปเดตในภายหลัง หรือรันบนอุปกรณ์อื่นได้ ช่วงเวลาหนึ่งอาจทำงานกับข้อมูลเก่า หรือไม่ได้รับเหตุการณ์ที่เกิดขึ้นหลังการซื้อเดิม
โดยไม่จำเป็นต้องมีการแทรกแซงจากผู้ใช้ ก็ยังทำให้ลูกค้าเป็นแหล่งข้อมูลสุดท้ายที่ไม่น่าเชื่อถือ
ตัวอย่างเช่น ผู้ใช้ทำการสมัครและรับการเข้าถึง และต่อมาอาจมีการคืนเงินหรือร้านค้าระงับธุรกรรม
หากเซิร์ฟเวอร์รับรู้แค่ข้อความเริ่มต้นจากลูกค้า ก็จะยังคงคิดว่าการซื้อยังคงใช้งานได้อยู่
อีกกรณีหนึ่ง ผู้ใช้สามารถปิดใช้งานการต่ออายุอัตโนมัติ ขณะที่ระยะเวลาที่ชำระไว้ก็ยังคงต้องใช้งานได้จนกว่าจะสิ้นสุด
หากระบบทำงานด้วยสถานะง่าย ๆ เช่น “สมัครสมาชิกมี / ไม่มี” ก็อาจปล่อยให้เข้าใช้งานผิดพลาดหรือปิดก่อนเวลาที่ควร
BillingMeld สร้างมาโดยใช้แนวคิดที่ต่างออกไป: ลูกค้าไม่ยืนยันสิทธิ์ของตนเอง แต่เป็นการรายงานเหตุการณ์ และเซิร์ฟเวอร์เป็นผู้กำหนดสถานะของการซื้อที่แท้จริง
การซื้อไม่ใช่เหตุการณ์เดียว
ข้อผิดพลาดที่สำคัญในสถาปัตยกรรมการชำระเงินคือการมองว่าการซื้อเป็นเหตุการณ์เดียว
แท้จริงแล้วมันมีวงจรชีวิตของตัวเอง
ก่อนอื่นมีการดำเนินการซื้อ จากนั้นร้านค้าจะยืนยัน แต่ละซื้อระยะเวลาที่ชำระไว้เริ่มต้นขึ้น และอาจมีการต่ออายุครั้งต่อไป
ผู้ใช้สามารถปิดการต่ออายุอัตโนมัติ แต่อาจยังคงใช้บริการในช่วงเวลาที่ชำระแล้วได้
การชำระครั้งต่อไปอาจล้มเหลว หรือเกิดการคืนเงิน การซื้ออาจถูกยกเลิกในบางกรณี
ดังนั้น การรู้แค่ว่าสนับสนุนให้ “ซื้อครั้งเดียวก็พอ” ก็ไม่เพียงพออีกต่อไป
สำคัญคือเซิร์ฟเวอร์จำเป็นต้องเข้าใจว่าสถานะของการซื้อในปัจจุบันเป็นอย่างไร
การคืนเงินเป็นสิ่งที่ตรวจจับได้เสมอ
โดยเฉพาะเมื่อเกิดการคืนเงินหรือยกเลิกธุรกรรมแล้ว ข้อมูลจะมีการเปลี่ยนแปลงและต้องอัปเดตในระบบ
การซื้ออาจเคยถูกต้องและสมบูรณ์ แต่ภายหลังสถานะเปลี่ยนแปลง หาก BillingMeld ได้รับข้อมูลอัปเดต ก็จะปรับสถานะตาม และหากจำเป็นตรวจข้อมูลกับร้านค้าอีกครั้ง
ส่วนบริการที่เชื่อมต่อแล้วจะทำงานกับสถานะใหม่ทันที
ด้วยวิธีนี้ แอปพลิเคชันไม่จำเป็นต้องเชื่อในความถูกต้องของข้อมูลการซื้อครั้งเก่า ๆ อีกต่อไป และสามารถอัปเดตสถานะได้อย่างแม่นยำ
การยกเลิกสมัครและการสิ้นสุดการเข้าถึงไม่เท่ากัน
มีความแตกต่างสำคัญระหว่างการยกเลิกการสมัครอัตโนมัติและการสิ้นสุดการเข้าถึง
หากผู้ใช้ปิดการต่ออายุอัตโนมัติ นั่นไม่ได้หมายความว่าการเข้าถึงจะสิ้นสุดทันที
ระยะเวลาที่ชำระไว้ยังคงใช้งานได้จนกว่าจะหมดอายุ
ในกรณีนี้ BillingMeld ควรบันทึกข้อมูลว่า การต่ออายุในอนาคตถูกปิดไปแล้ว แต่ก็ต้องรู้วันหมดอายุในระยะเวลาที่ชำระไว้เช่นกัน
และหลังจากหมดอายุโดยไม่มีการต่ออายุใหม่ การเข้าถึงจะถูกพิจารณาว่าไม่ใช้งานอีกต่อไป
นี่เป็นหนึ่งในเหตุผลว่าทำไมการเก็บเพียงค่า boolean subscription = true สำหรับการชำระเงินปกติจึงไม่เพียงพอ
สถานะของการสมัครมักเกี่ยวข้องกับเวลาและเหตุการณ์ในวงจรชีวิตของมัน
การต่ออายุเป็นการตรวจสอบอีกแบบหนึ่ง
การต่ออายุไม่ได้จบลงแค่การชำระในครั้งแรก
เซิร์ฟเวอร์จำเป็นต้องรู้ว่ามีการต่ออายุในครั้งถัดไปหรือไม่ และมั่นใจว่าสถานะของช่วงเวลาถัดไปได้รับการยืนยันแล้ว
BillingMeld ตรวจสอบการเปลี่ยนแปลงนี้และอัปเดตสถานะของการสมัคร
หากการต่ออายุได้รับการยืนยัน สิทธิเข้าถึงจะดำเนินต่อไป
แต่ถ้าการจ่ายเงินครั้งถัดไปล้มเหลวหรือร้านค้าไม่รับรองระยะเวลาใหม่ ระบบก็ไม่ควรยกเลิกการต่ออายุโดยอัตโนมัติ
สำหรับผู้ใช้ นี่คือแนวทางปฏิบัติที่เป็นธรรมและสมเหตุสมผล: การเข้าถึงควรดำเนินต่อเนื่องตราบใดที่การสมัครสมาชิกยังมีผล
สำหรับนักพัฒนา นี่หมายความว่าไม่ต้องเขียนโลจิกในการต่ออายุซ้ำในแต่ละแอป
ตัวอย่างการทำงานปกติ
ผู้ใช้สมัครสมาชิกในแอปมือถือ
แอปส่งข้อมูลการซื้อและข้อมูลที่จำเป็นไปยัง BillingMeld แต่ข้อความนี้ยังไม่สามารถถือเป็นการยืนยันซื้อที่สมบูรณ์
BillingMeld ตรวจสอบธุรกรรมกับร้านค้า
หาก App Store หรือ Google Play ยืนยันการซื้อและสภาพตรงตามกฎของผลิตภัณฑ์ BillingMeld จะบันทึกสิทธิ์ใช้งานที่ใช้งานได้
หลังจากนั้น บริการเชื่อมต่อจะแสดงผลการใช้งานที่ได้รับชำระแล้วแก่ผู้ใช้
สภาพเหล่านี้ยังคงอยู่แม้จะเปลี่ยนข้อความจากลูกค้าในภายหลัง
หากการต่ออายุต่อเนื่อง BillingMeld จะอัปเดตเป็นช่วงเวลาที่ชำระใหม่
ถ้าผู้ใช้ปิดการต่ออายุ อัตราปัจจุบันก็สามารถใช้งานต่อจนกว่าจะหมดระยะ
แต่ถ้ามีการคืนเงินหรือยกเลิก การเปลี่ยนแปลงสถานะก็จะเกิดขึ้นอีกครั้ง
ในกรณีนี้ แอปไม่มีการเก็บ “ความจริง” ของการซื้อแยกต่างหาก แต่ทำงานกับสถานะที่รับรองและบันทึกโดย BillingMeld
การเปลี่ยนอุปกรณ์แล้วสถานะยังคงอยู่
โมเดลเซิร์ฟเวอร์นี้มีประโยชน์มาก เมื่อผู้ใช้เปลี่ยนโทรศัพท์หรือดาวน์โหลดแอปใหม่อีกครั้ง
สิทธิในการซื้อไม่ควรขึ้นอยู่กับรอยเท้าของอุปกรณ์ใดอุปกรณ์หนึ่งเท่านั้น
หากสถานะการซื้ออยู่บนเซิร์ฟเวอร์และเชื่อมโยงกับธุรกรรมร้านค้าที่ยืนยันแล้ว ก็สามารถรับข้อมูลปัจจุบันได้จากเซิร์ฟเวอร์
นี่เป็นอีกเหตุผลหนึ่งที่ควรหลีกเลี่ยงการเก็บข้อมูลสิทธิ์การเข้าถึงไว้ภายในแอปเพียงอย่างเดียว
สิ่งที่เป็นประโยชน์ต่อผู้พัฒนา
สำหรับทีมพัฒนาที่ปล่อยหลายแอป หรือทำงานใน iOS และ Android พร้อมกัน การจัดการการชำระเงินกลายเป็นงานสถาปัตยกรรมแยกต่างหากอย่างรวดเร็ว
ต้องคำนึงถึง:
รูปแบบข้อมูลของ Apple และ Google ที่แตกต่างกัน
การยืนยันการซื้อเริ่มต้น
การต่ออายุสมาชิก
การสิ้นสุดระยะเวลาการชำระ
การปิดการต่ออายุอัตโนมัติ
การคืนเงิน
การยกเลิกธุรกรรม
การติดตั้งแอปซ้ำ
การเปลี่ยนอุปกรณ์
การกู้คืนการซื้อ
การเปลี่ยนแปลงสถานะที่ไม่ผ่านการควบคุมโดยลูกค้า
BillingMeld รวมกระบวนการนี้ไว้ในชั้นเฉพาะทาง ซึ่งเซิร์ฟเวอร์ของผลิตภัณฑ์ทำงานตามข้อตกลงเดียวและไม่ต้องเข้าใจรายละเอียดแต่ละร้านค้าเอง ซึ่งช่วยลดโค้ดซ้ำและลดความเสี่ยงที่แอปพลิเคชันต่างๆ จากบริษัทเดียวกันจะเข้าใจผิดเกี่ยวกับเหตุการณ์เดียวกัน
สิ่งสำคัญไม่ใช่ใบรับรอง แต่เป็นสิทธิ์ที่เป็นปัจจุบัน
สิ่งที่น่าสนใจที่สุดในสถาปัตยกรรมนี้คือการเปลี่ยนจากการตรวจสอบการซื้อแบบแยกเดี่ยวไปเป็นการควบคุมสภาพปัจจุบันของสิทธิ์
ข้อเท็จจริงที่ว่ามีการซื้อครั้งแรกสำเร็จแล้ว ยังไม่ตอบคำถามสำคัญของผลิตภัณฑ์ว่า:
ผู้ใช้ปัจจุบันทันและมีสิทธิ์ในฟังก์ชันแบบชำระเงินหรือไม่?
การซื้ออาจมีงวดแรกสำเร็จ แต่ระยะเวลานั้นอาจหมดอายุไปแล้ว หรือการต่ออายุอัตโนมัติปิดใช้งาน แต่ยังใช้งานสิทธิ์สุดท้ายได้
อาจมีการต่ออายุที่ได้รับการยืนยันแล้ว หรือการคืนเงิน การยกเลิกธุรกรรมจากร้านค้า
ดังนั้น สิ่งสำคัญคือไม่ใช่ตรวจก่อนหน้า แต่เป็นสถานะปัจจุบันของสิทธิ์ของผู้ใช้ ซึ่งอิงจากสถานะการซื้อที่ยืนยันแล้ว
นี่คือข้อมูลที่ BillingMeld ส่งต่อไปยังบริการอื่น ๆ
BillingMeld เป็นตัวกลางระหว่างร้านค้าและผลิตภัณฑ์
โดยทำให้เกิดขอบเขตเชิงสถาปัตยกรรมที่ชัดเจน
ด้านหนึ่งเป็น App Store และ Google Play ที่มีรูปแบบ ข้อมูล เหตุการณ์ และวงจรชีวิตของการซื้อของตัวเอง อีกด้านหนึ่งเป็นแอปและบริการภายใน ที่ส่วนใหญ่ต้องการคำตอบง่าย ๆ: สิทธิ์ในปัจจุบันของผู้ใช้คืออะไร
ระหว่างสองฝ่ายคือ BillingMeld ซึ่งรับข้อมูลจากร้านค้า ตรวจสอบ เรียบเรียงให้เป็นโมเดลของตัวเอง แล้วให้ข้อมูลในรูปแบบที่เป็นปกติแก่โครงสร้างพื้นฐาน
ด้วยวิธีนี้ ผลิตภัณฑ์ไม่จำเป็นต้องเข้าใจรายละเอียดของแต่ละแพลตฟอร์มการชำระเงิน และสามารถดำเนินการได้อย่างราบรื่น
ทำไมสำคัญสำหรับผู้ใช้
สำหรับผู้ใช้ ระบบการชำระเงินที่ถูกต้องโดยอุดมคติควรเป็นสิ่งที่ไม่สังเกตเห็น
หากการซื้อได้รับการยืนยันและระยะเวลาที่ชำระไว้ยังคงใช้งานได้ สิทธิ์ควรทำงานต่อเนื่อง
หากผู้ใช้ปิดการต่ออายุอัตโนมัติ ระยะเวลาแบบจ่ายแล้วไม่ควรหมดก่อนเวลา
ถ้ามีการต่ออายุใหม่ที่ได้รับการยืนยัน ระบบควรดำเนินการต่อ
และหากร้านค้าส่งคืนหรือยกเลิก การเปลี่ยนแปลงสิทธิ์ควรทำอย่างถูกต้อง
ในกรณีที่เปลี่ยนอุปกรณ์หรือเพียงแค่ติดตั้งแอปใหม่ ผู้ใช้ไม่ควรต้องพิสูจน์ทุกส่วนของโครงสร้างพื้นฐานว่า มีการซื้อที่แท้จริงอยู่
กฎง่าย ๆ จึงเป็น:
ลูกค้ารายงานการซื้อ ร้านค้าเป็นแหล่งข้อมูลภายนอกของสถานะ ปรับข้อมูลโดย BillingMeld และส่วนอื่น ๆ ตัดสินใจบนข้อมูลที่ได้รับการยืนยันแล้ว
นี่คือเหตุผลว่าทำไม BillingMeld ไม่ใช่แค่โมดูลชำระเงินธรรมดา แต่เป็นชั้นเซิร์ฟเวอร์ของความไว้วางใจระหว่างแอปมือถือ ร้านค้าใน Apple กับ Google และผลิตภัณฑ์ที่ต้องการเข้าใจสิทธิ์การชำระเงินของผู้ใช้แบบแม่นยำ
รายละเอียดเพิ่มเติมเกี่ยวกับโครงการ: billingmeld.de.