8

Tôi đang sử dụng mã hiện mua để gọi ý định muaTrong App Lỗi mua hàng trong mã tĩnh

Bundle buyIntentBundle = mService.getBuyIntent(3, pContext.getPackageName(), "android.test.canceled", "inapp", "bGoa+V7g/yqDXv"); 
Set<String> allKeys = buyIntentBundle.keySet(); 
Object responseCode= buyIntentBundle.get("RESPONSE_CODE"); 
Object intent= buyIntentBundle.get("BUY_INTENT"); 
Log.i(TAG,"buyIntentBundle"+buyIntentBundle.keySet()+"responseCode"+responseCode+"intent"+intent); 
PendingIntent pendingIntent = buyIntentBundle.getParcelable("BUY_INTENT"); 
if (pendingIntent != null) { 
    pContext.startIntentSenderForResult(pendingIntent.getIntentSender(), 2013, new Intent(), Integer.valueOf(0), Integer.valueOf(0),Integer.valueOf(0)); 
} 

Bây giờ onActivityResult tôi đang kiểm tra

if (requestCode == 2013) {   
    Log.i(TAG, "onactivity result called inside request code"); 
    int responseCode = intent.getIntExtra("RESPONSE_CODE", 0); 
    String purchaseData = intent.getStringExtra("INAPP_PURCHASE_DATA"); 
    String dataSignature = intent.getStringExtra("INAPP_DATA_SIGNATURE");  
    if (responseCode == Constants.BILLING_RESPONSE_RESULT_OK) { 
    try { 
     JSONObject jo = new JSONObject(purchaseData); 
     String sku = jo.getString("productId"); 
     Toast.makeText(pContext, "You have bought the " + sku + ". Excellent choice, adventurer!", Toast.LENGTH_SHORT); 
     JSONObject o = new JSONObject(purchaseData); 
     String mOrderId = o.optString("orderId"); 
     String mPackageName = o.optString("packageName"); 
     String mSku = o.optString("productId"); 
     long mPurchaseTime = o.optLong("purchaseTime"); 
     int mPurchaseState = o.optInt("purchaseState"); 
     String mDeveloperPayload = o.optString("developerPayload"); 
     String mToken = o.optString("token", o.optString("purchaseToken")); 
     try { 
      mService.consumePurchase(3, pContext.getPackageName(), mToken); 
     } catch (RemoteException e) { 
        e.printStackTrace(); 
     }//consumePurchase 
    } 
    catch (JSONException e) { 
       Toast.makeText(pContext, "Failed to parse purchase data.", Toast.LENGTH_SHORT); 
       e.printStackTrace(); 
    } 
    }else if (responseCode == Constants.BILLING_RESPONSE_RESULT_USER_CANCELED) { 
     Toast.makeText(pContext, "User cancelled purchase.", Toast.LENGTH_SHORT); 
    }else if (responseCode == Constants.BILLING_RESPONSE_RESULT_BILLING_UNAVAILABLE) { 
     Toast.makeText(pContext, "Your Device doesn't support inapp billing.", Toast.LENGTH_SHORT); 
    }else if (responseCode == Constants.BILLING_RESPONSE_RESULT_ITEM_UNAVAILABLE) { 
     Toast.makeText(pContext, "Item is not available for billing.", Toast.LENGTH_SHORT); 
    }else if (responseCode == Constants.BILLING_RESPONSE_RESULT_DEVELOPER_ERROR) { 
     Toast.makeText(pContext, "Can't purchase item due to some developer error.", Toast.LENGTH_SHORT); 
    }else if (responseCode == Constants.BILLING_RESPONSE_RESULT_ERROR) { 
     Toast.makeText(pContext, "Can't purchase item due to some error in response.", Toast.LENGTH_SHORT); 
    }else if (responseCode == Constants.BILLING_RESPONSE_RESULT_ITEM_ALREADY_OWNED) { 
     Toast.makeText(pContext, "You already own this item.", Toast.LENGTH_SHORT); 
    }else if (responseCode == Constants.BILLING_RESPONSE_RESULT_ITEM_NOT_OWNED) { 
     Toast.makeText(pContext, "You don't own this item.", Toast.LENGTH_SHORT); 
    } 
} 

Kể từ khi tôi đang kêu gọi "android.test.canceled "vì vậy tôi sẽ nhận được BILLING_RESPONSE_RESULT_USER_CANCELED phản hồi này nhưng nó cho thấy là thanh toán thành công và trả về responseCode là BILLING_RESPONSE_RESULT_OK không có tham số khác trong intent.getExtras đó. Tôi đang thử phản hồi tĩnh http://developer.android.com/google/play/billing/billing_testing.html#billing-testing-static

Cảm ơn & Kính trọng !!

+0

Tôi đã nhầm lẫn bởi hành vi tương tự và tôi nghĩ rằng các nhà phát triển Android thực sự nên sửa đổi mã. Nếu bạn (hoặc bất kỳ ai khác) vẫn cần kiểm tra phản hồi user_cancelled, chỉ cần nhấn backspace. Mã phản hồi sẽ là BILLING_RESPONSE_RESULT_USED_CANCELED. – artsince

Trả lời

3

Bạn chưa kiểm tra:

if (resultCode == Activity.RESULT_OK) { 
    .... 
} 

Có thể là quá trình không hoàn thành. Và kể từ khi giá trị mặc định cho responseCode trong trường hợp đó chìa khóa "RESPONSE_CODE" là không có mặt trong intent là "0" ....

int responseCode = intent.getIntExtra("RESPONSE_CODE", 0); 

.... responseCode được khởi tạo để Constants.BILLING_RESPONSE_RESULT_OK ==>0.

Hãy thử sử dụng:

int responseCode = intent.getIntExtra("RESPONSE_CODE", -1); 

Và thêm một else khối cuối cùng để xử lý -1.

+0

ResultCode bằng RESULT_OK khi sử dụng android.test.canceled – Thys

+0

@MrThys Ok. Bạn đã thử sử dụng 'int responseCode = intent.getIntExtra (" RESPONSE_CODE ", -1);'. 'ResponseCode' có còn khởi tạo' 0' không? – Vikram

+0

Jep, tôi đã đặt mặc định là -1 và vẫn trả về 0 – Thys

Các vấn đề liên quan