คำแนะนำในการผสานรวมในแอปสำหรับการชำระเงินภายนอก

เอกสารนี้อธิบายวิธีผสานรวม API ของ Play Billing Library เพื่อเสนอการชำระเงินภายนอกในแอปที่มีสิทธิ์ ดูข้อมูลเพิ่มเติมเกี่ยวกับโปรแกรมนี้ได้ที่ข้อกำหนดของโปรแกรม

การตั้งค่า Play Billing Library

เพิ่มทรัพยากร Dependency ของ Play Billing Library ลงในแอป Android หากต้องการใช้ API ของการชำระเงินภายนอก คุณต้องใช้เวอร์ชัน 8.3 ขึ้นไป หากต้องการย้ายข้อมูลจากเวอร์ชันก่อนหน้า ให้ทำตามวิธีการในคำแนะนำในการย้ายข้อมูลเพื่ออัปเกรดก่อนเริ่มการผสานรวม

เริ่มต้นไคลเอ็นต์การเรียกเก็บเงิน

ขั้นตอนแรกในกระบวนการผสานรวมจะเหมือนกับขั้นตอนที่อธิบายไว้ในคู่มือการผสานรวม Google Play Billing โดยมีการแก้ไขเล็กน้อยเมื่อเริ่มต้น BillingClient ดังนี้

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

ตัวอย่างต่อไปนี้แสดงการเริ่มต้น BillingClient ด้วยการแก้ไขต่อไปนี้

Kotlin

val purchasesUpdatedListener =
    PurchasesUpdatedListener { billingResult, purchases ->
        // Handle new Google Play purchase.
    }

val developerProvidedBillingListener =
    DeveloperProvidedBillingListener { details ->
        // Handle user selection for developer provided billing option.
    }

val billingClient = BillingClient.newBuilder(context)
    .setListener(purchasesUpdatedListener)
    .enablePendingPurchases(PendingPurchasesParams.newBuilder().enableOneTimeProducts().build())
    .enableBillingProgram(
        EnableBillingProgramParams.newBuilder()
            .setBillingProgram(BillingProgram.EXTERNAL_PAYMENTS)
            .setDeveloperProvidedBillingListener(developerProvidedBillingListener)
            .build()
    )
    .build()

Java

private PurchasesUpdatedListener purchasesUpdatedListener = new PurchasesUpdatedListener() {
    @Override
    public void onPurchasesUpdated(BillingResult billingResult, List<Purchase> purchases) {
        // Handle new Google Play purchase.
    }
};

private DeveloperProvidedBillingListener developerProvidedBillingListener =
    new DeveloperProvidedBillingListener() {
        @Override
        public void onUserSelectedDeveloperBilling(
            DeveloperProvidedBillingDetails details) {
            // Handle user selection for developer provided billing option.
        }
    };

private BillingClient billingClient = BillingClient.newBuilder(context)
    .setListener(purchasesUpdatedListener)
    .enablePendingPurchases()
    .enableBillingProgram(
        EnableBillingProgramParams.newBuilder()
            .setBillingProgram(BillingProgram.EXTERNAL_PAYMENTS)
            .setDeveloperProvidedBillingListener(developerProvidedBillingListener)
            .build())
    .build();

เชื่อมต่อกับ Google Play

หลังจากเริ่มต้น BillingClient แล้ว ให้เชื่อมต่อกับ Google Play ตามที่อธิบายไว้ ในเชื่อมต่อกับ Google Play

ตรวจสอบสิทธิ์ของผู้ใช้

หลังจากเชื่อมต่อกับ Google Play แล้ว คุณสามารถตรวจสอบว่าผู้ใช้มีสิทธิ์เข้าร่วมโปรแกรมการชำระเงินภายนอกหรือไม่โดยเรียกใช้เมธอด isBillingProgramAvailableAsync() เมธอดนี้จะแสดงผล BillingResponseCode.OK หากผู้ใช้มีสิทธิ์ ตัวอย่างต่อไปนี้แสดงวิธีตรวจสอบสิทธิ์

Kotlin

billingClient.isBillingProgramAvailableAsync(
    BillingProgram.EXTERNAL_PAYMENTS,
    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 payments unavailable, etc.
                return
            }

            // External payments are available. Can proceed with generating an
            // external transaction token.
        }
    }
)

Java

billingClient.isBillingProgramAvailableAsync(
  BillingProgram.EXTERNAL_PAYMENTS,
  new BillingProgramAvailabilityListener() {
    @Override
    public void onBillingProgramAvailabilityResponse(
      int billingProgram, BillingResult billingResult) {
        if (billingResult.getResponseCode() != BillingResponseCode.OK) {
            // Handle failures such as retrying due to network errors,
            // handling external payments unavailable, etc.
            return;
        }

        // External payments are available. Can proceed with generating an external transaction token.
      }

    });

ดูรายละเอียดเกี่ยวกับวิธีที่แอปควรตอบสนองต่อรหัสการตอบกลับอื่นๆ ได้ที่ส่วนการจัดการการตอบกลับ หากใช้ส่วนขยาย Kotlin คุณจะใช้โครูทีน Kotlin ได้โดยไม่ต้องกำหนด Listener แยกต่างหาก

แสดงผลิตภัณฑ์ที่พร้อมจำหน่าย

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

เตรียมโทเค็นธุรกรรมภายนอก

หากต้องการรายงานธุรกรรมภายนอกไปยัง Google Play คุณต้องมีโทเค็นธุรกรรมภายนอกที่สร้างจาก Play Billing Library ต้องสร้างโทเค็นธุรกรรมภายนอกใหม่ทุกครั้งที่ผู้ใช้เข้าชมเว็บไซต์หรือแอปภายนอกผ่าน API การชำระเงินภายนอก ซึ่งทำได้ด้วยการเรียกใช้ API createBillingProgramReportingDetailsAsync ควรสร้างโทเค็น ทันทีก่อนที่จะเรียกใช้ launchBillingFlow

Kotlin

val params =
    BillingProgramReportingDetailsParams.newBuilder()
        .setBillingProgram(BillingProgram.EXTERNAL_PAYMENTS)
        .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 external transaction token locally. Pass it to
            // the external website using DeveloperBillingOptionParams when
            // launchBillingFlow is called.
        }
    }
)

Java

BillingProgramReportingDetailsParams params =
    BillingProgramReportingDetailsParams.newBuilder()
        .setBillingProgram(BillingProgram.EXTERNAL_PAYMENTS)
        .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 external transaction token locally. Pass it to
        // the external website using DeveloperBillingOptionParams when
        // launchBillingFlow is called.
      }
});

หากใช้ส่วนขยาย Kotlin คุณจะใช้โครูทีน Kotlin ได้โดยไม่ต้องกำหนด Listener แยกต่างหาก

การเปิดตัวโฟลว์การชำระเงินภายนอก

เปิดตัวขั้นตอนการชำระเงินภายนอกโดยเรียกใช้ launchBillingFlow() คล้ายกับการเปิดตัวขั้นตอนการซื้อที่มีการผสานรวมระบบการเรียกเก็บเงินของ Google Play แต่มีพารามิเตอร์เพิ่มเติม DeveloperBillingOptionParams ที่ระบุว่าแอปของคุณต้องการ เปิดใช้ขั้นตอนการชำระเงินภายนอกสำหรับการซื้อนี้

DeveloperBillingOptionParams ต้องมีข้อมูลต่อไปนี้

  • billingProgram ตั้งค่าเป็นโปรแกรมการเรียกเก็บเงิน EXTERNAL_PAYMENTS
  • linkURI ไปยังปลายทางของลิงก์
  • launchMode ตั้งค่าเป็น LAUNCH_IN_EXTERNAL_BROWSER_OR_APP หาก Google Play ควรเปิดลิงก์ หรือ CALLER_WILL_LAUNCH_LINK หากแอปของคุณ จะเปิดลิงก์

เมื่อแอปเรียกใช้ launchBillingFlow() โดยมี DeveloperBillingOptionParams ระบบการเรียกเก็บเงินของ Google Play จะทำการตรวจสอบต่อไปนี้

  • ระบบจะตรวจสอบว่าประเทศ Google Play ของผู้ใช้เป็นประเทศที่รองรับการชำระเงินภายนอก (เช่น ประเทศที่รองรับ) หรือไม่ หากประเทศที่ผู้ใช้ใช้ Google Play ได้รับการรองรับ Google Play จะตรวจสอบว่าได้เปิดใช้ การชำระเงินภายนอกหรือไม่ตามการกำหนดค่าของ BillingClient และตรวจสอบว่ามีการระบุ DeveloperBillingOptionParams หรือไม่
    • หากเปิดใช้การชำระเงินภายนอกไว้ ขั้นตอนการซื้อจะแสดง UX ของตัวเลือกของผู้ใช้
    • หากไม่ได้เปิดใช้การชำระเงินภายนอก ขั้นตอนการซื้อจะแสดง UX ของระบบการเรียกเก็บเงินมาตรฐานของ Google Play โดยไม่มีตัวเลือกของผู้ใช้
  • หากประเทศ Google Play ของผู้ใช้ไม่ใช่ประเทศที่รองรับ ขั้นตอนการซื้อจะแสดง UX ระบบการเรียกเก็บเงินมาตรฐานของ Google Play โดยไม่มี ตัวเลือกให้ผู้ใช้ตัดสินใจ

ประเทศใน Play ของผู้ใช้เป็นประเทศที่รองรับ

ประเทศ Play ของผู้ใช้ไม่ใช่ประเทศที่รองรับ

เปิดใช้การชำระเงินภายนอก (BillingClient setup และ launchBillingFlow)

ผู้ใช้เห็น UX ตัวเลือกของผู้ใช้

ผู้ใช้เห็น UX ของระบบการเรียกเก็บเงินมาตรฐานของ Google Play

ไม่ได้เปิดใช้การชำระเงินภายนอก (ไม่ได้เปิดใช้ระหว่างการตั้งค่า BillingClient หรือไม่ได้ระบุ DeveloperBillingOptionParams เพื่อเรียกใช้ launchBillingFlow)

ผู้ใช้เห็น UX ของระบบการเรียกเก็บเงินมาตรฐานของ Google Play

ผู้ใช้เห็น UX ของระบบการเรียกเก็บเงินมาตรฐานของ Google Play

ข้อมูลโค้ดต่อไปนี้แสดงวิธีสร้างDeveloperBillingOptionParams

Kotlin

val developerBillingOptionParams =
    DeveloperBillingOptionParams.newBuilder()
        .setBillingProgram(BillingProgram.EXTERNAL_PAYMENTS)
        .setLinkUri("https://www.example.com/external/purchase".toUri())
        .setLaunchMode(
            DeveloperBillingOptionParams.LaunchMode.LAUNCH_IN_EXTERNAL_BROWSER_OR_APP
        )
        .build()

Java

DeveloperBillingOptionParams developerBillingOptionParams =
    DeveloperBillingOptionParams.newBuilder()
        .setBillingProgram(BillingProgram.EXTERNAL_PAYMENTS)
        .setLinkUri(Uri.parse("https://www.example.com/external/purchase"))
        .setLaunchMode(
            DeveloperBillingOptionParams.LaunchMode.LAUNCH_IN_EXTERNAL_BROWSER_OR_APP)
        .build();

จัดการการเลือกของผู้ใช้

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

เมื่อผู้ใช้เลือกชำระเงินในเว็บไซต์หรือในแอปการชำระเงิน

หากผู้ใช้เลือกชำระเงินในเว็บไซต์ของคุณ Google Play จะเรียกใช้ DeveloperProvidedBillingListener เพื่อแจ้งให้แอปทราบว่าผู้ใช้เลือกชำระเงินในเว็บไซต์ของคุณหรือในแอปการชำระเงิน โดยเฉพาะอย่างยิ่ง ระบบจะเรียกใช้เมธอด onUserSelectedDeveloperBilling()

หากแอปตั้งค่า launchMode เป็น LAUNCH_IN_EXTERNAL_BROWSER_OR_APP Google Play จะเปิดลิงก์ หากตั้งค่า launchMode เป็น CALLER_WILL_LAUNCH_LINK แอปของคุณจะมีหน้าที่เปิดลิงก์ เมื่อลิงก์ผู้ใช้กับแอปการชำระเงิน คุณมีหน้าที่รับผิดชอบในการตรวจสอบว่า ผู้ใช้ได้ติดตั้งแอปการชำระเงินในอุปกรณ์แล้ว

ใช้โทเค็นนี้เพื่อรายงานธุรกรรมที่เกิดจากตัวเลือกนี้ตามที่อธิบายไว้ในคู่มือการผสานรวมแบ็กเอนด์

เมื่อผู้ใช้เลือกระบบการเรียกเก็บเงินของ Google Play

หากผู้ใช้เลือกใช้ระบบการเรียกเก็บเงินของ Google Play ผู้ใช้จะดำเนินการซื้อผ่าน Google Play ต่อไป

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

จัดการการเปลี่ยนแปลงในการสมัครใช้บริการ

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

ส่วนนี้จะอธิบายวิธีจัดการสถานการณ์การเปลี่ยนแปลงการสมัครใช้บริการทั่วไปบางอย่าง

โฟลว์การอัปเกรดและดาวน์เกรด

การเปลี่ยนแปลงแพ็กเกจการสมัครใช้บริการ รวมถึงขั้นตอนการอัปเกรดและดาวน์เกรด ควรได้รับการจัดการแตกต่างกันไป โดยขึ้นอยู่กับว่าการสมัครใช้บริการนั้นซื้อผ่านระบบการเรียกเก็บเงินของ Google Play หรือผ่านเว็บไซต์ของนักพัฒนาแอป

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

การสมัครใช้บริการที่ซื้อผ่านเว็บไซต์ของนักพัฒนาแอปหรือแอปการชำระเงิน

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

โดยให้เรียกใช้ launchBillingFlow() เมื่อผู้ใช้ขออัปเกรดหรือดาวน์เกรด แทนที่จะระบุพารามิเตอร์อื่นๆ ภายใต้ออบเจ็กต์ SubscriptionUpdateParams ให้ใช้ setOriginalExternalTransactionId() โดยระบุรหัสธุรกรรมภายนอก สำหรับการซื้อครั้งแรก

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

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

การสมัครใช้บริการที่ซื้อผ่านระบบการเรียกเก็บเงินของ Google Play

ในทำนองเดียวกัน ผู้ใช้ที่ซื้อการสมัครใช้บริการปัจจุบันผ่านระบบการเรียกเก็บเงินของ Google Play หลังจากที่ผู้ใช้เลือกแล้วควรได้รับแจ้งให้ทำตามขั้นตอนการเรียกเก็บเงินมาตรฐานของ Google Play ต้องไม่ตั้งค่า DeveloperBillingOptionParams ในการเรียกไปยัง launchBillingFlow

การยกเลิกและการคืนค่าการสมัครใช้บริการ

ผู้ใช้ควรยกเลิกการสมัครใช้บริการได้ทุกเมื่อ เมื่อ ผู้ใช้ยกเลิกการสมัครใช้บริการ ระบบอาจเลื่อนการสิ้นสุดสิทธิ์ จนกว่าระยะเวลาที่ชำระเงินจะสิ้นสุดลง ตัวอย่างเช่น หากผู้ใช้ยกเลิกการสมัครใช้บริการรายเดือนในช่วงกลางเดือน ผู้ใช้จะยังคงเข้าถึงบริการได้ต่อไปอีกประมาณ 2 สัปดาห์จนกว่าระบบจะนำสิทธิ์เข้าถึงออก ในช่วง นี้ การสมัครใช้บริการจะยังคงมีผลในทางเทคนิค ผู้ใช้จึงยังใช้บริการได้

ผู้ใช้จำนวนไม่น้อยเลือกที่จะยกเลิกการยกเลิกในช่วงระยะเวลาที่ใช้งานอยู่ นี้ ในคู่มือนี้ เราจะเรียกการดำเนินการนี้ว่าการกู้คืน ส่วนต่อไปนี้จะอธิบายวิธีจัดการสถานการณ์การกู้คืนในการผสานรวม API การชำระเงินภายนอก

การสมัครใช้บริการที่ซื้อผ่านเว็บไซต์ของนักพัฒนาแอป

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

การสมัครใช้บริการที่ซื้อผ่านระบบการเรียกเก็บเงินของ Google Play

โดยทั่วไปแล้ว ผู้ใช้จะคืนค่าการสมัครใช้บริการในระบบการเรียกเก็บเงินของ Google Play ได้ สำหรับการสมัครใช้บริการที่ยกเลิกไปแล้วซึ่งซื้อผ่านระบบการเรียกเก็บเงินของ Google Play ในตอนแรก ผู้ใช้สามารถเลือกที่จะยกเลิกการยกเลิกได้ในขณะที่การสมัครใช้บริการยังใช้งานได้ผ่านฟีเจอร์สมัครใช้บริการอีกครั้งของ Google Play ในกรณีนี้ คุณจะได้รับการแจ้งเตือนแบบเรียลไทม์สำหรับนักพัฒนาแอป SUBSCRIPTION_RESTARTED ในแบ็กเอนด์ และระบบจะไม่สร้างโทเค็นการซื้อใหม่ แต่จะใช้โทเค็นเดิมเพื่อต่ออายุการสมัครใช้บริการ ดูวิธีจัดการการคืนค่าในระบบการเรียกเก็บเงินของ Google Play ได้ที่การคืนค่าใน คู่มือการจัดการการสมัครใช้บริการ

นอกจากนี้ คุณยังเรียกใช้การคืนค่าในระบบการเรียกเก็บเงินของ Google Play จากแอปได้โดยการเรียกใช้ launchBillingFlow() ดูคำอธิบายวิธีดำเนินการนี้ได้ที่ ก่อนการสมัครใช้บริการจะหมดอายุ - ในแอป ในกรณีของผู้ใช้ที่ผ่านขั้นตอนการเลือกของผู้ใช้สำหรับการ ซื้อครั้งแรก (ซึ่งถูกยกเลิกแต่ยังใช้งานได้) ระบบจะ ตรวจหาตัวเลือกของผู้ใช้โดยอัตโนมัติและแสดงอินเทอร์เฟซผู้ใช้สำหรับ การคืนค่าการซื้อเหล่านี้ ระบบจะขอให้ผู้ใช้ยืนยันการซื้อการสมัครใช้บริการอีกครั้งผ่าน Google Play แต่ผู้ใช้ไม่จำเป็นต้องทำตามขั้นตอนการเลือกของผู้ใช้อีกครั้ง ในกรณีนี้ ระบบจะออกโทเค็นการซื้อใหม่ให้แก่ผู้ใช้ แบ็กเอนด์จะได้รับการแจ้งเตือนแบบเรียลไทม์สำหรับนักพัฒนาแอป (Real Time Developer Notification) ที่มีค่า SUBSCRIPTION_PURCHASED และค่า linkedPurchaseToken สำหรับสถานะการซื้อใหม่จะได้รับการตั้งค่าเช่นเดียวกับกรณีการอัปเกรดหรือดาวน์เกรด โดยมีโทเค็นการซื้อเก่าสำหรับการสมัครใช้บริการที่ถูกยกเลิก

การสมัครใช้บริการอีกครั้ง

หากการสมัครใช้บริการหมดอายุโดยสมบูรณ์ ไม่ว่าจะเกิดจากการยกเลิกหรือ การชำระเงินถูกปฏิเสธโดยไม่มีการกู้คืน (การระงับบัญชีที่หมดอายุ) ผู้ใช้จะต้องสมัครใช้บริการอีกครั้งหากต้องการเริ่มสิทธิ์ใหม่

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

การจัดการคำตอบ

เมื่อเกิดข้อผิดพลาด เมธอด isBillingProgramAvailableAsync() , createBillingProgramReportingDetailsAsync(), launchBillingFlow() อาจ แสดง BillingResponseCode อื่นที่ไม่ใช่ BillingResponseCode.OK พิจารณา จัดการรหัสการตอบกลับเหล่านี้ดังนี้

  • BillingResponseCode.ERROR: นี่คือข้อผิดพลาดภายใน อย่า ทำธุรกรรมหรือเปิดเว็บไซต์ภายนอก ลองอีกครั้งโดย เรียกใช้ API อีกครั้ง
  • BillingResponseCode.FEATURE_NOT_SUPPORTED: Play Store ไม่รองรับ API การชำระเงินภายนอกในอุปกรณ์ปัจจุบัน อย่า ทำธุรกรรมหรือเปิดเว็บไซต์ภายนอก
  • BillingResponseCode.DEVELOPER_ERROR: คำขอมีข้อผิดพลาด ใช้ข้อความแก้ไขข้อบกพร่องเพื่อระบุและแก้ไขข้อผิดพลาดก่อน ดำเนินการต่อ
  • BillingResponseCode.USER_CANCELED: อย่าเปิดเว็บไซต์หรือแอปภายนอก ให้เรียกใช้ launchBillingFlow() อีกครั้งเพื่อแสดงกล่องโต้ตอบข้อมูลต่อผู้ใช้ในครั้งถัดไปที่คุณพยายามนำผู้ใช้ออกนอกแอป
  • BillingResponseCode.BILLING_UNAVAILABLE: ธุรกรรมไม่เข้าเกณฑ์สำหรับการชำระเงินภายนอก ดังนั้นการเรียกเก็บเงินจากนักพัฒนาแอปจะใช้ไม่ได้ภายใต้โปรแกรมนี้ สาเหตุอาจเป็นเพราะผู้ใช้ไม่ได้อยู่ในประเทศที่มีสิทธิ์สำหรับโปรแกรมนี้ หรือบัญชีของคุณลงทะเบียนเข้าร่วมโปรแกรมไม่สำเร็จ หากเป็นกรณีหลัง ให้ตรวจสอบ สถานะการลงทะเบียนใน Play Developer Console
  • BillingResponseCode.NETWORK_ERROR BillingResponseCode.SERVICE_DISCONNECTED BillingResponseCode.SERVICE_UNAVAILABLE: ข้อผิดพลาดเหล่านี้เป็นข้อผิดพลาดชั่วคราว ซึ่งควรจัดการด้วยนโยบายการลองใหม่ที่เหมาะสม ในกรณีของ SERVICE_DISCONNECTED ให้สร้างการเชื่อมต่อกับ Google Play อีกครั้งก่อนลองอีกครั้ง

ทดสอบลิงก์การชำระเงินภายนอก

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

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

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