วิเคราะห์การเลิกซื้อผลิตภัณฑ์ใน Play Billing

1. บทนำ

ในโค้ดแล็บนี้ คุณจะมุ่งเน้นที่การสร้างผลิตภัณฑ์แบบเรียกเก็บเงินครั้งเดียว การผสานรวมแอปกับ Play Billing Library (PBL) และวิเคราะห์สาเหตุที่ทำให้การซื้อลดลง

ผู้ชม

Codelab นี้มีไว้สำหรับนักพัฒนาแอป Android ที่ใช้ Play Billing Library (PBL) หรือต้องการใช้ PBL เพื่อสร้างรายได้จากผลิตภัณฑ์แบบครั้งเดียว

สิ่งที่คุณจะได้เรียนรู้...

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

สิ่งที่คุณต้องมี...

2. สร้างแอปตัวอย่าง

แอปตัวอย่างออกแบบมาให้เป็นแอป Android ที่ทำงานได้อย่างเต็มรูปแบบซึ่งมีซอร์สโค้ดที่สมบูรณ์ซึ่งแสดงให้เห็นถึงแง่มุมต่อไปนี้

  • การผสานรวมแอปกับ PBL
  • ดึงข้อมูลไอเทมแบบเรียกเก็บเงินครั้งเดียว
  • เปิดตัวขั้นตอนการซื้อสำหรับไอเทมแบบเรียกเก็บเงินครั้งเดียว
  • สถานการณ์การซื้อที่ทำให้เกิดการตอบกลับการเรียกเก็บเงินต่อไปนี้
    • BILLING_UNAVAILABLE
    • USER_CANCELLED
    • OK
    • ITEM_ALREADY_OWNED

วิดีโอเดโมต่อไปนี้แสดงลักษณะและการทำงานของแอปตัวอย่างหลังจากที่ติดตั้งใช้งานและเรียกใช้

สิ่งที่ต้องดำเนินการก่อน

ก่อนที่จะสร้างและติดตั้งใช้งานแอปตัวอย่าง ให้ทำดังนี้

สร้าง

วัตถุประสงค์ของขั้นตอนการสร้างนี้คือการสร้างไฟล์ Android App Bundle ที่ลงนามแล้วของแอปตัวอย่าง

หากต้องการสร้าง Android App Bundle ให้ทำตามขั้นตอนต่อไปนี้

  1. ดาวน์โหลดแอปตัวอย่างจาก GitHub
  2. สร้างแอปตัวอย่าง ก่อนสร้าง ให้เปลี่ยนชื่อแพ็กเกจของแอปตัวอย่าง แล้วจึงสร้าง หากคุณมีแพ็กเกจของแอปอื่นๆ ใน Play Console โปรดตรวจสอบว่าชื่อแพ็กเกจที่คุณระบุสำหรับแอปตัวอย่างนั้นไม่ซ้ำกัน

    หมายเหตุ: การสร้างแอปตัวอย่างจะสร้างเฉพาะไฟล์ APK ที่คุณใช้สำหรับการทดสอบในเครื่องได้ อย่างไรก็ตาม การเรียกใช้แอปจะไม่ดึงผลิตภัณฑ์และราคาเนื่องจากยังไม่ได้กำหนดค่าผลิตภัณฑ์ใน Play Console ซึ่งคุณจะได้ทำใน Codelab นี้
  3. สร้าง Android App Bundle ที่ลงนามแล้ว
    1. สร้างคีย์การอัปโหลดและคีย์สโตร์
    2. รับรองแอปด้วยคีย์การอัปโหลด
    3. กำหนดค่า Play App Signing

ขั้นตอนถัดไปคือการอัปโหลด Android App Bundle ไปยัง Google Play Console

3. สร้างผลิตภัณฑ์แบบเรียกเก็บเงินครั้งเดียวใน Play Console

หากต้องการสร้างผลิตภัณฑ์แบบครั้งเดียวใน Google Play Console คุณต้องมีแอปใน Play Console สร้างแอปใน Play Console แล้วอัปโหลด App Bundle ที่ลงนามแล้วซึ่งสร้างไว้ก่อนหน้านี้

สร้างแอป

วิธีสร้างแอป

  1. เข้าสู่ระบบ Google Play Console โดยใช้บัญชีนักพัฒนาแอป
  2. คลิกสร้างแอป ซึ่งจะเปิดหน้าสร้างแอป
  3. ป้อนชื่อแอป เลือกภาษาเริ่มต้น และรายละเอียดอื่นๆ ที่เกี่ยวข้องกับแอป
  4. คลิกสร้างแอป ซึ่งจะเป็นการสร้างแอปใน Google Play Console

ตอนนี้คุณอัปโหลด App Bundle ที่ลงนามแล้วของแอปตัวอย่างได้แล้ว

อัปโหลด App Bundle ที่ลงนามแล้ว

  1. อัปโหลด App Bundle ที่ลงนามแล้วไปยังแทร็กทดสอบภายในของ Google Play Console หลังจากอัปโหลดแล้วเท่านั้น คุณจึงจะกำหนดค่าฟีเจอร์ที่เกี่ยวข้องกับการสร้างรายได้ใน Play Console ได้
  2. คลิกทดสอบและเผยแพร่ > การทดสอบ > รุ่นภายใน > สร้างรุ่นใหม่
  3. ป้อนชื่อรุ่นแล้วอัปโหลดไฟล์ App Bundle ที่ลงชื่อแล้ว
  4. คลิกถัดไป แล้วคลิกบันทึกและเผยแพร่

ตอนนี้คุณสร้างผลิตภัณฑ์แบบเรียกเก็บเงินครั้งเดียวได้แล้ว

สร้างผลิตภัณฑ์แบบเรียกเก็บเงินครั้งเดียว

วิธีสร้างผลิตภัณฑ์แบบเรียกเก็บเงินครั้งเดียว

  1. ใน Google Play Console ให้ไปที่สร้างรายได้ด้วย Play > ผลิตภัณฑ์ > ผลิตภัณฑ์แบบเรียกเก็บเงินครั้งเดียว จากเมนูการนำทางด้านซ้าย
  2. คลิกสร้างผลิตภัณฑ์แบบเรียกเก็บเงินครั้งเดียว
  3. ป้อนรายละเอียดผลิตภัณฑ์ต่อไปนี้
    • รหัสผลิตภัณฑ์: ป้อนรหัสผลิตภัณฑ์ที่ไม่ซ้ำกัน ป้อน one_time_product_01
    • (ไม่บังคับ) แท็ก: เพิ่มแท็กที่เกี่ยวข้อง
    • ชื่อ: ป้อนชื่อผลิตภัณฑ์ เช่น Product name
    • คำอธิบาย: ป้อนคำอธิบายผลิตภัณฑ์ เช่น Product description
    • (ไม่บังคับ) เพิ่มรูปภาพไอคอน: อัปโหลดไอคอนที่แสดงถึงผลิตภัณฑ์
    หมายเหตุ: คุณสามารถข้ามการกำหนดค่าส่วนภาษี การปฏิบัติตามข้อกำหนด และโปรแกรมได้เพื่อวัตถุประสงค์ของโค้ดแล็บนี้
  4. คลิกถัดไป
  5. เพิ่มตัวเลือกการซื้อและกำหนดค่าความพร้อมจำหน่ายสินค้าระดับภูมิภาค ผลิตภัณฑ์แบบเรียกเก็บเงินครั้งเดียวต้องมีตัวเลือกการซื้ออย่างน้อย 1 รายการ ซึ่งจะกำหนดวิธีการให้สิทธิ์ ราคา และความพร้อมจำหน่ายสินค้าระดับภูมิภาค สำหรับโค้ดแล็บนี้ เราจะเพิ่มตัวเลือกซื้อมาตรฐานสำหรับผลิตภัณฑ์ ในส่วนตัวเลือกการซื้อ ให้ป้อนรายละเอียดต่อไปนี้
    • รหัสตัวเลือกการซื้อ: ป้อนรหัสตัวเลือกการซื้อ เช่น buy
    • ประเภทการซื้อ: เลือกซื้อ
    • (ไม่บังคับ) แท็ก: เพิ่มแท็กที่เฉพาะเจาะจงสำหรับตัวเลือกการซื้อนี้
    • (ไม่บังคับ) คลิกตัวเลือกขั้นสูงเพื่อกำหนดค่าตัวเลือกขั้นสูง คุณข้ามการกำหนดค่าตัวเลือกขั้นสูงได้เพื่อวัตถุประสงค์ของโค้ดแล็บนี้
  6. ในส่วนความพร้อมให้บริการและการกำหนดราคา ให้คลิกกำหนดราคา > แก้ไขราคาแบบเป็นกลุ่ม
  7. เลือกตัวเลือกประเทศ / ภูมิภาค ซึ่งจะเป็นการเลือกทุกภูมิภาค
  8. คลิกต่อไป ซึ่งจะเปิดกล่องโต้ตอบสำหรับป้อนราคา ป้อน 100 บาท แล้วคลิกใช้
  9. คลิกบันทึก แล้วคลิกเปิดใช้งาน ซึ่งจะสร้างและเปิดใช้งานตัวเลือกการซื้อ

สำหรับ Codelab นี้ ให้สร้างผลิตภัณฑ์แบบเรียกเก็บเงินครั้งเดียวเพิ่มเติม 3 รายการโดยใช้รหัสผลิตภัณฑ์ต่อไปนี้

  • consumable_product_01
  • consumable_product_02
  • consumable_product_03

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

เปิดแอปตัวอย่างใน Google Play Console แล้วไปที่สร้างรายได้ด้วย Play > ผลิตภัณฑ์ > ผลิตภัณฑ์แบบเรียกเก็บเงินครั้งเดียว จากนั้นคลิกสร้างผลิตภัณฑ์แบบเรียกเก็บเงินครั้งเดียว แล้วทำซ้ำขั้นตอนที่ 3-9

วิดีโอการสร้างผลิตภัณฑ์แบบเรียกเก็บเงินครั้งเดียว

วิดีโอตัวอย่างต่อไปนี้แสดงขั้นตอนการสร้างไอเทมแบบเรียกเก็บเงินครั้งเดียวที่อธิบายไว้ก่อนหน้านี้

4. ผสานรวมกับ PBL

ตอนนี้เราจะมาดูวิธีผสานรวมแอปกับ Play Billing Library (PBL) ส่วนนี้อธิบายขั้นตอนระดับสูงสำหรับการผสานรวมและแสดงข้อมูลโค้ดสำหรับแต่ละขั้นตอน คุณสามารถใช้ข้อมูลโค้ดเหล่านี้เป็นแนวทางในการติดตั้งใช้งานจริงได้

หากต้องการผสานรวมแอปกับ PBL ให้ทำตามขั้นตอนต่อไปนี้

  1. เพิ่มทรัพยากร Dependency ของ Play Billing Library ลงในแอปตัวอย่าง
    dependencies {
    val billing_version = "8.0.0"
    
    implementation("com.android.billingclient:billing-ktx:$billing_version")
    }
    
  2. เริ่มต้น BillingClient BillingClient คือ SDK ของไคลเอ็นต์ที่อยู่ในแอปและสื่อสารกับ Play Billing Library ข้อมูลโค้ดต่อไปนี้แสดงวิธีเริ่มต้นไคลเอ็นต์การเรียกเก็บเงิน
    protected BillingClient createBillingClient() {
    return BillingClient.newBuilder(activity)
        .setListener(purchasesUpdatedListener)
        .enablePendingPurchases(PendingPurchasesParams.newBuilder().enableOneTimeProducts().build())
        .enableAutoServiceReconnection()
        .build();
    }
    
  3. เชื่อมต่อกับ Google Play ข้อมูลโค้ดต่อไปนี้แสดงวิธีเชื่อมต่อกับ Google Play
    public void startBillingConnection(ImmutableList<Product> productList) {
    Log.i(TAG, "Product list sent: " + productList);
    Log.i(TAG, "Starting connection");
    billingClient.startConnection(
        new BillingClientStateListener() {
          @Override
          public void onBillingSetupFinished(BillingResult billingResult) {
            if (billingResult.getResponseCode() == BillingResponseCode.OK) {
              // Query product details to get the product details list.
              queryProductDetails(productList);
            } else {
              // BillingClient.enableAutoServiceReconnection() will retry the connection on
              // transient errors automatically.
              // We don't need to retry on terminal errors (e.g., BILLING_UNAVAILABLE,
              // DEVELOPER_ERROR).
              Log.e(TAG, "Billing connection failed: " + billingResult.getDebugMessage());
              Log.e(TAG, "Billing response code: " + billingResult.getResponseCode());
            }
          }
    
          @Override
          public void onBillingServiceDisconnected() {
            Log.e(TAG, "Billing Service connection lost.");
          }
        });
    }
    
  4. ดึงข้อมูลผลิตภัณฑ์แบบเรียกเก็บเงินครั้งเดียวหลังจากผสานรวมแอปกับ PBL แล้ว คุณต้องดึงข้อมูลผลิตภัณฑ์แบบเรียกเก็บเงินครั้งเดียวลงในแอป ข้อมูลโค้ดต่อไปนี้แสดงวิธีดึงข้อมูลผลิตภัณฑ์แบบเรียกเก็บเงินครั้งเดียวในแอป
    private void queryProductDetails(ImmutableList<Product> productList) {
    Log.i(TAG, "Querying products for: " + productList);
    QueryProductDetailsParams queryProductDetailsParams =
        QueryProductDetailsParams.newBuilder().setProductList(productList).build();
    billingClient.queryProductDetailsAsync(
        queryProductDetailsParams,
        new ProductDetailsResponseListener() {
          @Override
          public void onProductDetailsResponse(
              BillingResult billingResult, QueryProductDetailsResult productDetailsResponse) {
            // check billingResult
            Log.i(TAG, "Billing result after querying: " + billingResult.getResponseCode());
            // process returned productDetailsList
            Log.i(
                TAG,
                "Print unfetched products: " + productDetailsResponse.getUnfetchedProductList());
            setupProductDetailsMap(productDetailsResponse.getProductDetailsList());
            billingServiceClientListener.onProductDetailsFetched(productDetailsMap);
          }
        });
    }
    
    การดึงข้อมูล ProductDetails จะให้การตอบกลับที่คล้ายกับข้อความต่อไปนี้
    {
        "productId": "consumable_product_01",
        "type": "inapp",
        "title": "Shadow Coat (Yolo's Realm | Play Samples)",
        "name": "Shadow Coat",
        "description": "A sleek, obsidian coat for stealth and ambushes",
        "skuDetailsToken": "<---skuDetailsToken--->",
        "oneTimePurchaseOfferDetails": {},
        "oneTimePurchaseOfferDetailsList": [
            {
                "priceAmountMicros": 1990000,
                "priceCurrencyCode": "USD",
                "formattedPrice": "$1.99",
                "offerIdToken": "<--offerIdToken-->",
                "purchaseOptionId": "buy",
                "offerTags": []
            }
        ]
    },
    {
        "productId": "consumable_product_02",
        "type": "inapp",
        "title": "Emperor Den (Yolo's Realm | Play Samples)",
        "name": "Emperor Den",
        "description": "A fair lair glowing with molten rock and embers",
        "skuDetailsToken": "<---skuDetailsToken--->",
        "oneTimePurchaseOfferDetails": {},
        "oneTimePurchaseOfferDetailsList": [
            {
                "priceAmountMicros": 2990000,
                "priceCurrencyCode": "USD",
                "formattedPrice": "$2.99",
                "offerIdToken": "<--offerIdToken-->",
                "purchaseOptionId": "buy",
                "offerTags": []
            }
        ]
    }
    
  5. เปิดตัวขั้นตอนการเรียกเก็บเงิน
    public void launchBillingFlow(String productId) {
    ProductDetails productDetails = productDetailsMap.get(productId);
    if (productDetails == null) {
      Log.e(
          TAG, "Cannot launch billing flow: ProductDetails not found for productId: " + productId);
      billingServiceClientListener.onBillingResponse(
          BillingResponseCode.ITEM_UNAVAILABLE,
          BillingResult.newBuilder().setResponseCode(BillingResponseCode.ITEM_UNAVAILABLE).build());
      return;
    }
    ImmutableList<ProductDetailsParams> productDetailsParamsList =
        ImmutableList.of(
            ProductDetailsParams.newBuilder().setProductDetails(productDetails).build());
    
    BillingFlowParams billingFlowParams =
        BillingFlowParams.newBuilder()
            .setProductDetailsParamsList(productDetailsParamsList)
            .build();
    
    billingClient.launchBillingFlow(activity, billingFlowParams);
    }
    
  6. ตรวจหาและประมวลผลการซื้อ ในขั้นตอนนี้ คุณต้องทำสิ่งต่อไปนี้
    1. ยืนยันการซื้อ
    2. ให้สิทธิ์แก่ผู้ใช้
    3. แจ้งเตือนผู้ใช้
    4. แจ้งให้ Google ทราบถึงกระบวนการซื้อ
    ในขั้นตอนเหล่านี้ ขั้นตอน a, b และ c ควรดำเนินการในแบ็กเอนด์ของคุณ ดังนั้นจึงอยู่นอกขอบเขตของโค้ดแล็บนี้ ข้อมูลโค้ดต่อไปนี้แสดงวิธีแจ้งให้ Google ทราบเกี่ยวกับผลิตภัณฑ์แบบใช้ครั้งเดียวที่ใช้แล้วหมด
    private void handlePurchase(Purchase purchase) {
    // Step 1: Send the purchase to your secure backend to verify the purchase following
    // https://developer.android.com/google/play/billing/security#verify
    
    // Step 2: Update your entitlement storage with the purchase. If purchase is
    // in PENDING state then ensure the entitlement is marked as pending and the
    // user does not receive benefits yet. It is recommended that this step is
    // done on your secure backend and can combine in the API call to your
    // backend in step 1.
    
    // Step 3: Notify the user using appropriate messaging.
    if (purchase.getPurchaseState() == PurchaseState.PURCHASED) {
      for (String product : purchase.getProducts()) {
        Log.d(TAG, product + " purchased successfully! ");
      }
    }
    
    // Step 4: Notify Google the purchase was processed.
    // For one-time products, acknowledge the purchase.
    // This sample app (client-only) uses billingClient.acknowledgePurchase().
    // For consumable one-time products, consume the purchase
    // This sample app (client-only) uses billingClient.consumeAsync()
    // If you have a secure backend, you must acknowledge purchases on your server using the
    // server-side API.
    // See https://developer.android.com/google/play/billing/security#acknowledge
    if (purchase.getPurchaseState() == PurchaseState.PURCHASED && !purchase.isAcknowledged()) {
    
      if (shouldConsume(purchase)) {
        ConsumeParams consumeParams =
            ConsumeParams.newBuilder().setPurchaseToken(purchase.getPurchaseToken()).build();
        billingClient.consumeAsync(consumeParams, consumeResponseListener);
    
      } else {
        AcknowledgePurchaseParams acknowledgePurchaseParams =
            AcknowledgePurchaseParams.newBuilder()
                .setPurchaseToken(purchase.getPurchaseToken())
                .build();
        billingClient.acknowledgePurchase(
            acknowledgePurchaseParams, acknowledgePurchaseResponseListener);
      }
     }
    }
    

5. วิเคราะห์การเลิกทำกลางคันระหว่างการซื้อ

ที่ผ่านมาในโค้ดแล็บ การตอบกลับการเรียกเก็บเงินของ Play มุ่งเน้นไปที่สถานการณ์ที่จำกัด เช่น การตอบกลับ USER_CANCELLED, BILLING_UNAVAILABLE, OK และ ITEM_ALREADY_OWNED อย่างไรก็ตาม การเรียกเก็บเงินของ Play สามารถแสดงรหัสการตอบกลับที่แตกต่างกัน 13 รายการ ซึ่งอาจเกิดจากปัจจัยต่างๆ ในโลกแห่งความเป็นจริง

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

รหัสข้อผิดพลาดในการตอบกลับ USER_CANCELED

รหัสการตอบกลับนี้บ่งชี้ว่าผู้ใช้ละทิ้ง UI ของขั้นตอนการซื้อก่อนที่จะทำการซื้อให้เสร็จสมบูรณ์

สาเหตุที่เป็นไปได้

คุณทำอะไรได้บ้าง

  • อาจบ่งบอกถึงผู้ใช้ที่มีความตั้งใจต่ำซึ่งมีความอ่อนไหวต่อราคา
  • การซื้ออยู่ระหว่างรอดำเนินการหรือการชำระเงินถูกปฏิเสธ

รหัสข้อผิดพลาดในการตอบกลับ BILLING_UNAVAILABLE

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

สาเหตุที่เป็นไปได้

คุณทำอะไรได้บ้าง

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

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

กลยุทธ์การลองอีกครั้งสำหรับรหัสข้อผิดพลาดในการตอบกลับ

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

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

ดูข้อมูลโดยละเอียดเกี่ยวกับรหัสการตอบกลับที่เฉพาะเจาะจงและกลยุทธ์การลองใหม่ที่แนะนำที่เกี่ยวข้องได้ที่จัดการรหัสการตอบกลับ BillingResult

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

เอกสารอ้างอิง

7. ยินดีด้วย

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

แบบสำรวจ

ความคิดเห็นของคุณเกี่ยวกับ Codelab นี้มีค่าอย่างยิ่ง โปรดสละเวลาสักครู่เพื่อตอบแบบสำรวจของเรา