คู่มือนี้อธิบายวิธีผสานรวมกับ API เพื่อรองรับข้อเสนอภายนอก ในแอปและภูมิภาคที่มีสิทธิ์ ดูข้อมูลเพิ่มเติมเกี่ยวกับโปรแกรมข้อเสนอภายนอก รวมถึงข้อกำหนดของการได้รับสิทธิ์และขอบเขตทางภูมิศาสตร์ได้ที่ ข้อกำหนดของโปรแกรม
การตั้งค่า Play Billing Library
หากต้องการใช้ API ของข้อเสนอภายนอก ให้ เพิ่มการอ้างอิง Play Billing Library เวอร์ชัน 8.2 ขึ้นไป ลงในแอป 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
เปิดตัวโฟลว์ข้อเสนอภายนอก
หากต้องการเริ่มขั้นตอนข้อเสนอภายนอก แอปที่มีสิทธิ์ต้องเรียกใช้ API launchExternalLink() จากเทรดหลักของแอป 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 ที่ได้รับจาก API ของ createBillingProgramReportingDetailsAsync หากผู้ใช้ทําการซื้อหลายครั้ง คุณสามารถใช้externalTransactionTokenเดียวกันเพื่อรายงานการซื้อแต่ละครั้งได้ ดูวิธีรายงานธุรกรรมได้ที่คู่มือการผสานรวมแบ็กเอนด์
การจัดการคำตอบ
เมื่อเกิดข้อผิดพลาด เมธอด isBillingProgramAvailableAsync(),
createBillingProgramReportingDetailsAsync() และ
launchExternalLink() อาจแสดงการตอบกลับอื่นที่ไม่ใช่
BillingResponseCode.OK พิจารณาจัดการรหัสการตอบกลับเหล่านี้ดังนี้
ERROR: นี่คือข้อผิดพลาดภายใน อย่าทำธุรกรรมหรือ เปิดเว็บไซต์ภายนอก ลองอีกครั้งโดยเรียกใช้launchExternalLink()เพื่อแสดงกล่องโต้ตอบข้อมูล แก่ผู้ใช้ในครั้งถัดไปที่คุณพยายามนำผู้ใช้ออกนอก แอปFEATURE_NOT_SUPPORTED: อุปกรณ์ปัจจุบันไม่รองรับ API ของข้อเสนอภายนอกใน Play Store อย่าทำธุรกรรมหรือ เปิดเว็บไซต์ภายนอกUSER_CANCELED: อย่าเปิดเว็บไซต์ภายนอก เรียกใช้launchExternalLink()อีกครั้งเพื่อแสดงกล่องโต้ตอบข้อมูลแก่ผู้ใช้ ในครั้งถัดไปที่คุณพยายามนำผู้ใช้ออกนอกแอปBILLING_UNAVAILABLE: ธุรกรรมไม่มีสิทธิ์รับข้อเสนอภายนอก จึงไม่ควรดำเนินการภายใต้โปรแกรมนี้ เนื่องจากผู้ใช้ไม่ได้อยู่ในประเทศที่มีสิทธิ์สำหรับโปรแกรมนี้ หรือบัญชีของคุณยังไม่ได้ลงทะเบียนเข้าร่วมโปรแกรมนี้สำเร็จ หากเป็นกรณีหลัง ให้ตรวจสอบ สถานะการลงทะเบียนในคอนโซลของนักพัฒนาแอป PlayDEVELOPER_ERROR: คำขอมีข้อผิดพลาด ใช้ข้อความแก้ไขข้อบกพร่อง เพื่อระบุและแก้ไขข้อผิดพลาดก่อนดำเนินการต่อNETWORK_ERROR, SERVICE_DISCONNECTED, SERVICE_UNAVAILABLE: ข้อผิดพลาดเหล่านี้เป็นข้อผิดพลาดชั่วคราวที่ควรจัดการด้วยนโยบายลองอีกครั้งที่เหมาะสม ในกรณีของSERVICE_DISCONNECTEDให้สร้างการเชื่อมต่อกับ Google Play อีกครั้งก่อนที่จะลองอีกครั้ง
ทดสอบข้อเสนอภายนอก
คุณควรใช้ผู้ทดสอบใบอนุญาตเพื่อทดสอบการผสานรวมข้อเสนอภายนอก ระบบจะไม่เรียกเก็บเงินจากคุณสำหรับธุรกรรมที่บัญชีผู้ทดสอบใบอนุญาตเริ่ม ดูข้อมูลเพิ่มเติมเกี่ยวกับการกำหนดค่าผู้ทดสอบใบอนุญาตได้ที่ทดสอบการเรียกเก็บเงินสำหรับการซื้อในแอปด้วยการอนุญาตให้ใช้สิทธิแอปพลิเคชัน
ขั้นตอนถัดไป
เมื่อผสานรวมในแอปเสร็จแล้ว คุณก็พร้อมที่จะผสานรวมแบ็กเอนด์