IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> android google登录和支付 -> 正文阅读

[移动开发]android google登录和支付

package com.mycompany.app;

import android.app.Activity;

import android.content.Intent;

import android.os.Handler;

import android.util.Log;

import androidx.annotation.NonNull;

import androidx.annotation.Nullable;


?

import com.android.billingclient.api.BillingClient;

import com.android.billingclient.api.BillingClientStateListener;

import com.android.billingclient.api.BillingFlowParams;

import com.android.billingclient.api.BillingResult;

import com.android.billingclient.api.ConsumeParams;

import com.android.billingclient.api.ConsumeResponseListener;

import com.android.billingclient.api.ProductDetails;

import com.android.billingclient.api.ProductDetailsResponseListener;

import com.android.billingclient.api.Purchase;

import com.android.billingclient.api.PurchaseHistoryRecord;

import com.android.billingclient.api.PurchaseHistoryResponseListener;

import com.android.billingclient.api.PurchasesUpdatedListener;

import com.android.billingclient.api.QueryProductDetailsParams;

import com.android.billingclient.api.QueryPurchaseHistoryParams;

import com.google.android.gms.auth.api.signin.GoogleSignIn;

import com.google.android.gms.auth.api.signin.GoogleSignInAccount;

import com.google.android.gms.auth.api.signin.GoogleSignInClient;

import com.google.android.gms.auth.api.signin.GoogleSignInOptions;

import com.google.android.gms.common.api.ApiException;

import com.google.android.gms.tasks.OnCompleteListener;

import com.google.android.gms.tasks.Task;

import com.google.common.collect.ImmutableList;

import org.json.JSONException;

import org.json.JSONObject;

import java.util.List;

/**google登录支付功能封装*/

public class myGooglePlayUtil {

? ? private static final String TAG = "myGooglePlayUtil";

? ? private static ?myGooglePlayUtil _myGooglePlayUtil;

? ? private Activity activity;

? ? private ?GoogleSignInClient mGoogleSignInClient;

? ? private BillingClient mBillingclient;

? ? private ?int RC_SIGN_IN = 101;

? ? private Handler handler = new Handler();

? ? private final int consumeImmediately = 0;

? ? private final int consumeDelay = 1;

? ? public static myGooglePlayUtil getInstance(){

? ? ? ? if (_myGooglePlayUtil == null) {

? ? ? ? ? ? _myGooglePlayUtil = new myGooglePlayUtil();

? ? ? ? }

? ? ? ? return ?_myGooglePlayUtil;

? ? }

? ? //初始化

? ? public void initSDK(Activity _activity){

? ? ? ? this.activity = _activity;

? ? ? ? //登录

? ? ? ? GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)

? ? ? ? ? ? ? ? .requestEmail()

? ? ? ? ? ? ? ? .requestIdToken("106090399679-do5a696fi87nh1c1lv9uukg0q76qtbs0.apps.googleusercontent.com")

? ? ? ? ? ? ? ? .build();

? ? ? ? this.mGoogleSignInClient = GoogleSignIn.getClient(activity, gso);

? ? ? ? //支付

? ? ? ? mBillingclient = BillingClient.newBuilder(activity)

? ? ? ? ? ? ? ? .setListener(mPurchasesUpdatedListener)

? ? ? ? ? ? ? ? .enablePendingPurchases()

? ? ? ? ? ? ? ? .build();

? ? }

? ? //登录

? ? public ? void loginGoogle(){

? ? ? ? Intent signInIntent = this.mGoogleSignInClient.getSignInIntent();

? ? ? ? this.activity.startActivityForResult(signInIntent, this.RC_SIGN_IN);

? ? }

? ? //退出

? ? public void logoutGoogle(){

? ? ? ? this.mGoogleSignInClient.signOut()

? ? ? ? ? ? ? ? .addOnCompleteListener(activity, new OnCompleteListener<Void>() {

? ? ? ? ? ? ? ? ? ? @Override

? ? ? ? ? ? ? ? ? ? public void onComplete(@NonNull Task<Void> task) {

? ? ? ? ? ? ? ? ? ? ? ? Log.e(TAG, "退出登录");

? ? ? ? ? ? ? ? ? ? ? ? JSONObject jsonObject = new JSONObject();

? ? ? ? ? ? ? ? ? ? ? ? try {

? ? ? ? ? ? ? ? ? ? ? ? ? ? jsonObject.put("code","100");

? ? ? ? ? ? ? ? ? ? ? ? ? ? jsonObject.put("eventName","logout");

? ? ? ? ? ? ? ? ? ? ? ? } catch (JSONException e) {

? ? ? ? ? ? ? ? ? ? ? ? ? ? e.printStackTrace();

? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? ? ? CoronaApplication.dispatchEvent(jsonObject.toString());

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? });

? ? }

? ? //注销

? ? public void revokeAccessGoogle(){

? ? ?this.mGoogleSignInClient.revokeAccess()

? ? ? ? ? ? ? ? .addOnCompleteListener(activity, new OnCompleteListener<Void>() {

? ? ? ? ? ? ? ? ? ? @Override

? ? ? ? ? ? ? ? ? ? public void onComplete(@NonNull Task<Void> task) {

? ? ? ? ? ? ? ? ? ? ? ? Log.e(TAG, "断开账户");

? ? ? ? ? ? ? ? ? ? ? ? JSONObject jsonObject = new JSONObject();

? ? ? ? ? ? ? ? ? ? ? ? try {

? ? ? ? ? ? ? ? ? ? ? ? ? ? jsonObject.put("code","100");

? ? ? ? ? ? ? ? ? ? ? ? ? ? jsonObject.put("eventName","revokeAccess");

? ? ? ? ? ? ? ? ? ? ? ? } catch (JSONException e) {

? ? ? ? ? ? ? ? ? ? ? ? ? ? e.printStackTrace();

? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? ? ? CoronaApplication.dispatchEvent(jsonObject.toString());

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? });

? ? }

? ? //发送登录数据给lua

? ? public ?void SignInToLua(GoogleSignInAccount account){

? ? ? ? Log.e(TAG, "account--------------->>>" + account);

? ? ? ? Log.e(TAG, "signInResult:success name:" + account.getDisplayName());

? ? ? ? Log.e(TAG, "signInResult:success id:" + account.getId());

? ? ? ? Log.e(TAG, "signInResult:success email:" + account.getEmail());

? ? ? ? Log.e(TAG, "signInResult:success token:" + account.getIdToken());

? ? ? ? JSONObject jsonObject = new JSONObject();

? ? ? ? try {

? ? ? ? ? ? jsonObject.put("code","100");

? ? ? ? ? ? jsonObject.put("eventName","login");

? ? ? ? ? ? JSONObject jsonObject2 = new JSONObject();

? ? ? ? ? ? jsonObject2.put("userID",account.getId());

? ? ? ? ? ? jsonObject2.put("identityToken",account.getIdToken());

? ? ? ? ? ? jsonObject2.put("bundleIdentifier",this.activity.getPackageName());

? ? ? ? ? ? jsonObject.put("eventData",jsonObject2);

? ? ? ? } catch (JSONException e) {

? ? ? ? ? ? e.printStackTrace();

? ? ? ? }

? ? ? ? CoronaApplication.dispatchEvent(jsonObject.toString());

? ? }

? ? protected void onActivityResult(int requestCode, int resultCode, Intent data) {

? ? ? ? Log.e(TAG, "requestCode--------------->>>" + requestCode);

? ? ? ? if (requestCode == this.RC_SIGN_IN) {

? ? ? ? ? ? Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);

? ? ? ? ? ? handleSignInResult(task);

? ? ? ? }

? ? }

? ? private void handleSignInResult(Task<GoogleSignInAccount> completedTask) {

? ? ? ? try {

? ? ? ? ? ? GoogleSignInAccount account = completedTask.getResult(ApiException.class);

? ? ? ? ? ? this.SignInToLua(account);

? ? ? ? } catch (ApiException e) {

? ? ? ? ? ? // The ApiException status code indicates the detailed failure reason.

? ? ? ? ? ? // Please refer to the GoogleSignInStatusCodes class reference for more information.

? ? ? ? ? ? Log.e(TAG, "signInResult:failed code=" + e.getStatusCode());

? ? ? ? }

? ? }



?

? ? private PurchasesUpdatedListener mPurchasesUpdatedListener = new PurchasesUpdatedListener() {

? ? ? ? @Override

? ? ? ? public void onPurchasesUpdated(@NonNull BillingResult billingResult, @Nullable List<Purchase> list) {

? ? ? ? ? ? String debugMessage = billingResult.getDebugMessage();

? ? ? ? ? ? Log.e(TAG, "---onPurchasesUpdated---debugMessage:"+debugMessage);

? ? ? ? ? ? if (list != null && list.size() > 0) {

? ? ? ? ? ? ? ? Log.e(TAG, "---onPurchasesUpdated---list.size():"+list.size());

? ? ? ? ? ? ? ? Log.e(TAG, "---onPurchasesUpdated---billingResult.getResponseCode():"+billingResult.getResponseCode());

? ? ? ? ? ? ? ? if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {

? ? ? ? ? ? ? ? ? ? for (Purchase purchase : list) {

? ? ? ? ? ? ? ? ? ? ? ? if(purchase == null || purchase.getPurchaseState() != Purchase.PurchaseState.PURCHASED) continue;

? ? ? ? ? ? ? ? ? ? ? ? consumePurchase(purchase.getPurchaseToken(),purchase.getOrderId());

? ? ? ? ? ? ? ? ? ? ? ? //通知服务器支付成功,服务端验证后,消费商品

? ? ? ? ? ? ? ? ? ? ? ? //TODO客户端同步回调支付成功

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? }

? ? ? ? ? ? } else {

? ? ? ? ? ? ? ? Log.e(TAG, "---onPurchasesUpdated---billingResult.getResponseCode():"+billingResult.getResponseCode());

? ? ? ? ? ? ? ? switch (billingResult.getResponseCode()) {

? ? ? ? ? ? ? ? ? ? case BillingClient.BillingResponseCode.SERVICE_TIMEOUT: //服务连接超时

? ? ? ? ? ? ? ? ? ? ? ? break;

? ? ? ? ? ? ? ? ? ? case BillingClient.BillingResponseCode.FEATURE_NOT_SUPPORTED:

? ? ? ? ? ? ? ? ? ? ? ? break;

? ? ? ? ? ? ? ? ? ? case BillingClient.BillingResponseCode.SERVICE_DISCONNECTED: //服务未连接

? ? ? ? ? ? ? ? ? ? ? ? break;

? ? ? ? ? ? ? ? ? ? case BillingClient.BillingResponseCode.USER_CANCELED: //取消

? ? ? ? ? ? ? ? ? ? ? ? break;

? ? ? ? ? ? ? ? ? ? case BillingClient.BillingResponseCode.SERVICE_UNAVAILABLE: //服务不可用

? ? ? ? ? ? ? ? ? ? ? ? break;

? ? ? ? ? ? ? ? ? ? case BillingClient.BillingResponseCode.BILLING_UNAVAILABLE: //购买不可用

? ? ? ? ? ? ? ? ? ? ? ? break;

? ? ? ? ? ? ? ? ? ? case BillingClient.BillingResponseCode.ITEM_UNAVAILABLE: //商品不存在

? ? ? ? ? ? ? ? ? ? ? ? break;

? ? ? ? ? ? ? ? ? ? case BillingClient.BillingResponseCode.DEVELOPER_ERROR: //提供给 API 的无效参数

? ? ? ? ? ? ? ? ? ? ? ? break;

? ? ? ? ? ? ? ? ? ? case BillingClient.BillingResponseCode.ERROR: //错误

? ? ? ? ? ? ? ? ? ? ? ? break;

? ? ? ? ? ? ? ? ? ? case BillingClient.BillingResponseCode.ITEM_ALREADY_OWNED: //未消耗掉

? ? ? ? ? ? ? ? ? ? ? ? queryPurchases();

? ? ? ? ? ? ? ? ? ? ? ? break;

? ? ? ? ? ? ? ? ? ? case BillingClient.BillingResponseCode.ITEM_NOT_OWNED: //不可购买

? ? ? ? ? ? ? ? ? ? ? ? break;

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? ? ? }

? ? };

? ? public boolean startConnection(final String productId){

? ? ? ? if(mBillingclient == null || !mBillingclient.isReady()){

? ? ? ? ? ? Log.e(TAG, "---startConnection---");

? ? ? ? ? ? //TODO客户端同步回调支付失败,原因是为链接到google或者google的支付服务不能使用

? ? ? ? ? ? mBillingclient.startConnection(new BillingClientStateListener() { ?//重新连接

? ? ? ? ? ? ? ? @Override

? ? ? ? ? ? ? ? public void onBillingServiceDisconnected() {

? ? ? ? ? ? ? ? ? ? //尝试重新启动连接的下一个请求

? ? ? ? ? ? ? ? ? ? //谷歌通过调用startConnection()方法进行播放。

? ? ? ? ? ? ? ? ? ? Log.e(TAG, "---onBillingServiceDisconnected---");

? ? ? ? ? ? ? ? ? ? new Handler().postDelayed(()->{

? ? ? ? ? ? ? ? ? ? ? ? startConnection(productId);

? ? ? ? ? ? ? ? ? ? },1000);

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? @Override

? ? ? ? ? ? ? ? public void onBillingSetupFinished(@NonNull BillingResult billingResult) {

? ? ? ? ? ? ? ? ? ? Log.e(TAG, "---onBillingSetupFinished---getResponseCode:"+billingResult.getResponseCode() );

? ? ? ? ? ? ? ? ? ? if (billingResult.getResponseCode() == ?BillingClient.BillingResponseCode.OK) {

? ? ? ? ? ? ? ? ? ? ? ? //BillingClient已经准备好。 你可以在这里查询购买情况。

? ? ? ? ? ? ? ? ? ? ? ? querySkuDetailsAsync(productId);

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? }

? ? ? ? ? ? });

? ? ? ? ? ? return false;

? ? ? ? }

? ? ? ? return true;

? ? }

? ? public void pay(final String productId) {

? ? ? ? boolean bol = startConnection(productId);

? ? ? ? if (bol){

? ? ? ? ? ? //查询商品详情

? ? ? ? ? ? querySkuDetailsAsync(productId);

? ? ? ? }

? ? }

? ? //查询商品详情

? ? void querySkuDetailsAsync(final String productId){

? ? ? ? Log.e(TAG, "querySkuDetailsAsync.productId:"+productId);

? ? ? ? QueryProductDetailsParams queryProductDetailsParams = QueryProductDetailsParams.newBuilder()

? ? ? ? ? ? ? ? .setProductList(ImmutableList.of(

? ? ? ? ? ? ? ? ? ? ? ? QueryProductDetailsParams.Product.newBuilder()

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? .setProductId(productId)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? .setProductType(BillingClient.ProductType.INAPP)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? .build()))

? ? ? ? ? ? ? ? ? ? ? ? .build();

? ? ? ? mBillingclient.queryProductDetailsAsync(

? ? ? ? ? ? ? ? queryProductDetailsParams,

? ? ? ? ? ? ? ? new ProductDetailsResponseListener() {

? ? ? ? ? ? ? ? ? ? public void onProductDetailsResponse(BillingResult billingResult,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?List<ProductDetails> productDetailsList) {

? ? ? ? ? ? ? ? ? ? ? ? // check billingResult

? ? ? ? ? ? ? ? ? ? ? ? // process returned productDetailsList

? ? ? ? ? ? ? ? ? ? ? ? Log.e(TAG, "billingResult.getResponseCode:"+billingResult.getResponseCode());

? ? ? ? ? ? ? ? ? ? ? ? if (productDetailsList != null && billingResult.getResponseCode() == ?BillingClient.BillingResponseCode.OK){

? ? ? ? ? ? ? ? ? ? ? ? ? ? Log.e(TAG, "productDetailsList.length:"+productDetailsList.size());

? ? ? ? ? ? ? ? ? ? ? ? ? ? Log.e(TAG, "productId:"+productId);

? ? ? ? ? ? ? ? ? ? ? ? ? ? for(ProductDetails skuDetails : productDetailsList){

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Log.e(TAG, "skuDetails.getProductId:"+skuDetails.getProductId());

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if(productId.equals(skuDetails.getProductId())){

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //发起支付

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? launchBillingFlow(skuDetails);

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? }

? ? ? ? );

? ? }

? ? /**

? ? ?* 拉取google支付页面

? ? ?* @param productDetails

? ? ?*/

? ? void launchBillingFlow(ProductDetails productDetails){

? ? ? ? Log.e(TAG, "----launchBillingFlow---");

? ? ? ? ImmutableList productDetailsParamsList =

? ? ? ? ? ? ? ? ImmutableList.of(

? ? ? ? ? ? ? ? ? ? ? ? BillingFlowParams.ProductDetailsParams.newBuilder()

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // retrieve a value for "productDetails" by calling queryProductDetailsAsync()

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? .setProductDetails(productDetails)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? .build()

? ? ? ? ? ? ? ? );

? ? ? ? BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()

? ? ? ? ? ? ? ? .setProductDetailsParamsList(productDetailsParamsList)

? ? ? ? ? ? ? ? .build();

? ? ? ? BillingResult result = mBillingclient.launchBillingFlow(activity, billingFlowParams);

? ? ? ? Log.e(TAG,"getResponseCode:"+ result.getResponseCode());

? ? ? ? if(result.getResponseCode() == BillingClient.BillingResponseCode.OK) {

? ? ? ? ? ? Log.e("toString:", result.toString());

? ? ? ? }else{

? ? ? ? ? ? Log.e("getDebugMessage:", result.getDebugMessage());

? ? ? ? }

? ? }

? ? //发送支付订单数据给lua

? ? public ?void payToLua(final String purchaseToken,final String ?orderId){

? ? ? ? JSONObject jsonObject = new JSONObject();

? ? ? ? try {

? ? ? ? ? ? jsonObject.put("code","100");

? ? ? ? ? ? jsonObject.put("eventName","pay");

? ? ? ? ? ? JSONObject jsonObject2 = new JSONObject();

? ? ? ? ? ? jsonObject2.put("purchaseToken",purchaseToken);

? ? ? ? ? ? jsonObject2.put("orderId",orderId);

? ? ? ? ? ? jsonObject.put("eventData",jsonObject2);

? ? ? ? } catch (JSONException e) {

? ? ? ? ? ? e.printStackTrace();

? ? ? ? }

? ? ? ? CoronaApplication.dispatchEvent(jsonObject.toString());

? ? }

? ? public void consumePurchase(final String purchaseToken,final String ?orderId){

? ? ? ? Log.i("Tag","消耗商品:purchaseToken:" + purchaseToken+" ? orderId:"+orderId);

? ? ? ? ConsumeParams consumeParams = ConsumeParams.newBuilder()

? ? ? ? ? ? ? ? .setPurchaseToken(purchaseToken)

? ? ? ? ? ? ? ? .build();

? ? ? ? ConsumeResponseListener listener = new ConsumeResponseListener() {

? ? ? ? ? ? @Override

? ? ? ? ? ? public void onConsumeResponse(BillingResult billingResult, String purchaseToken) {

? ? ? ? ? ? ? ? if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.ERROR) {

? ? ? ? ? ? ? ? ? ? //消费失败将商品重新放入消费队列

? ? ? ? ? ? ? ? ? ? Log.i("TAG", "消费失败");

? ? ? ? ? ? ? ? ? ? return;

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? Log.i("TAG", "消费成功 purchaseToken: "+purchaseToken);

? ? ? ? ? ? ? ? payToLua(purchaseToken,orderId);

? ? ? ? ? ? }

? ? ? ? };

? ? ? ? mBillingclient.consumeAsync(consumeParams, listener);

? ? }

? ? /**

? ? ?* 补单操作 查询已支付的商品,并通知服务器后消费(google的支付里面,没有消费的商品,不能再次购买)

? ? ?*/

? ? private void queryPurchases(){

? ? ? ? mBillingclient.queryPurchaseHistoryAsync(

? ? ? ? ? ? ? ? QueryPurchaseHistoryParams.newBuilder()

? ? ? ? ? ? ? ? ? ? ? ? .setProductType(BillingClient.ProductType.INAPP)

? ? ? ? ? ? ? ? ? ? ? ? .build(),

? ? ? ? ? ? ? ? new PurchaseHistoryResponseListener() {

? ? ? ? ? ? ? ? ? ? public void onPurchaseHistoryResponse(

? ? ? ? ? ? ? ? ? ? ? ? ? ? BillingResult billingResult, List<PurchaseHistoryRecord> purchasesHistoryList) {

? ? ? ? ? ? ? ? ? ? ? ? if(billingResult.getResponseCode() != BillingClient.BillingResponseCode.OK && purchasesHistoryList != null){

? ? ? ? ? ? ? ? ? ? ? ? ? ? for (PurchaseHistoryRecord purchaseHistoryRecord : purchasesHistoryList) {

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //通知服务器支付成功,服务端验证后,消费商品

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //TODO客户端同步回调支付成功

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //purchaseHistoryRecord.getPurchaseToken()

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? consumePurchase(purchaseHistoryRecord.getPurchaseToken(),purchaseHistoryRecord.getOriginalJson());

? ? ? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? ? ? }else{

? ? ? ? ? ? ? ? ? ? ? ? ? ? switch (billingResult.getResponseCode()) {

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? case BillingClient.BillingResponseCode.SERVICE_TIMEOUT: //服务连接超时

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? case BillingClient.BillingResponseCode.FEATURE_NOT_SUPPORTED:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? case BillingClient.BillingResponseCode.SERVICE_DISCONNECTED: //服务未连接

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? case BillingClient.BillingResponseCode.USER_CANCELED: //取消

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? case BillingClient.BillingResponseCode.SERVICE_UNAVAILABLE: //服务不可用

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? case BillingClient.BillingResponseCode.BILLING_UNAVAILABLE: //购买不可用

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? case BillingClient.BillingResponseCode.ITEM_UNAVAILABLE: //商品不存在

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? case BillingClient.BillingResponseCode.DEVELOPER_ERROR: //提供给 API 的无效参数

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? case BillingClient.BillingResponseCode.ERROR: //错误

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? case BillingClient.BillingResponseCode.ITEM_ALREADY_OWNED: //未消耗掉

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? queryPurchases();

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? case BillingClient.BillingResponseCode.ITEM_NOT_OWNED: //不可购买

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;

? ? ? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? ? ? }


?

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? }

? ? ? ? );

? ? }

}

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-08-06 10:55:38  更:2022-08-06 10:58:34 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 4:51:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码