คำแนะนำการผสานรวมในแอปสำหรับโปรแกรมข้อเสนอภายนอก

คู่มือนี้อธิบายวิธีผสานรวมกับ 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 Console
  • DEVELOPER_ERROR: คำขอมีข้อผิดพลาด ใช้ข้อความดีบักเพื่อระบุและแก้ไขข้อผิดพลาดก่อนดำเนินการต่อ
  • NETWORK_ERROR, SERVICE_DISCONNECTED, SERVICE_UNAVAILABLE: ข้อผิดพลาดเหล่านี้เป็นข้อผิดพลาดชั่วคราวที่ควรจัดการด้วยนโยบายการลองอีกครั้งที่เหมาะสม ในกรณีที่เกิด SERVICE_DISCONNECTED ให้สร้างการเชื่อมต่อกับ Google Play อีกครั้งก่อนที่จะลองอีกครั้ง

ทดสอบข้อเสนอภายนอก

คุณควรใช้ผู้ทดสอบใบอนุญาตเพื่อทดสอบการผสานรวมข้อเสนอภายนอก ระบบจะไม่เรียกเก็บเงินจากคุณสำหรับธุรกรรมที่บัญชีผู้ทดสอบใบอนุญาตเป็นผู้เริ่ม ดูข้อมูลเพิ่มเติมเกี่ยวกับการกำหนดค่าผู้ทดสอบใบอนุญาตได้ที่ทดสอบการเรียกเก็บเงินสำหรับการซื้อในแอปด้วยการอนุญาตให้ใช้สิทธิแอปพลิเคชันสำหรับข้อมูลเพิ่มเติม

ขั้นตอนถัดไป

เมื่อผสานรวมในแอปเสร็จแล้ว คุณก็พร้อมที่จะผสานรวมแบ็กเอนด์