คู่มือนี้อธิบายวิธีผสานรวมกับ API เพื่อรองรับข้อเสนอภายนอกในแอปและภูมิภาคที่มีสิทธิ์ ดูข้อมูลเพิ่มเติมเกี่ยวกับโปรแกรมข้อเสนอภายนอก รวมถึงข้อกำหนดด้านการมีสิทธิ์และขอบเขตทางภูมิศาสตร์ได้ที่ ข้อกำหนดของโปรแกรม
การตั้งค่า Play Billing Library
หากต้องการใช้ API ของข้อเสนอภายนอก ให้เพิ่มทรัพยากร Dependency ของ Play Billing Library เวอร์ชัน 8.2.1 ขึ้นไป ลงในแอป Android หากต้องการย้ายข้อมูลจากเวอร์ชันก่อนหน้า ให้ทำตาม วิธีการในคำแนะนำในการย้ายข้อมูลก่อนที่จะพยายามใช้ ข้อเสนอภายนอก
เชื่อมต่อกับ Google Play
ขั้นตอนแรกในกระบวนการผสานรวมจะเหมือนกับที่อธิบายไว้ใน
คู่มือการผสานรวมการเรียกเก็บเงิน ยกเว้นว่าคุณต้องเรียก
enableBillingProgram เพื่อระบุว่าต้องการใช้ข้อเสนอภายนอก
เมื่อเริ่มต้นBillingClient
ตัวอย่างต่อไปนี้แสดงการเริ่มต้น BillingClient ด้วยการแก้ไขเหล่านี้
Kotlin
val billingClient = BillingClient.newBuilder(context)
.enableBillingProgram(BillingProgram.EXTERNAL_OFFER)
.build()
Java
private BillingClient billingClient = BillingClient.newBuilder(context)
.enableBillingProgram(BillingProgram.EXTERNAL_OFFER)
.build();
หลังจากเริ่มต้น BillingClient แล้ว คุณต้อง สร้างการเชื่อมต่อกับ
Google Play ตามที่อธิบายไว้ในคู่มือการผสานรวม
ตรวจสอบความพร้อมให้บริการ
หากต้องการยืนยันว่าข้อเสนอภายนอกพร้อมให้บริการแก่ผู้ใช้ปัจจุบัน ให้เรียก
isBillingProgramAvailableAsync
API นี้จะแสดงผล BillingResponseCode.OK หากข้อเสนอภายนอกพร้อมให้บริการ
ดูรายละเอียดเกี่ยวกับวิธีที่แอปควร
ตอบสนองต่อโค้ดตอบกลับอื่นๆ ได้ที่การจัดการการตอบสนอง
Kotlin
billingClient.isBillingProgramAvailableAsync(
BillingProgram.EXTERNAL_OFFER,
object : BillingProgramAvailabilityListener {
override fun onBillingProgramAvailabilityResponse(
billingResult: BillingResult,
billingProgramAvailabilityDetails: BillingProgramAvailabilityDetails) {
if (billingResult.responseCode != BillingResponseCode.OK) {
// Handle failures such as retrying due to network errors,
// handling external offers unavailable, etc.
return
}
// External offers are available. Continue with steps in the
// guide.
}
})
Java
billingClient.isBillingProgramAvailableAsync(
BillingProgram.EXTERNAL_OFFER,
new BillingProgramAvailabilityListener() {
@Override
public void onBillingProgramAvailabilityResponse(
BillingResult billingResult,
BillingProgramAvailabilityDetails billingProgramAvailabilityDetails) {
if (billingResult.getResponseCode() != BillingResponseCode.OK) {
// Handle failures such as retrying due to network errors,
// handling external offers being unavailable, etc.
return;
}
// External offers are available. Continue with steps in the
// guide.
}
});
เตรียมโทเค็นธุรกรรมภายนอก
หากต้องการรายงานธุรกรรมภายนอกไปยัง Google Play คุณต้องมีโทเค็นธุรกรรมภายนอกที่สร้างจาก Play Billing Library คุณรับ
โทเค็นนี้ได้โดยการเรียก API createBillingProgramReportingDetailsAsync คุณต้องสร้างโทเค็นใหม่ทันทีก่อนที่จะนำผู้ใช้ออกจากแอปสำหรับข้อเสนอภายนอกแต่ละรายการ และต้องไม่แคชโทเค็นไว้ในธุรกรรมต่างๆ
Kotlin
val params =
BillingProgramReportingDetailsParams.newBuilder()
.setBillingProgram(BillingProgram.EXTERNAL_OFFER)
.build();
billingClient.createBillingProgramReportingDetailsAsync(
params,
object : BillingProgramReportingDetailsListener {
override fun onCreateBillingProgramReportingDetailsResponse(
billingResult: BillingResult,
billingProgramReportingDetails: BillingProgramReportingDetails?) {
if (billingResult.responseCode != BillingResponseCode.OK) {
// Handle failures such as retrying due to network errors.
return
}
val externalTransactionToken =
billingProgramReportingDetails?.externalTransactionToken
// Persist the transaction token in your backend. You may pass it
// to the external website when calling the launchExternalLink API.
}
})
Java
BillingProgramReportingDetailsParams params =
BillingProgramReportingDetailsParams.newBuilder()
.setBillingProgram(BillingProgram.EXTERNAL_OFFER)
.build();
billingClient.createBillingProgramReportingDetailsAsync(
params,
new BillingProgramReportingDetailsListener() {
@Override
public void onCreateBillingProgramReportingDetailsResponse(
BillingResult billingResult,
@Nullable BillingProgramReportingDetails
billingProgramReportingDetails) {
if (billingResult.getResponseCode() != BillingResponseCode.OK) {
// Handle failures such as retrying due to network errors.
return;
}
String transactionToken =
billingProgramReportingDetails.getExternalTransactionToken();
// Persist the transaction token in your backend. You may pass it
// to the external website when calling the launchExternalLink API.
}
});
หรือคุณจะค้นหาฟังก์ชันระงับ
createBillingProgramReportingDetailsAsync ด้วย ส่วนขยาย Kotlin เพื่อ
ไม่ให้ต้องกำหนด Listener ก็ได้
val createBillingProgramReportingDetailsResult =
withContext(context) {
billingClient
.createBillingProgramReportingDetails(params)
}
// Process the result
เปิดตัวโฟลว์ข้อเสนอภายนอก
หากต้องการเริ่มโฟลว์ข้อเสนอภายนอก แอปที่มีสิทธิ์ต้องเรียก
launchExternalLink() API จากเทรดหลักของแอป API นี้รับ
ออบเจ็กต์ LaunchExternalLinkParams เป็นอินพุต หากต้องการสร้างออบเจ็กต์
LaunchExternalLinkParams ให้ใช้คลาส
LaunchExternalLinkParams.Builder คลาสนี้มีพารามิเตอร์ต่อไปนี้
- linkUri - ลิงก์ไปยังเว็บไซต์ภายนอกที่มีการเสนอเนื้อหาดิจิทัลหรือ การดาวน์โหลดแอป สำหรับการดาวน์โหลดแอป ลิงก์นี้ต้องลงทะเบียนและได้รับการอนุมัติใน Play Developer Console
- linkType - ประเภทเนื้อหาที่เสนอต่อผู้ใช้
- launchMode - ระบุวิธีเปิดลิงก์ สำหรับการดาวน์โหลดแอป คุณต้องตั้งค่านี้เป็น
LAUNCH_IN_EXTERNAL_BROWSER_OR_APP - billingProgram - ตั้งค่านี้เป็น
BillingProgram.EXTERNAL_OFFER
เมื่อคุณเรียก launchExternalLink() ระบบอาจแสดงกล่องโต้ตอบข้อมูลเพิ่มเติม
แก่ผู้ใช้ตามการตั้งค่าของผู้ใช้ Play จะเปิด URI ของลิงก์ในเบราว์เซอร์ภายนอกหรือส่งคืนโฟลว์ไปยังแอปเพื่อเปิด URI ทั้งนี้ขึ้นอยู่กับพารามิเตอร์ launchMode ในกรณีส่วนใหญ่ คุณสามารถใช้โหมด
LAUNCH_IN_EXTERNAL_BROWSER_OR_APP ซึ่ง Play จะเปิด URI
ให้คุณ หากต้องการให้มีลักษณะการทำงานที่ปรับแต่งได้มากขึ้น เช่น การเปิด URI
ใน WebView หรือการเปิด URI ในเบราว์เซอร์ที่เฉพาะเจาะจง คุณสามารถใช้โหมด
CALLER_WILL_LAUNCH_LINK โปรดตรวจสอบว่าไม่มีการส่งข้อมูลส่วนบุคคลที่ระบุตัวบุคคลนั้นได้ (PII) ใน URI เพื่อปกป้องความเป็นส่วนตัวของผู้ใช้
Kotlin
// An activity reference from which the external offers flow will be launched.
val activity = ...;
val params =
LaunchExternalLinkParams.newBuilder()
.setBillingProgram(BillingProgram.EXTERNAL_OFFER)
// You can pass along the external transaction token from
// BillingProgramReportingDetails as a URL parameter in the URI
.setLinkUri(yourLinkUri)
.setLinkType(LaunchExternalLinkParams.LinkType.LINK_TO_APP_DOWNLOAD)
.setLaunchMode(
LaunchExternalLinkParams.LaunchMode.LAUNCH_IN_EXTERNAL_BROWSER_OR_APP)
.build()
val listener : LaunchExternalLinkResponseListener =
LaunchExternalLinkResponseListener {
override fun onLaunchExternalLinkResponse(billingResult: BillingResult) {
if (billingResult.responseCode == BillingResponseCode.OK) {
// Proceed with the rest of the external offer flow. If the user
// purchases an item, be sure to report the transaction to Google Play.
} else {
// Handle failures such as retrying due to network errors.
}
}
}
billingClient.launchExternalLink(activity, params, listener)
Java
// An activity reference from which the external offers flow will be launched.
Activity activity = ...;
LaunchExternalLinkParams params = LaunchExternalLinkParams.newBuilder()
.setBillingProgram(BillingProgram.EXTERNAL_OFFER)
// You can pass along the external transaction token from
// BillingProgramReportingDetails as a URL parameter in the URI
.setLinkUri(yourLinkUri)
.setLinkType(LaunchExternalLinkParams.LinkType.LINK_TO_APP_DOWNLOAD)
.setLaunchMode(
LaunchExternalLinkParams.LaunchMode.LAUNCH_IN_EXTERNAL_BROWSER_OR_APP)
.build();
LaunchExternalLinkResponseListener listener =
new LaunchExternalLinkResponseListener() {
@Override
public void onLaunchExternalLinkResponse(BillingResult billingResult) {
if (billingResult.responseCode == BillingResponseCode.OK) {
// Proceed with the rest of the external offer flow. If the user
// purchases an item, be sure to report the transaction to Google
// Play.
} else {
// Handle failures such as retrying due to network errors.
}
}
}
billingClient.launchExternalLink(activity, params, listener);
หากตั้งค่า LaunchMode เป็น CALLER_WILL_LAUNCH_LINK คุณควรนำผู้ใช้ออกจากแอปก็ต่อเมื่อ onLaunchExternalLinkResponse แสดงผล BillingResponseCode.OK
รายงานธุรกรรมไปยัง Google Play
คุณต้องรายงานธุรกรรมภายนอกทั้งหมดไปยัง Google Play โดยการเรียก Google Play Developer API จากแบ็กเอนด์ เมื่อรายงานธุรกรรม คุณต้องระบุ externalTransactionToken ที่ได้รับจาก APIcreateBillingProgramReportingDetailsAsync หากผู้ใช้ทำการซื้อหลายรายการ คุณสามารถใช้ externalTransactionToken เดียวกันเพื่อรายงานการซื้อแต่ละรายการได้ ดูวิธีกรอกข้อมูลธุรกรรมได้ที่คู่มือการผสานรวมแบ็กเอนด์
การจัดการการตอบสนอง
เมื่อเกิดข้อผิดพลาด เมธอด isBillingProgramAvailableAsync(), createBillingProgramReportingDetailsAsync() และ launchExternalLink() อาจแสดงผลการตอบกลับอื่นๆ นอกเหนือจาก BillingResponseCode.OK ลองจัดการโค้ดตอบกลับเหล่านี้ดังนี้
ERROR: นี่คือข้อผิดพลาดภายใน อย่าดำเนินการธุรกรรมหรือเปิดเว็บไซต์ภายนอก ลองอีกครั้งโดยเรียกlaunchExternalLink()เพื่อแสดงกล่องโต้ตอบข้อมูลแก่ผู้ใช้ในครั้งถัดไปที่คุณพยายามนำผู้ใช้ออกจากแอปFEATURE_NOT_SUPPORTED: Play Store ในอุปกรณ์ปัจจุบันไม่รองรับ API ของข้อเสนอภายนอก อย่าดำเนินการธุรกรรมหรือเปิดเว็บไซต์ภายนอกUSER_CANCELED: อย่าดำเนินการเปิดเว็บไซต์ภายนอก เรียกlaunchExternalLink()อีกครั้งเพื่อแสดงกล่องโต้ตอบข้อมูลแก่ผู้ใช้ในครั้งถัดไปที่คุณพยายามนำผู้ใช้ออกจากแอปBILLING_UNAVAILABLE: ธุรกรรมไม่มีสิทธิ์รับข้อเสนอภายนอก จึงไม่ควรดำเนินการภายใต้โปรแกรมนี้ ซึ่งอาจเป็นเพราะผู้ใช้อยู่ในประเทศที่ไม่มีสิทธิ์เข้าร่วมโปรแกรมนี้ หรือบัญชีของคุณยังไม่ได้ลงทะเบียนเข้าร่วมโปรแกรมเรียบร้อยแล้ว หากเป็นกรณีหลัง ให้ตรวจสอบสถานะการลงทะเบียนใน Play Developer ConsoleDEVELOPER_ERROR: คำขอมีข้อผิดพลาด ใช้ข้อความดีบักเพื่อระบุและแก้ไขข้อผิดพลาดก่อนดำเนินการต่อNETWORK_ERROR, SERVICE_DISCONNECTED, SERVICE_UNAVAILABLE: ข้อผิดพลาดเหล่านี้เป็นข้อผิดพลาดชั่วคราวที่ควรจัดการด้วยนโยบายการลองอีกครั้งที่เหมาะสม ในกรณีที่เกิดSERVICE_DISCONNECTEDให้สร้างการเชื่อมต่อกับ Google Play อีกครั้งก่อนที่จะลองอีกครั้ง
ทดสอบข้อเสนอภายนอก
คุณควรใช้ผู้ทดสอบใบอนุญาตเพื่อทดสอบการผสานรวมข้อเสนอภายนอก ระบบจะไม่เรียกเก็บเงินจากคุณสำหรับธุรกรรมที่บัญชีผู้ทดสอบใบอนุญาตเป็นผู้เริ่ม ดูข้อมูลเพิ่มเติมเกี่ยวกับการกำหนดค่าผู้ทดสอบใบอนุญาตได้ที่ทดสอบการเรียกเก็บเงินสำหรับการซื้อในแอปด้วยการอนุญาตให้ใช้สิทธิแอปพลิเคชันสำหรับข้อมูลเพิ่มเติม
ขั้นตอนถัดไป
เมื่อผสานรวมในแอปเสร็จแล้ว คุณก็พร้อมที่จะผสานรวมแบ็กเอนด์