หากแอปของคุณเผยแพร่ผ่าน Google Play และคุณต้องการขายสินค้าดิจิทัลหรือเสนอการสมัครใช้บริการ คุณต้องใช้บริการ Google Play Billing การเรียกเก็บเงินของ Google Play มีเครื่องมือสำหรับการจัดการแคตตาล็อก ราคาและการสมัครใช้บริการ รายงานที่เป็นประโยชน์ และขั้นตอนการชำระเงินที่ขับเคลื่อนโดย Play Store ที่ผู้ใช้คุ้นเคยอยู่แล้ว
สำหรับแอปที่สร้างขึ้นโดยใช้กิจกรรมบนเว็บที่เชื่อถือได้ และนำส่งผ่าน Google Play Store ตอนนี้คุณสามารถใช้ Payment Request API และ Digital Goods API เพื่อผสานรวมกับ Google Play Billing ได้แล้ว โดยมีให้ใช้งานใน Chrome 101 ขึ้นไปสำหรับ Android และ ChromeOS
ในคู่มือนี้ คุณจะได้เรียนรู้วิธีเพิ่มการรองรับการเรียกเก็บเงินของ Google Play ลงใน PWA และแพ็กเกจสำหรับการเผยแพร่ใน Google Play Store สำหรับทั้ง ChromeOS และ Play Store
คุณจะใช้ Web Platform API 2 รายการเพื่อเพิ่มการรองรับ Play Billing ลงใน PWA Digital Goods API ใช้เพื่อรวบรวมข้อมูล SKU และตรวจสอบการซื้อและสิทธิ์จาก Play Store Payment Request API ใช้เพื่อกำหนดค่า Google Play Store เป็นวิธีการชำระเงินและดำเนินการตามขั้นตอนการซื้อให้เสร็จสมบูรณ์
วิธีสร้างรายได้จากแอปพลิเคชันใน Play Store
แอปพลิเคชันสามารถสร้างรายได้ด้วย Google Play Billing ใน Play Store ได้ 2 วิธีดังนี้
- การซื้อในแอปช่วยให้ขายสินค้าเสมือนทั้งระยะยาวและระยะสั้น เช่น ฟีเจอร์เพิ่มเติม หรือการนำโฆษณาออก
- การสมัครใช้บริการ ให้ผู้ใช้เข้าถึงเนื้อหาหรือบริการอย่างต่อเนื่องโดยมีค่าธรรมเนียมตามรอบ เช่น การสมัครรับข่าวสารหรือการเป็นสมาชิก
ข้อกำหนด
ในการตั้งค่า Google Play Billing คุณจะต้องมีสิ่งต่อไปนี้
- บัญชีนักพัฒนาแอป Google Play และบัญชีผู้ขาย Google Payments ที่ ลิงก์กัน
- ข้อมูลผลิตภัณฑ์ใน Play Store ที่มีรุ่นในแทร็กการทดสอบแบบเปิด การทดสอบแบบปิด หรือการทดสอบภายใน
- หากต้องการสร้างและกำหนดค่าผลิตภัณฑ์และการสมัครใช้บริการของแอปใน Play Store
- โปรเจ็กต์ที่ Bubblewrap สร้างขึ้นซึ่งมีการกำหนดค่าลิงก์เนื้อหาดิจิทัลที่ใช้งานได้
อัปเดตโปรเจ็กต์ Bubblewrap
หากยังไม่ได้ติดตั้ง Bubblewrap คุณจะต้องติดตั้ง ดูรายละเอียดเกี่ยวกับวิธีเริ่มต้นใช้งานได้ในคู่มือเริ่มใช้งานฉบับย่อ หากคุณมี Bubblewrap อยู่แล้ว โปรดอัปเดตเป็นเวอร์ชัน 1.8.2 ขึ้นไป
นอกจากนี้ ลูกโป่งยังมีฟีเจอร์ด้านหลังธงด้วย หากต้องการเปิดใช้ คุณต้องแก้ไขการกําหนดค่าโปรเจ็กต์ใน twa-manifest.json
ซึ่งอยู่ที่รูทของโปรเจ็กต์ และเปิดใช้ทั้งฟีเจอร์ alphaDependencies
และ playBilling
ดังนี้
...,
"enableNotifications": true,
"features": {
"playBilling": {
"enabled": true
}
},
"alphaDependencies": {
"enabled": true
},
...
เมื่ออัปเดตไฟล์การกำหนดค่าแล้ว ให้เรียกใช้ bubblewrap update
เพื่อใช้การกำหนดค่ากับโปรเจ็กต์ ตามด้วย bubblewrap build
เพื่อสร้างแพ็กเกจ Android ใหม่และอัปโหลดแพ็กเกจนี้ไปยัง Play Store
ฟีเจอร์ที่ตรวจหาความพร้อมให้บริการของ Digital Goods API และ Google Play Billing
ปัจจุบัน Chrome รองรับ Digital Goods API เฉพาะเมื่อมีการเรียกใช้ PWA ภายในกิจกรรมบนเว็บที่เชื่อถือได้เท่านั้น และสามารถตรวจหาได้ว่า API พร้อมใช้งานหรือไม่โดยตรวจสอบหา getDigitalGoodsService
ในออบเจ็กต์ window
ดังนี้
if ('getDigitalGoodsService' in window) {
// Digital Goods API is supported!
}
Digital Goods API อาจพร้อมใช้งานในเบราว์เซอร์ทุกประเภทและรองรับร้านค้าต่างๆ หากต้องการตรวจสอบว่าระบบรองรับแบ็กเอนด์ของร้านค้าที่เฉพาะเจาะจงหรือไม่ คุณจะต้องเรียกใช้getDigitalGoodsService()
โดยส่งรหัสร้านค้าเป็นพารามิเตอร์ Google Play Store
ระบุด้วยสตริง https://play.google.com/billing
ดังนี้
if ('getDigitalGoodsService' in window) {
// Digital Goods API is supported!
try {
const service =
await window.getDigitalGoodsService('https://play.google.com/billing');
// Google Play Billing is supported!
} catch (error) {
// Google Play Billing is not available. Use another payment flow.
return;
}
}
เรียกข้อมูลรายละเอียดสำหรับ SKU
Digital Goods API มี getDetails()
ซึ่งช่วยให้ดึงข้อมูลต่างๆ เช่น ชื่อผลิตภัณฑ์ คำอธิบาย และที่สำคัญที่สุดคือราคา จากแบ็กเอนด์การชำระเงินได้
จากนั้นคุณใช้ข้อมูลนี้ในอินเทอร์เฟซผู้ใช้และระบุรายละเอียดเพิ่มเติมให้ผู้ใช้ทราบได้
const skuDetails = await service.getDetails(['shiny_sword', 'gem']);
for (item of skuDetails) {
// Format the price according to the user locale.
const localizedPrice = new Intl.NumberFormat(
navigator.language,
{style: 'currency', currency: item.price.currency}
).format(item.price.value);
// Render the price to the UI.
renderProductDetails(
item.itemId, item.title, localizedPrice, item.description);
}
สร้างขั้นตอนการซื้อ
เครื่องมือสร้างสำหรับ PaymentRequest จะใช้พารามิเตอร์ 2 ตัว ได้แก่ รายการวิธีการชำระเงินและรายการรายละเอียดการชำระเงิน
เมื่ออยู่ในกิจกรรมบนเว็บที่เชื่อถือได้ คุณต้องใช้วิธีการชำระเงินสำหรับการเรียกเก็บเงินของ Google Play โดยตั้งค่า https://play.google.com/billing
เป็นตัวระบุ และเพิ่ม SKU ของผลิตภัณฑ์เป็นสมาชิกข้อมูล ดังนี้
async function makePurchase(service, sku) {
// Define the preferred payment method and item ID
const paymentMethods = [{
supportedMethods: "https://play.google.com/billing",
data: {
sku: sku,
}
}];
...
}
แม้ว่าจะต้องระบุรายละเอียดการชำระเงิน แต่ Play Billing จะละเว้นค่าเหล่านั้นและใช้ค่าที่กำหนดไว้เมื่อสร้าง SKU ใน Play Console คุณจึงป้อนค่าที่ไม่ถูกต้องได้
const paymentDetails = {
total: {
label: `Total`,
amount: {currency: `USD`, value: `0`}
}
};
const request = new PaymentRequest(paymentMethods, paymentDetails);
เรียก show()
บนออบเจ็กต์คำขอการชำระเงินเพื่อเริ่มขั้นตอนการชําระเงิน หาก Promise สำเร็จ แสดงว่าการชำระเงินสำเร็จ หากดำเนินการไม่สำเร็จ แสดงว่าผู้ใช้อาจยกเลิกการชำระเงิน
หากการเสนอราคาสำเร็จ คุณจะต้องยืนยันและรับทราบการซื้อ ขั้นตอนนี้ต้องใช้แบ็กเอนด์เพื่อป้องกันการประพฤติมิชอบ โปรดดูเอกสารประกอบของ Play Billing เพื่อดูวิธีใช้การยืนยันในแบ็กเอนด์ หากคุณไม่ยอมรับการซื้อ หลังจากผ่านไป 3 วัน ผู้ใช้จะได้รับเงินคืนและ Google Play จะเพิกถอนการซื้อ
...
const request = new PaymentRequest(paymentMethods, paymentDetails);
try {
const paymentResponse = await request.show();
const {purchaseToken} = paymentResponse.details;
// Call backend to validate and acknowledge the purchase.
if (await acknowledgePurchaseOnBackend(purchaseToken, sku)) {
// Optional: tell the PaymentRequest API the validation was
// successful. The user-agent may show a "payment successful"
// message to the user.
const paymentComplete = await paymentResponse.complete('success');
} else {
// Optional: tell the PaymentRequest API the validation failed. The
// user agent may show a message to the user.
const paymentComplete = await paymentResponse.complete('fail');
}
} catch(e) {
// The purchase failed, and we can handle the failure here. AbortError
// usually means a user cancellation
}
...
คุณอาจเรียกใช้ consume()
ใน purchaseToken เพื่อทําเครื่องหมายการซื้อว่าใช้แล้วและอนุญาตให้ซื้ออีกครั้งได้
เมื่อนำทุกอย่างมารวมกัน วิธีการซื้อจะมีลักษณะดังนี้
async function makePurchase(service, sku) {
// Define the preferred payment method and item ID
const paymentMethods = [{
supportedMethods: "https://play.google.com/billing",
data: {
sku: sku,
}
}];
// The "total" member of the paymentDetails is required by the Payment
// Request API, but is not used when using Google Play Billing. We can
// set it up with bogus details.
const paymentDetails = {
total: {
label: `Total`,
amount: {currency: `USD`, value: `0`}
}
};
const request = new PaymentRequest(paymentMethods, paymentDetails);
try {
const paymentResponse = await request.show();
const {purchaseToken} = paymentResponse.details;
// Call backend to validate and acknowledge the purchase.
if (await acknowledgePurchaseOnBackend(purchaseToken, sku)) {
// Optional: consume the purchase, allowing the user to purchase
// the same item again.
service.consume(purchaseToken);
// Optional: tell the PaymentRequest API the validation was
// successful. The user-agent may show a "payment successful"
// message to the user.
const paymentComplete =
await paymentResponse.complete('success');
} else {
// Optional: tell the PaymentRequest API the validation failed.
// The user agent may show a message to the user.
const paymentComplete = await paymentResponse.complete('fail');
}
} catch(e) {
// The purchase failed, and we can handle the failure here.
// AbortError usually means a user cancellation
}
}
ตรวจสอบสถานะการซื้อที่มีอยู่
Digital Goods API ช่วยให้คุณตรวจสอบได้ว่าผู้ใช้มีสิทธิ์ใดๆ ที่มีอยู่ (การซื้อในแอปที่ยังไม่ได้ใช้งานหรือการสมัครใช้บริการต่อเนื่อง) จากการซื้อก่อนหน้านี้ที่ผู้ใช้ดำเนินการไปแล้ว ไม่ว่าจะในอุปกรณ์เครื่องอื่น จากการติดตั้งครั้งก่อนหน้า แลกสิทธิ์จากรหัสโปรโมชัน หรือเพิ่งแลกสิทธิ์เมื่อเปิดแอปครั้งล่าสุด
const service =
await window.getDigitalGoodsService('https://play.google.com/billing');
...
const existingPurchases = await service.listPurchases();
for (const p of existingPurchases) {
// Update the UI with items the user is already entitled to.
console.log(`Users has entitlement for ${p.itemId}`);
}
นอกจากนี้ยังเป็นช่วงเวลาที่ดีในการตรวจสอบการซื้อที่เกิดขึ้นก่อนหน้านี้แต่ยังไม่ได้รับทราบ ขอแนะนําให้ตอบรับการซื้อโดยเร็วที่สุดเพื่อให้แน่ใจว่าการให้สิทธิ์ของผู้ใช้แสดงในแอปอย่างถูกต้อง
const service =
await window.getDigitalGoodsService("https://play.google.com/billing");
...
const existingPurchases = await service.listPurchases();
for (const p of existingPurchases) {
await verifyOrAcknowledgePurchaseOnBackend(p.purchaseToken, p.itemId);
// Update the UI with items the user is already entitled to.
console.log(`Users has entitlement for ${p.itemId}`);
}
ทดสอบการผสานรวม
ในอุปกรณ์ Android สำหรับการพัฒนา
คุณเปิดใช้ Digital Goods API ในอุปกรณ์ Android สำหรับการพัฒนาเพื่อทดสอบได้ ดังนี้
- ตรวจสอบว่าคุณใช้ Android 9 ขึ้นไปโดยเปิดใช้โหมดนักพัฒนาซอฟต์แวร์
- ติดตั้ง Chrome 101 ขึ้นไป
- เปิดใช้การติดธงต่อไปนี้ใน Chrome โดยไปที่
chrome://flags
แล้วค้นหาการติดธงตามชื่อ#enable-debug-for-store-billing
- ตรวจสอบว่าเว็บไซต์โฮสต์โดยใช้โปรโตคอล https การใช้ http จะทำให้ API เป็น
undefined
ในอุปกรณ์ ChromeOS
Digital Goods API จะมีให้บริการใน ChromeOS เวอร์ชันเสถียรโดยเริ่มจากเวอร์ชัน 89 ในระหว่างนี้ คุณสามารถทดสอบ Digital Goods API ได้โดยทำดังนี้
- ติดตั้งแอปจาก Play Store บนอุปกรณ์
- ตรวจสอบว่าเว็บไซต์โฮสต์โดยใช้โปรโตคอล https การใช้ http จะทำให้ API เป็น
undefined
กับผู้ใช้ทดสอบและทีม QA
Play Store มีสิ่งอํานวยความสะดวกสําหรับการทดสอบ ซึ่งรวมถึงบัญชีทดสอบของผู้ใช้และ SKU ทดสอบ ดูข้อมูลเพิ่มเติมได้ในเอกสารประกอบการทดสอบ Google Play Billing
ไปที่ไหนต่อดี
ดังที่ได้กล่าวไว้ในเอกสารนี้ Play Billing API ประกอบด้วยคอมโพเนนต์ฝั่งไคลเอ็นต์ซึ่งจัดการโดย Digital Goods API และคอมโพเนนต์ฝั่งเซิร์ฟเวอร์
- ดูตัวอย่างของ Peter Conn ที่ https://github.com/PEConn/beer
- โปรดดูเอกสารประกอบของ Play เกี่ยวกับการยืนยันการซื้อ
- ลองใช้ไลบรารีของไคลเอ็นต์ Google Play Developer API รายการใดรายการหนึ่ง ซึ่งมีให้บริการในหลายภาษา
- หากใช้รูปแบบการสมัครใช้บริการในแอปพลิเคชัน โปรดดูเอกสารประกอบเกี่ยวกับการสมัครใช้บริการของ Play Billing
- ใช้การแจ้งเตือนแบบเรียลไทม์สำหรับนักพัฒนาแอป (RTDN) และสมัครรับการแจ้งเตือนเพื่อให้แบ็กเอนด์ได้รับการแจ้งเตือนเมื่อสถานะการสมัครใช้บริการมีการเปลี่ยนแปลงแทนการสอบถามสถานะใน Play
- นำ
linkedPurchaseToken
ไปใช้เพื่อป้องกันการสมัครใช้บริการที่ซ้ำกัน อ่านบล็อกโพสต์นี้เกี่ยวกับวิธีติดตั้งใช้งานอย่างถูกต้อง