Android 未调用应用内付费onPurchaseUpdated

Android 未调用应用内付费onPurchaseUpdated,android,in-app-purchase,in-app-billing,Android,In App Purchase,In App Billing,我正在测试一个应用程序进行应用内计费,我在google play控制台中设置了我的帐户,一切正常,购买成功,但最后一个方法onPurchasesUpdated我不知道它是否调用,但我没有收到任何祝酒词,所以可能它没有调用。我的代码有问题吗?该应用程序告诉我购买成功时如何编写代码 public class MainActivity extends AppCompatActivity implements PurchasesUpdatedListener { BillingClient mBill

我正在测试一个应用程序进行应用内计费,我在google play控制台中设置了我的帐户,一切正常,购买成功,但最后一个方法
onPurchasesUpdated
我不知道它是否调用,但我没有收到任何祝酒词,所以可能它没有调用。我的代码有问题吗?该应用程序告诉我购买成功时如何编写代码

public class MainActivity extends AppCompatActivity implements PurchasesUpdatedListener {

BillingClient mBillingClient;

private Button mBtnBuy;

private String product = "product_test_4";
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mBtnBuy = findViewById(R.id.mBtn_buy);

    mBtnBuy.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            mBillingClient = BillingClient.newBuilder(MainActivity.this).setListener(new PurchasesUpdatedListener() {
                @Override
                public void onPurchasesUpdated(int responseCode, @Nullable List<Purchase> purchases) {



                }


            }).build();

            mBillingClient.startConnection(new BillingClientStateListener() {
                @Override
                public void onBillingSetupFinished(int responseCode) {
                    startPurchase();
                }

                @Override
                public void onBillingServiceDisconnected() {

                }
            });
        }
    });


}

public void startPurchase() {

    List<String> skuList = new ArrayList<>();
    skuList.add(product);
    SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
    params.setSkusList(skuList).setType(BillingClient.SkuType.INAPP);
    mBillingClient.querySkuDetailsAsync(params.build(),
            new SkuDetailsResponseListener() {
                @Override
                public void onSkuDetailsResponse(int responseCode, List<SkuDetails> skuDetailsList) {
                    if (responseCode == BillingClient.BillingResponse.OK
                            && skuDetailsList != null) {
                        for (SkuDetails skuDetails : skuDetailsList) {
                            String sku = skuDetails.getSku();
                            String price = skuDetails.getPrice();
                            if (product.equals(sku)) {

                            }
                        }
                    }
                }
                // Process the result.
            });

    BillingFlowParams flowParams = BillingFlowParams.newBuilder()
            .setSku(product)
            .setType(BillingClient.SkuType.INAPP) // SkuType.SUB for subscription
            .build();
    int responseCode = mBillingClient.launchBillingFlow(MainActivity.this, flowParams);
}


@Override
public void onPurchasesUpdated(@BillingClient.BillingResponse int responseCode, List<Purchase> purchases) {
    if (responseCode == BillingClient.BillingResponse.OK
            && purchases != null) {
        Toast.makeText(this, "purchase success", Toast.LENGTH_SHORT).show();
        Log.d("tag","purchase success");
    } else if (responseCode == BillingClient.BillingResponse.USER_CANCELED) {
        // Handle an error caused by a user cancelling the purchase flow.
        Toast.makeText(this, "purchase cancelled", Toast.LENGTH_SHORT).show();
        Log.d("tag","purchase cancelled");
    } else {
        // Handle any other error codes.
        Toast.makeText(this, "error", Toast.LENGTH_SHORT).show();
        Log.d("tag","purchase error");
    }
}

}
公共类MainActivity扩展AppCompative实现PurchasesUpdatedListener{
计费客户端mBillingClient;
私人按钮mBtnBuy;
私有字符串product=“产品测试4”;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mBtnBuy=findviewbyd(R.id.mBtn_-buy);
mBtnBuy.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
mBillingClient=BillingClient.newBuilder(MainActivity.this).setListener(新的PurchasesUpdatedListener(){
@凌驾
公共无效onPurchasesUpdated(int responseCode,@Nullable List purchases){
}
}).build();
mBillingClient.startConnection(新的BillingClientStateListener(){
@凌驾
已完成BillingSetupFinished(int响应代码)上的公共无效{
startPurchase();
}
@凌驾
公共无效onBillingServiceDisconnected(){
}
});
}
});
}
公共无效startPurchase(){
List skuList=new ArrayList();
skuList.add(产品);
SkuDetailsParams.Builder params=SkuDetailsParams.newBuilder();
参数setskulist(skuList).setType(BillingClient.SkuType.INAPP);
mBillingClient.querySkuDetailsAsync(params.build(),
新SkuDetailsResponseListener(){
@凌驾
公共无效onSkuDetailsResponse(内部响应代码,列表skuDetailsList){
if(responseCode==BillingClient.BillingResponse.OK
&&skuDetailsList!=空){
用于(SkuDetails SkuDetails:skuDetailsList){
字符串sku=skuDetails.getSku();
字符串price=skuDetails.getPrice();
if(产品等于(sku)){
}
}
}
}
//处理结果。
});
BillingFlowParams flowParams=BillingFlowParams.newBuilder()
.setSku(产品)
.setType(BillingClient.SkuType.INAPP)//SkuType.SUB用于订阅
.build();
int responseCode=mBillingClient.launchBillingFlow(MainActivity.this,flowParams);
}
@凌驾
购买时的公共无效日期(@BillingClient.BillingResponse int responseCode,列出购买){
if(responseCode==BillingClient.BillingResponse.OK
&&购买!=空){
Toast.makeText(这是“购买成功”,Toast.LENGTH_SHORT).show();
Log.d(“标记”、“购买成功”);
}else if(responseCode==BillingClient.BillingResponse.USER\u已取消){
//处理由用户取消采购流程引起的错误。
Toast.makeText(这是“购买已取消”,Toast.LENGTH_SHORT).show();
日志d(“标签”、“采购取消”);
}否则{
//处理任何其他错误代码。
Toast.makeText(此“错误”,Toast.LENGTH_SHORT).show();
Log.d(“标签”、“采购错误”);
}
}
}

您正在mBtnBuy onClick中设置PurchasesUpdatedListener

mBillingClient = BillingClient.newBuilder(MainActivity.this).setListener(new PurchasesUpdatedListener() {
            @Override
            public void onPurchasesUpdated(int responseCode, @Nullable List<Purchase> purchases) {



            }


        }).build();
mBillingClient=BillingClient.newBuilder(MainActivity.this.setListener)(新的PurchasesUpdatedListener(){
@凌驾
公共无效onPurchasesUpdated(int responseCode,@Nullable List purchases){
}
}).build();
因此,该方法将在购买时调用,而不是在上次购买时调用

您可以执行
mBillingClient=BillingClient.newBuilder(MainActivity.this.setListener().build()这样,然后将调用最后一个
onPurchasesUpdated