หากมีการจัดจำหน่ายแอปผ่าน Google Play และคุณต้องการขายสินค้าหรือข้อเสนอดิจิทัล คุณต้องใช้ Google Play Billing Google Play Billing มีเครื่องมือสำหรับการจัดการ แคตตาล็อก ราคาและการสมัครใช้บริการ รายงานที่มีประโยชน์ และขั้นตอนการชำระเงินที่ขับเคลื่อนโดย Play ร้านค้าที่ผู้ใช้ของคุณคุ้นเคยอยู่แล้ว
สำหรับแอปที่สร้างขึ้นโดยใช้กิจกรรมบนเว็บที่เชื่อถือได้ และนำส่งผ่าน 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
คุณจะใช้ API ของแพลตฟอร์มเว็บ 2 รายการเพื่อเพิ่มการรองรับการเรียกเก็บเงินของ Play ไปยัง PWA Digital Goods API ใช้เพื่อรวบรวมข้อมูล SKU รวมถึงตรวจสอบการซื้อและการให้สิทธิ์ จาก Play Store 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 ภายใน
กิจกรรมบนเว็บที่เชื่อถือได้ และสามารถตรวจพบได้ว่ากิจกรรมดังกล่าวพร้อมใช้งานหรือไม่ โดยตรวจสอบ
getDigitalGoodsService
บนออบเจ็กต์ window
:
if ('getDigitalGoodsService' in window) {
// Digital Goods API is supported!
}
Digital Goods API อาจมีให้ใช้งานในเบราว์เซอร์ใดก็ได้และรองรับ App Store หลายแห่ง หากต้องการ
ตรวจสอบว่าระบบสนับสนุนแบ็กเอนด์ของ Store ที่เฉพาะเจาะจงหรือไม่ คุณจะต้องเรียกใช้
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 Billing โดย
การตั้งค่า 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 จะไม่สนใจค่าเหล่านั้นและใช้ ที่ตั้งไว้เมื่อสร้าง 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
ไปที่ไหนต่อ
ตามที่ได้อธิบายไว้ในเอกสารนี้ Play Billing API มีคอมโพเนนต์ฝั่งไคลเอ็นต์ซึ่งได้รับการจัดการ โดย Digital Goods API และคอมโพเนนต์ฝั่งเซิร์ฟเวอร์
- ดูตัวอย่างของ Peter Conn ได้ที่ https://github.com/PEConn/beer
- อ่านเอกสารประกอบของ Play เกี่ยวกับการยืนยันการซื้อ
- ลองใช้ไลบรารีของไคลเอ็นต์ Google Play Developer API ซึ่งมีให้ ในหลายภาษา
- หากนำรูปแบบการสมัครใช้บริการไปใช้กับแอปพลิเคชัน โปรดดู เอกสารประกอบเกี่ยวกับการสมัครใช้บริการ Play Billing
- ใช้การแจ้งเตือนแบบเรียลไทม์สำหรับนักพัฒนาซอฟต์แวร์ (RTDN) และสมัครรับการแจ้งเตือนเพื่อ แบ็กเอนด์จะได้รับแจ้งเมื่อสถานะของการสมัครใช้บริการเปลี่ยนแปลงแทนที่การสอบถามสถานะใน เล่น
- นำ
linkedPurchaseToken
ไปใช้เพื่อป้องกันการสมัครใช้บริการที่ซ้ำกัน อ่านบล็อกโพสต์นี้ใน วิธีการนำไปใช้อย่างถูกต้อง