我们正在准备一个firebase触发器来处理Android的实时开发人员通知,我们必须使用Google Play Developer API来了解用户订阅的详细信息.因此,我们在Google Play控制台中关联了firebase服务帐户,并授予了必要的访问权限.
我们使用谷歌的nodejs库为googleapis(github链接)编写了一段代码,如下所示:
return google.auth.getClient({
keyFile: path.join(__dirname, './service-account.json'),
scope: 'https://www.googleapis.com/auth/androidpublisher'
}) .then((client) => {
const androidpublisher = google.androidpublisher({
version: 'v3',
auth: client
});
const params = {
packageName: ANDROID_PACKAGE_NAME,
subscriptionId: ANDROID_SUBSCRIPTIONID,
token: token
};
return androidpublisher.purchases.subscriptions.get(params)
.then(res => {
console.log(`The response is ${res.data}`);
return null;
})
.catch(error => {
console.error(error);
});
});
Run Code Online (Sandbox Code Playgroud)
但它返回一个错误状态:'无效的凭据',我对此有点失落.我已经使用curl测试了API和授权令牌,它也显示了401错误响应.
我不确定我的流程是否正确,有人能给我任何建议吗?
google-api node.js google-play-developer-api android-inapp-purchase google-cloud-functions
我已经浏览了Play计费库 https://developer.android.com/google/play/billing/billing_library_overview。 您必须在三天内确认所有购买。如果未正确确认购买,将导致这些购买被退款。该过程没有明确说明如何确认购买。这就是我尝试过的方法吗?提前致谢
@Override
public void onPurchasesUpdated(BillingResult billingResult, @Nullable List<Purchase> purchases) {
if(billingResult.getResponseCode()== BillingClient.BillingResponseCode.OK&&purchases!=null){
Toast.makeText(this, "Purchase Successful", Toast.LENGTH_SHORT).show();
for(Purchase purchase:purchases){
handlePurchase(purchase);
}
}else if(billingResult.getResponseCode()== BillingClient.BillingResponseCode.USER_CANCELED){
Toast.makeText(this, "Purchase Cancelled", Toast.LENGTH_SHORT).show();
}else if(billingResult.getResponseCode()== BillingClient.BillingResponseCode.ITEM_ALREADY_OWNED){
Toast.makeText(this, "Already Purchased", Toast.LENGTH_SHORT).show();
} else{
Toast.makeText(this, billingResult.getDebugMessage(), Toast.LENGTH_SHORT).show();
}
//in handlePurchase()
if(!purchase.isAcknowledged())
{
AcknowledgePurchaseParams acknowledgePurchaseParams
= AcknowledgePurchaseParams.newBuilder()
.setPurchaseToken(purchase.getPurchaseToken())
.setDeveloperPayload(purchase.getDeveloperPayload())
.build();
client.acknowledgePurchase(acknowledgePurchaseParams, new AcknowledgePurchaseResponseListener() {
@Override
public void onAcknowledgePurchaseResponse(BillingResult billingResult) {
if(billingResult.getResponseCode()== BillingClient.BillingResponseCode.OK){
Toast.makeText(RemoveAdsActivity.this, "Purchase Acknowledged", Toast.LENGTH_SHORT).show();
}
}
});
}
Run Code Online (Sandbox Code Playgroud) android in-app-purchase in-app-billing android-inapp-purchase
Google带来了入门价格的想法(https://support.google.com/googleplay/android-developer/answer/140504?hl=en).
我的问题与其API有关.我无法通过Purchases.subscriptions找到如何获取相关信息的方式(https://developers.google.com/android-publisher/api-ref/purchases/subscriptions/get)
即使我购买了入门价格的订阅,我向Google Play Developer API询问了有关该订阅的信息,但我只看到了全价.
即使是inappproduct/get也没有关于某些产品的介绍价格的任何信息.
你知道如何获得合适的价格吗?谢谢
我使用的是Google Play结算库2.0.3(implementation 'com.android.billingclient:billing:2.0.3'),它在大多数情况下都可以正常运行,但是对于某些用户,原因未知,querySkuDetailsAsync() method occasionally fails with BillingResponseCode.ERROR (6) error code...
有人知道吗?除了“ API操作期间发生致命错误”之外,其他任何地方都未说明此错误的原因。谁能说出为什么会这样吗?
编辑: 我正在使用文档中的方法(https://developer.android.com/google/play/billing/billing_library_overview):
public interface QuerySkuDetailsListener {
void onSuccess(List<SkuDetails> skuDetailsList);
void onErrorProductsHaveDifferentTypes();
void onBillingClientError(int error_code);
}
public void querySkuDetails(final QuerySkuDetailsListener querySkuDetailsListener, final Product... products) {
if (products.length < 1) {
//ERROR_NO_PRODUCTS_TO_QUERY
throw new NullPointerException();
}
String querySkuType = products[0].getSkuType();
SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
List<String> skuList = new ArrayList<>();
for (Product product : products) {
skuList.add(product.getSku());
if (!product.getSkuType().equals(querySkuType)) {
//ERROR_SKU_TYPE_CANT_BE_DIFFERENT
querySkuDetailsListener.onErrorProductsHaveDifferentTypes();
return; …Run Code Online (Sandbox Code Playgroud) android response in-app-billing android-inapp-purchase play-billing-library
当我使用“慢速测试卡,几分钟后批准”时,Android 的实时开发人员通知会起作用。我通过 pub/sub 在我的服务器上收到两个通知。一种是当购买已完成并且其中包含令牌和订单时的消费状态:0 时。第二个通知,在它被消费后,带有 token 和 order ,其中有消费状态:1。正是我想要和期望的。
但是,当我使用“测试卡,始终批准”购买相同的一次性消费品时,我根本没有收到任何“实时开发人员通知”。
我是唯一经历过这种行为的人吗?这是设计使然吗?如何随时收到通知?
android in-app-purchase in-app-billing google-cloud-pubsub android-inapp-purchase
我已经实现in-app purchase了subscription产品,它工作正常.我为每种产品设定了1个月的订阅,并在1个月后续订.
现在我的问题是有没有办法获得更新的产品清单和续订日期?
谷歌是否提供任何类型的服务或活动,通过这些服务或活动我们可以了解更新.
我不确切知道bug的位置,我认为它在Play商店,但我猜它可能是Google Play服务.
基本上,手机上有帐户X和Y的用户将使用帐户X在我的应用程序上进行应用程序内购买.然后我将分阶段推出更新,并且将该应用程序安装为帐户X的用户突然将获得帐户Y的更新,应用程序将无法识别已购买的应用内商品.
我与其他开发人员讨论了类似的应用内模型,他们遇到了同样的错误.
我在哪里提交该bug?
谢谢.
android in-app-purchase google-play google-play-services android-inapp-purchase
我现在正在使用新的Play Billing Library
基本上,我按照文档查询要购买的可用项目
SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
params.setSkusList(skuList).setType(itemType);
mBillingClient.querySkuDetailsAsync(params.build(),
new SkuDetailsResponseListener() {
@Override
public void onSkuDetailsResponse(int responseCode,
List<SkuDetails> skuDetailsList) {
listener.onSkuDetailsResponse(responseCode, skuDetailsList);
}
Run Code Online (Sandbox Code Playgroud)
但是,responseCode为0,列表也为空.但我检查了BillingSetupFinished是否成功.提供给SkuDetailsParams.Builder的skuList不为空,skuList(sku_id)中的值也与Google Play控制台上指定的产品ID相同.
有谁知道原因?谢谢!!
android android-billing android-inapp-purchase play-billing-library
该示例应用程序是在谷歌开发者指南是指有一个名为方法verifyValidSignature(),看起来像这样的BillingManager类:
/**
* Verifies that the purchase was signed correctly for this developer's public key.
*
* Note: It's strongly recommended to perform such check on your backend since hackers can
* replace this method with "constant true" if they decompile/rebuild your app.
*/
private boolean verifyValidSignature(String signedData, String signature) {
try {
return Security.verifyPurchase(BASE_64_ENCODED_PUBLIC_KEY, signedData, signature);
} catch (IOException e) {
Log.e(TAG, "Got an exception trying to validate a purchase: " …Run Code Online (Sandbox Code Playgroud) android in-app-purchase in-app-billing android-billing android-inapp-purchase
我正在使用 Google 的应用内结算。(版本 2.2.0)
我在应用程序类中使用以下代码开始计费连接:
billingClient = BillingClient.newBuilder(Application.getInstance()).setListener(this).enablePendingPurchases().build()
billingClient.startConnection(this)
Run Code Online (Sandbox Code Playgroud)
使用上述代码成功连接计费服务。
但我观察到市场上的一个问题,即 onBillingServiceDisconnected()在几秒钟内被多次调用。根据我们的内部分析,大约 13% 的用户在 5 秒内收到了 2 个或更多 onBillingServiceDisconnected() 调用。正如谷歌文档所建议的那样,我尝试使用billingClient.startConnection(this)重新连接 onBillingServiceDisconnected() 内的服务 ,之后服务再次连接,但又断开连接。
如此多的用户如此频繁的服务中断背后的原因可能是什么?
它也会导致付款问题吗?
payment android in-app-purchase in-app-billing android-inapp-purchase