我的一些用户告诉我,我的应用程序时不时会忘记购买的订阅。它会工作 3-4 天,然后就会忘记它们。这是一个非常重要的问题,因为用户可能怀疑存在欺诈行为。我正在使用计费库 4.0.0,并且我已经按照 Google 的指南实现了计费逻辑。
据我所知,当由于某种原因计费服务连接中断时,就会发生这种情况。(以Play商店正在更新为例)
我已设法通过以下方式复制此场景
- Disable internet connection
- Clearing Play Store app data
- Fresh launch of my app.
- Call billingClient.startConnection()
onBillingSetupFinished called with responseCode BILLING_UNAVAILABLE
user sees -> The app says "no subscription purchased"
- Enable internet connection
- re-initialize BillingClient.
onBillingSetupFinished called with responseCode OK. billingClient.isReady() returns true.
- Call billingClient.queryPurchasesAsync() and billingClient.querySkuDetailsAsync().
onSkuDetailsResponse is called with the skuDetailsList filled with all the proper data. However:
onQueryPurchasesResponse is called with empty purchase …Run Code Online (Sandbox Code Playgroud) 我想知道你能帮忙吗?我按照https://developer.android.com/google/play/billing/integrate上的说明进行操作,但我似乎无法使购买流程正常工作。计费似乎设置正常,但当我尝试查询我的应用内产品时,列表始终返回空。有人可以帮忙吗?
在我的应用程序级别 build.gradle 文件中,我包含了 Google Billing SDK:
implementation 'com.android.billingclient:billing:3.0.0'
Run Code Online (Sandbox Code Playgroud)
然后我创建了一个活动来测试代码。它首先初始化 BillingClient 并启动连接。连接似乎正确完成了设置。正确设置后,我会尝试在“商店状态”>“应用内商品”>“管理产品”下查询 Google Play 控制台中可用的产品
以下是 Activity 中的代码,该代码应该启动该进程并返回 SkuDetails 列表,但不幸的是它返回的是空的。
private BillingClient billingClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_billing);
this.billingClient = BillingClient.newBuilder(this)
.enablePendingPurchases()
.setListener(this.purchaseUpdateListener)
.build();
this.billingClient.startConnection(billingClientStateListener);
}
private PurchasesUpdatedListener purchaseUpdateListener = new PurchasesUpdatedListener() {
@Override
public void onPurchasesUpdated(@NonNull BillingResult billingResult, @Nullable List<Purchase> list) {
Log.d("Billing", "onPurchasesUpdated - List Size: " + list.size());
}
};
private BillingClientStateListener billingClientStateListener = new BillingClientStateListener() {
@Override
public void onBillingSetupFinished(@NonNull BillingResult …Run Code Online (Sandbox Code Playgroud) 将 BillingClient 升级到 3.0.0 后,我开始让大约 20% 的用户SERVICE_UNAVAILABLE在查询应用内购买时看到。skuDetailsList 也是空的。根据该文件,SERVICE_UNAVAILABLE意味着网络出现故障,但如何在客户端返回OK与startConnection和试图查询SKU信息后发送此邮件?此外,我看到了一些ERROR,即代码 6。我是否有一些不正确的实现,还是只是向用户显示了一些“发生错误。稍后再试”消息?我也没有在 Play 管理中心或任何可能导致这种情况的国家/地区看到任何警告。
BillingClient billingClient = BillingClient.newBuilder(getContext())
.enablePendingPurchases()
.setListener((billingResult, list) -> {})
.build();
mBillingClient.startConnection(new BillingClientStateListener() {
@Override
public void onBillingSetupFinished(@NonNull BillingResult billingResult) {
if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
createSkus(mBillingClient);
}
}
@Override
public void onBillingServiceDisconnected() {}
});
private void createSkus(BillingClient billingClient) {
List<String> skuList = new ArrayList<>();
skuList.add("pro");
SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
params.setSkusList(skuList).setType(BillingClient.SkuType.INAPP);
billingClient.querySkuDetailsAsync(params.build(),
(billingResult, skuDetailsList) -> {
// skuDetailsList empty with …Run Code Online (Sandbox Code Playgroud) 我正在将应用内购买功能添加到我的 Android 应用中。我在模拟器上尝试了以下行为:
android.test.purchased)queryPurchasesAsync()包含此购买再次调用时queryPurchasesAsync(),结果列表现在为空。这是正常的吗,因为我在模拟器上运行该应用程序?
感谢您的帮助
android in-app-purchase android-inapp-purchase billingclient
我有以下情况:
用户在其设备 A上的应用程序上购买了订阅。后来他买了一个设备B,并用设备A的同一个账号来配置。他在设备 B上安装了相同的应用程序,但他在设备 A上进行的购买在那里不可用。
我该怎么做才能让设备 B识别购买?我尝试使用BillingClient#purchaseHistoryResponseListener,但即使它确实返回了最近的购买,也无法确定购买是否有效(如果它作为订阅)或者它是否还没有被消费(如果它是一个 INAPP) .
我有一个活动应用程序(java),其中一个片段包含订阅按钮。我正在设置 Google Play 结算库,但是当我设置以下内容时:
private BillingClient billingClient = BillingClient.newBuilder(getActivity())
.setListener(purchasesUpdatedListener)
.enablePendingPurchases()
.build();
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
java.lang.IllegalArgumentException: Please provide a valid Context.
at com.android.billingclient.api.BillingClient$Builder.build
Run Code Online (Sandbox Code Playgroud)
我也尝试过
getContext()
Run Code Online (Sandbox Code Playgroud)
和
getActivity.getApplicationContext()
Run Code Online (Sandbox Code Playgroud)
但也没有用。requireContext() 也没有。
如果我在片段内,我应该传递什么上下文?
更新:
订阅片段由 SignUpFragemnt 调用:
public class SignUpFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_sign_up, container, false);
Button nextButton = v.findViewById(R.id.nextButton);
nextButton.setOnClickListener(v1 -> {
Navigation.findNavController(v1).navigate(R.id.subscriptionV3Fragment);
});
return v;
}
}
Run Code Online (Sandbox Code Playgroud)
这是订阅片段:
public class SubscriptionV3Fragment extends Fragment implements View.OnClickListener {
private static final String …Run Code Online (Sandbox Code Playgroud)