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

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

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

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

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

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