Google已升级至IAB3(In App Billing第3版)。
首先,错过示例代码中的问题.. super.onDestroy()
。
我在http://developer.android.com/google/play/billing/billing_integrate.html
的帮助下实施了v3它在手机上测试,在模拟器中不起作用。它卡在模拟器中。
我的问题是,我没有看到用于恢复交易的API。如何使用IAB3恢复购买?是mService.getPurchases(apiVersion, packageName, type, continuationToken)
。有没有人测试过这个?这是从本地存储的商品返回购买的商品还是恢复购买的商品?
卸载应用程序没有continuationToken
。它应该是null
吗?
购买状态何时发生变化?
请帮忙!
提前致谢。
编辑:
Google已更新In app结算库并解决了super.onDestroy()
问题。
他们还增加了一些额外的功能。
答案 0 :(得分:3)
要制作商品耗材,您必须发送消费请求,您必须在单独的线程中执行此操作。
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 1111) {
int responseCode = data.getIntExtra("RESPONSE_CODE", 0);
String purchaseData = data.getStringExtra("INAPP_PURCHASE_DATA");
String dataSignature = data.getStringExtra("INAPP_DATA_SIGNATURE");
Logger.printMessage(TAG, "on activity result reponse"
+ responseCode, Logger.DEBUG);
if (resultCode == RESULT_OK && responseCode == 0) {
try {
JSONObject jo = new JSONObject(purchaseData);
String sku = jo.getString("productId");
String title = jo.getString("title");
addChipsToBalance(sku);
final String token = jo.getString("purchaseToken");
Toast.makeText(BuyChipsActivity.this,
"You have bought " + title + ". Enjoy the game!",
Toast.LENGTH_SHORT).show();
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
Logger.printMessage(TAG, "inside run", Logger.DEBUG);
try {
int response = mService.consumePurchase(3,
getPackageName(), token);
Logger.printMessage(TAG, "inside run response"
+ response, Logger.DEBUG);
} catch (RemoteException e) {
// TODO Auto-generated catch block
Logger.printMessage(TAG, "exception here 1",
Logger.DEBUG);
e.printStackTrace();
}
}
}).start();
// alert("You have bought the " + sku +
// ". Excellent choice, adventurer!");
} catch (JSONException e) {
// alert("Failed to parse purchase data.");
e.printStackTrace();
}
}
}
但有时消费请求未在Google端完成,因此您可能想查询购买的商品列表并将其与购买令牌一起使用。我确实喜欢这个
private void showPreviousPurchases() {
Logger.printMessage(TAG, "previous purchases", Logger.DEBUG);
if (mService == null) {
Toast.makeText(this, "Something Went Wrong. Try later",
Toast.LENGTH_LONG).show();
return;
}
Bundle ownedItems = null;
;
try {
ownedItems = mService.getPurchases(3, getPackageName(), "inapp",
null);
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (ownedItems == null) {
Logger.printMessage(TAG, "criical error ", Logger.DEBUG);
return;
}
int response = ownedItems.getInt("RESPONSE_CODE");
if (response == 0) {
ArrayList<String> ownedSkus = ownedItems
.getStringArrayList("INAPP_PURCHASE_ITEM_LIST");
ArrayList<String> purchaseDataList = ownedItems
.getStringArrayList("INAPP_PURCHASE_DATA_LIST");
/* ArrayList<String> signatureList = ownedItems
.getStringArrayList("INAPP_DATA_SIGNATURE");
String continuationToken = ownedItems
.getString("INAPP_CONTINUATION_TOKEN");*/
for (int i = 0; i < purchaseDataList.size(); ++i) {
String purchaseData = purchaseDataList.get(i);
Logger.printMessage(TAG, "json = " + purchaseData,
Logger.DEBUG);
// String signature = signatureList.get(i);
String sku = ownedSkus.get(i);
addChipsAndMakeItConsumable(purchaseData);
// do something with this purchase information
// e.g. display the updated list of products owned by user
}
// if continuationToken != null, call getPurchases again
// and pass in the token to retrieve more items
}
}
private void addChipsAndMakeItConsumable(String purchaseData) {
try {
JSONObject jo = new JSONObject(purchaseData);
String sku = jo.getString("productId");
// String title = jo.getString("title");
addChipsToBalance(sku);
final String token = jo.getString("purchaseToken");
Logger.printMessage(TAG, "id = " + sku, Logger.DEBUG);
Logger.printMessage(TAG, "inside run", Logger.DEBUG);
try {
int response = mService.consumePurchase(3, getPackageName(),
token);
Logger.printMessage(TAG, "inside run response" + response,
Logger.DEBUG);
} catch (RemoteException e) {
// TODO Auto-generated catch block
Logger.printMessage(TAG, "exception here 1", Logger.DEBUG);
e.printStackTrace();
}
// alert("You have bought the " + sku +
// ". Excellent choice, adventurer!");
} catch (JSONException e) {
// alert("Failed to parse purchase data.");
e.printStackTrace();
}
}
答案 1 :(得分:0)
在您的/ android-sdk / extras / google / play_billing / samples /中的IabHelper.java示例中输入此代码以获取用户已购买的所有项目。这将返回购买数据的JSON数组。您还可以使用Purchase.java进行解析,也可以在samples文件夹中使用。
public ArrayList<String> getAllPurchases() throws RemoteException{
Bundle ownedItems = mService.getPurchases(3, mContext.getPackageName(),"inapp", null);
int response = getResponseCodeFromBundle(ownedItems);
logDebug("Owned items response: " + String.valueOf(response));
if (response != BILLING_RESPONSE_RESULT_OK) {
logDebug("getPurchases() failed: " + getResponseDesc(response));
}
if (!ownedItems.containsKey(RESPONSE_INAPP_ITEM_LIST)
|| !ownedItems.containsKey(RESPONSE_INAPP_PURCHASE_DATA_LIST)
|| !ownedItems.containsKey(RESPONSE_INAPP_SIGNATURE_LIST)) {
logError("Bundle returned from getPurchases() doesn't contain required fields.");
}
ArrayList<String> purchaseDataList = ownedItems.getStringArrayList(RESPONSE_INAPP_PURCHASE_DATA_LIST);
return purchaseDataList;
}
进入您的主要活动
public class MainActivity extends Activity{
private IabHelper mHelper;
private String arrayString;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mHelper = new IabHelper(this,"YOUR PUBLIC KEY" );
mHelper.enableDebugLogging(true);
mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
public void onIabSetupFinished(IabResult result) {
if (!result.isSuccess()) { // Oh noes, there was a problem.
Toast.makeText(this,"Problem setting up in-app billing: " + result,Toast.LENGTH_LONG).show();
return;
}
arrayString=mHelper.getAllPurchases().toString();
Log.d("Purchases: ",""+arrayString);
array = new JSONArray(arrayString);
for (int i = 0; i < array.length(); i++) {
JSONObject row = array.getJSONObject(i);
productId=row.getString("productId"); //this will get the product id's that has been purchased.
Log.e("To be restored:", " PRODUCT ID's "+productId);
}
});
}
}
我希望这会对你有所帮助。 ^ _ ^谢谢。