来自Android In App Billing版本3(TrivialDrive)的示例应用程序随附sdk
/* base64EncodedPublicKey should be YOUR APPLICATION'S PUBLIC KEY
* (that you got from the Google Play developer console). This is not your
* developer public key, it's the *app-specific* public key.
*
* Instead of just storing the entire literal string here embedded in the
* program, construct the key at runtime from pieces or
* use bit manipulation (for example, XOR with some other string) to hide
* the actual key. The key itself …Run Code Online (Sandbox Code Playgroud) 我有一个应用程序发布到alpha通道,有一个应用程序内(非)托管项目,成本为1美元.
当我正常购买时,即使用信用卡/借记卡Google返回正确的开发者有效负载字符串,但如果我选择"兑换"促销代码并输入所述代码,Google会返回一个空的开发人员有效负载字符串,因此身份验证失败'onIabPurchaseFinished()'.
我应该提一下,只有当我选择从应用程序的购买流程中兑换代码时才会出现这种情况,如果我先打开Play商店,兑换代码,然后返回并打开应用程序,一切都会完美无缺.
这是谷歌的一个错误吗?
编辑:Play商店的东西是预期的,因为它无法知道您的有效负载,购买完成后无需检查.
我的应用内结算代码工作正常,直到我升级到Android L Dev Preview.现在,当我的应用程序启动时出现此错误.有没有人知道L导致了什么变化或者我应该如何更改我的代码来解决这个问题?
android {
compileSdkVersion 'android-L'
buildToolsVersion '20'
defaultConfig {
minSdkVersion 13
targetSdkVersion 'L'
...
...
compile 'com.google.android.gms:play-services:5.+'
compile 'com.android.support:support-v13:21.+'
compile 'com.android.support:appcompat-v7:21.+'
...
...
Run Code Online (Sandbox Code Playgroud)
应用启动时的错误:
06-29 16:22:33.281 5719-5719/com.tbse.wnswfree D/AndroidRuntime? Shutting down VM
06-29 16:22:33.284 5719-5719/com.tbse.wnswfree E/AndroidRuntime? FATAL EXCEPTION: main
Process: com.tbse.wnswfree, PID: 5719
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.tbse.wnswfree/com.tbse.wnswfree.InfoPanel}: java.lang.IllegalArgumentException: Service Intent must be explicit: Intent { act=com.android.vending.billing.InAppBillingService.BIND }
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2255)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2317)
at android.app.ActivityThread.access$800(ActivityThread.java:143)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1258)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5070)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372) …Run Code Online (Sandbox Code Playgroud) android illegalargumentexception android-intent in-app-billing android-5.0-lollipop
编辑:Android现在支持应用内结算!
原始问题:
看起来Android本身不支持应用程序内购买一段时间,而当它确实存在时,可能会有庞大的用户群,其设备不支持它们.
如果可能,使用Android Market在Android中实现类似iPhone的(额外内容或服务)应用内购买的最佳方式是什么?
解决方案应特别考虑:
谢谢!
编辑4月15日:在IabHelper中捕获nullpointer似乎已经停止了这个问题.我不再看到被抛出的异常,我将接受这个作为答案.
编辑4/04:稍微深入一点.有try catch块可以处理queryPurchases方法的RemoteExceptions和JSONExceptions,但是没有NullPointerException处理.我将尝试包括NullPointer异常处理,因此IabHelper在尝试querySkuDetails时看起来像这样:
catch (NullPointerException e) {
throw new IabException(IABHELPER_UNKNOWN_ERROR, "NullPointer while refreshing inventory.", e);
}
Run Code Online (Sandbox Code Playgroud)
我刚刚提交了一个错误:
https://code.google.com/p/marketbilling/issues/detail?id=114
编辑3/25: 好吧,仍然收到这个崩溃...现在它发生在尝试从IabHelper的以下摘录的第3行获取上下文时:
int queryPurchases(Inventory inv, String itemType) throws JSONException, RemoteException {
logDebug("Querying owned items, item type: " + itemType);
logDebug("Package name: " + mContext.getPackageName());
Run Code Online (Sandbox Code Playgroud)
这很令人沮丧,因为在我的清单中,我总是使用我的应用程序的完整路径名称"name".
示例"com.myappname.blah.ClassName"
我也尝试将这个,MyClass.this,getApplicationContext()传递给mHelper.但是它们都会从野外设备中随机生成相同的NullPointer结果.我还在清单中尝试了name =".MyClass".这就是目前的样子:
mHelper = new IabHelper(MyClass.this, myKey);
Run Code Online (Sandbox Code Playgroud)
编辑 3/18/13:我仍然收到异常,即使在3/17上部署了新的IabHelper版本.
我开始在这里看到一个模式,崩溃是在执行mContext.getPackageName()时尝试获取上下文的全部内容.我很好奇为什么它适用于我的所有测试设备,我无法重现这种崩溃,而且似乎只是在少数设备上.
这是新的崩溃:
java.lang.NullPointerException
at com.myapp.util.IabHelper.queryPurchases(SourceFile:836)
at com.myapp.util.IabHelper.queryInventory(SourceFile:558)
at com.myapp.util.IabHelper.queryInventory(SourceFile:522)
at com.myapp.util.IabHelper$2.run(SourceFile:617)
at java.lang.Thread.run(Thread.java:1019)
Run Code Online (Sandbox Code Playgroud)
由IabHelper引起的......
line 836: logDebug("Package name: " + mContext.getPackageName());
Run Code Online (Sandbox Code Playgroud)
编辑 3/17/13:我看到过去几个月发布了很多错误修复,我将尝试这里提供的最新代码,看看这是否能解决问题:
在我的某个应用中,我使用的是结算API和随附的样板代码. …
我目前正在测试我的InApp计费机制(使用InApp Billing版本3 API,因此将TrivialDrive示例作为参考).
我有一个托管项目,即升级到高级版本.
现在,使用我的测试帐户购买该项目是有效的,但是当我之后在Google结帐中取消整个订单时,我的代码仍然告诉我该项目已购买,因此授予高级功能.
以下是我在MainActivity中检查购买的方法.我不会在某处本地保存购买状态,因为据我所知,使用billing API v3,您可以根据需要查询特定购买.
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
iabHelper = new IabHelper(this, Helper.getPKey());
iabHelper.enableDebugLogging(true);
iabHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
@Override
public void onIabSetupFinished(IabResult result) {
Log.d("IAB", "SETUP FINISHED");
if(!result.isSuccess())
{
Log.d("IAB", "SETUP NOT OK");
return;
}
else
Log.d("IAB", "SETUP OK");
iabHelper.queryInventoryAsync(
new QueryInventoryFinishedListener() {
@Override
public void onQueryInventoryFinished(IabResult result, Inventory inv) {
Log.d("IAB", "Query inventory finished.");
if (result.isFailure()) {
Log.d("IAB","Failed to query inventory: " + result);
return;
}
Log.d("IAB", "Query inventory …Run Code Online (Sandbox Code Playgroud) 发布应用内购买的促销代码似乎会阻止应用(再次)执行远程服务器购买验证!
当促销代码用于应用内购买(PURCHASES_UPDATED广播)时,它将完全绕过购买流程,因此应用程序无法提供用于远程验证的"developerPayload".
稍后,当应用程序调用getPurchases()来获取/验证所有者产品时,促销购买的购买数据"developerPayload"当然不会包含,但"orderId"对于使用Google Play Developer API进行远程验证也不会有用.
应用程序如何验证使用促销代码进行的应用内购买?
允许用户通过Google Play商店应用/网站兑换促销代码,从而绕过购买流程,这似乎是一项无法实现的重大疏忽.
问题报告:
类似帖子:
这是我第一次在android中处理In-App Billing 1)我正在使用API v3 2)我已上传我的应用程序的alpha版本,以便能够测试然后

3)我创建了一个订阅产品

4)这是我在产品中订阅的代码
mSubscribeButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
try {
Bundle subscribeIntentBundle = mService.getBuyIntent(3, getPackageName(), "my_product_id", "subs", "bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ");
PendingIntent pendingIntent = subscribeIntentBundle.getParcelable("BUY_INTENT");
if (subscribeIntentBundle.getInt("RESPONSE_CODE") == 0) {
startIntentSenderForResult(pendingIntent.getIntentSender(), 4002, new Intent(), Integer.valueOf(0), Integer.valueOf(0), Integer.valueOf(0));
} else {
Toast.makeText(MainActivity.this, "Error Code: " + subscribeIntentBundle.getInt("RESPONSE_CODE"), Toast.LENGTH_SHORT).show();
}
} catch (RemoteException e) {
e.printStackTrace();
} catch (SendIntentException e) {
e.printStackTrace();
}
}
});
Run Code Online (Sandbox Code Playgroud)
5)我收到以下错误

我尝试使用不同的设备并且都有相同的错误,我也使用我的Google帐户登录,可以打开Google Play商店并查看我的应用
我还试图从应用管理器中清除Google Play商店的数据
有人可以帮忙吗?
android in-app-purchase in-app-billing google-play google-play-services
我已经实现了应用内结算,但我遇到了一个问题.这就是我所看到的.
我在网上找到了一些关于此的信息. http://www.google.com/support/forum/p/Android+Market/thread?tid=375490c831e02ab5&hl=zh-CN http://code.google.com/p/marketbilling/issues/detail?id=39
我联系了谷歌并得到了一个他们正在研究的汽车人回应.
但是,我想知道是否有任何我可以做的事情导致这一点.
哦,我也确保我的PendingIntent很好.我有成功的订单.
更新: 这是给我看到这个的客户的股票电子邮件.看来Android Market已经越来越好了,因为无论如何我现在越来越少.
你好,
遗憾的是,此"待处理订单"错误是我无法控制的Android电子市场中的错误.
为帮助他们提高此问题的优先级,请通过以下网络表单与Google联系. http://www.google.com/support/androidmarket/bin/request.py?contact_type=market_phone_tablet
您可以告诉他们参考错误5126349,这是他们的内部跟踪号码.
从今年9月30日(本月底)开始,Google不允许销售使用应用内结算的应用和开发者的开发者展示他们的应用,而不会显示他们的地址.这是他们写的:
添加实际联系地址从2014年9月30日开始,您需要在"设置"页面中添加实际地址.添加地址后,您可以在应用的详细信息页面上向Google Play上的所有用户显示该地址.如果您的实际地址发生变化,请务必在"设置"页面上更新您的信息.
如果您通过应用内购买付费应用或应用,则必须提供实际地址,以便您可以与该内容的销售商联系,以遵守消费者保护法.如果您未在自己的帐户中提供实际地址,则可能会导致您的应用从Play商店中移除.
有很多关于这个新要求的文章:
甚至有请愿反对它,在这里:
我已经要求在这里找到解决方案.
由于我没有真正的公司,我不喜欢我实际需要发布我的家庭住址的事实.
对我来说,这是一个隐私问题,因为我并不总是在家里使用应用程序(加上它更像是一种爱好).
我的应用程序是免费使用的,它的应用内结算仅用于删除广告.而已.
在使用应用内结算时,它不会添加任何功能,用户可以自由支付任何他想要的费用作为捐赠.
我不想发布我的地址,根据我读过的内容,你甚至不能使用邮政信箱(无论如何要花钱),因为他们特别要求"实际地址"而不是"邮政地址".
由于我可能无法使用Google的应用内结算并避免使用我的家庭住址,因此使用其他公司的其他服务是否可行(并且合法且根据Google规则)?
如果是这样,哪些公司提供类似的服务?
如果没有,是否有任何替代方案或解决方案?
可能有一个解决方法或漏洞,允许我发布这样的应用程序,但没有理由发布我的家庭地址?