preface

I wrote a previous article about integrating Google Pay with AIDL, so check it out if you need to. However, it is not recommended. Why? Because Google docs recently said that it no longer supports the AIDL approach. So today we will talk about the new Google Pay inheritance method, of course, we only talk about the integration method here, configuration can see the Official Google(in-app payment) documentation.

The preparatory work

What are the preparations for integrating With Google Pay?

  • 1, mobile phone installed __Google services __(of course for domestic users, foreign believe most have Google services);
  • 2. A Google account with a credit card;
  • 3. Google Play client;
  • 4. Google Play Console (for configuring in-app product information)

First of all,

What do we need to do after we’ve done all the prep work? Of course, you can configure the relevant app and product information on the Google Play Console. For details, see Google Pay Configuration.

  • 1. Payment process description

Note about the process of Google Pay: 1> Prerequisites

Check whether your package name and signature file are consistent with the APK package uploaded on Google Console. 2. Check whether the version number is consistent with the APK version released by Google Console. Whether the phone has Google serviceCopy the code

2> Payment process

2. The second step, after the initialization is successful, call the query purchase operation, the query is successful, call the consumption operation, to prevent the situation that cannot be purchased. 3. 5. The fifth step is to get the relevant information returned by Google Pay and verify the operation on the server. 6. The sixth step, the server gets the relevant information uploaded by you and carries out interactive verification with Google Pay. After successful verification, Google will deliver the goods and the server will return the relevant information to youCopy the code

  • 2. Integrate by first adding an online dependency on Google Pay to your project’s build.gradle file

    Implementation 'com. Android. Billingclient: billing: 3.0.0'Copy the code

Note: I used version 2.1.0, you can check the latest version on the official website

The second

The above is the prerequisite for access, and the following is the specific code

public class GooglePlayHelper {
private static final String TAG = GooglePlayHelper.class.getSimpleName();
private static final int GAME_ORDER_ID=0x01;

//订单号
private String mOrderID;
//用户信息
privata String mUserID;
//商品集合
private WeakReference<Activity> mActivityRef;
//回调
private OnRechargeStateListener mListener;
//商品
private String mSku;
private String goods_number;//  商品ID,游戏提供
private BillingClient mBillingClient;
private int mPayTest;
private String mConsume = "0";

GooglePlayHelper(Activity activity, 
                String goods_number, int mPayTest,
                 String sku, OnRechargeStateListener mListener) {
    this.mActivityRef = new WeakReference<>(activity);
    this.goods_number = goods_number;
    this.mSku = sku;
    this.mPayTest = mPayTest;
    this.mListener = mListener;
}

  public GooglePlayHelper(Activity activity, int mPayTest) {
    this.mActivityRef = new WeakReference<>(activity);
    this.mPayTest = mPayTest;
}




/**
 * 初始化
 */
void init() {
    mBillingClient = BillingClient.newBuilder(mActivityRef.get())
            .setListener(mPurchasesUpdatedListener)
            .enablePendingPurchases()
            .build();
    if (!mBillingClient.isReady()) {
        mBillingClient.startConnection(new BillingClientStateListener() {
            @Override
            public void onBillingSetupFinished(BillingResult billingResult) {
                if (billingResult != null) {
                    if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
                        if (!TextUtils.isEmpty(PreferencesUtils.getString(mActivityRef.get(),
                                Constants.USER_LT_UID_KEY))) {
                            getLTOrderID();
                        } else {
                            mListener.onState(mActivityRef.get(), RechargeResult.failOf(LTGameError.make(
                                    LTResultCode.STATE_GP_CREATE_ORDER_FAILED,
                                    "order create failed:user key is empty"
                            )));
                            mActivityRef.get().finish();
                        }
                    }
                }

            }

            @Override
            public void onBillingServiceDisconnected() {
            }
        });
    } else {
        if (!TextUtils.isEmpty(PreferencesUtils.getString(mActivityRef.get(),
                Constants.USER_LT_UID_KEY))) {
            getLTOrderID();
        } else {
            mListener.onState(mActivityRef.get(), RechargeResult.failOf(LTGameError.make(
                    LTResultCode.STATE_GP_CREATE_ORDER_FAILED,
                    "order create failed:user key is empty"
            )));
            mActivityRef.get().finish();
        }
    }
}


/**
 * 购买回调
 */
private PurchasesUpdatedListener mPurchasesUpdatedListener = new PurchasesUpdatedListener() {
    @Override
    public void onPurchasesUpdated(BillingResult billingResult, List<Purchase> list) {
        String debugMessage = billingResult.getDebugMessage();
        Log.e(TAG, debugMessage);
        if (list != null && list.size() > 0) {
            if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
                for (Purchase purchase : list) {
                    mConsume = "2";
                    uploadToServer(purchase.getPurchaseToken(), purchase.getOrderId(),mOrderID, mPayTest);
                }

            }
        } else {
            switch (billingResult.getResponseCode()) {
                case BillingClient.BillingResponseCode.SERVICE_TIMEOUT: {//服务连接超时
                    mListener.onState(mActivityRef.get(), RechargeResult.failOf("-3"));
                    mActivityRef.get().finish();
                    break;
                }
                case BillingClient.BillingResponseCode.FEATURE_NOT_SUPPORTED: {
                    mListener.onState(mActivityRef.get(), RechargeResult.failOf("-2"));
                    mActivityRef.get().finish();
                    break;
                }
                case BillingClient.BillingResponseCode.SERVICE_DISCONNECTED: {//服务未连接
                    mListener.onState(mActivityRef.get(), RechargeResult.failOf("-1"));
                    mActivityRef.get().finish();
                    break;
                }
                case BillingClient.BillingResponseCode.USER_CANCELED: {//取消
                    mListener.onState(mActivityRef.get(), RechargeResult.failOf("1"));
                    mActivityRef.get().finish();
                    break;
                }
                case BillingClient.BillingResponseCode.SERVICE_UNAVAILABLE: {//服务不可用
                    mListener.onState(mActivityRef.get(), RechargeResult.failOf("2"));
                    mActivityRef.get().finish();
                    break;
                }
                case BillingClient.BillingResponseCode.BILLING_UNAVAILABLE: {//购买不可用
                    mListener.onState(mActivityRef.get(), RechargeResult.failOf("3"));
                    mActivityRef.get().finish();
                    break;
                }
                case BillingClient.BillingResponseCode.ITEM_UNAVAILABLE: {//商品不存在
                    mListener.onState(mActivityRef.get(), RechargeResult.failOf("4"));
                    mActivityRef.get().finish();
                    break;
                }
                case BillingClient.BillingResponseCode.DEVELOPER_ERROR: {//提供给 API 的无效参数
                    mListener.onState(mActivityRef.get(), RechargeResult.failOf("5"));
                    mActivityRef.get().finish();
                    break;
                }
                case BillingClient.BillingResponseCode.ERROR: {//错误
                    mListener.onState(mActivityRef.get(), RechargeResult.failOf("6"));
                    mActivityRef.get().finish();
                    break;
                }
                case BillingClient.BillingResponseCode.ITEM_ALREADY_OWNED: {//未消耗掉
                    mConsume = "1";
                    queryHistory();
                    break;
                }
                case BillingClient.BillingResponseCode.ITEM_NOT_OWNED: {//不可购买
                    mListener.onState(mActivityRef.get(), RechargeResult.failOf("8"));
                    mActivityRef.get().finish();
                    break;
                }
            }
        }
    }
};

/**
 * 购买
 */
private void recharge() {
    if (mBillingClient.isReady()) {
        List<String> skuList = new ArrayList<>();
        skuList.add(mSku);
        SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
        params.setSkusList(skuList).setType(BillingClient.SkuType.INAPP);
        mBillingClient.querySkuDetailsAsync(params.build(),
                new SkuDetailsResponseListener() {
                    @Override
                    public void onSkuDetailsResponse(BillingResult billingResult,
                                                     List<SkuDetails> skuDetailsList) {
                        if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK
                                && skuDetailsList != null) {
                            for (SkuDetails skuDetails : skuDetailsList) {
                                String sku = skuDetails.getSku();
                                if (mSku.equals(sku)) {
                                    BillingFlowParams purchaseParams =
                                            BillingFlowParams.newBuilder()
                                                    .setSkuDetails(skuDetails)
                                                    .setObfuscatedAccountId(mUserID)
                                                    .setObfuscatedProfileId(mOrderID)
                                                    .build();
                                    mBillingClient.launchBillingFlow(mActivityRef.get(), purchaseParams);
                                }
                            }
                        }

                    }
                });

    }


}


/**
 * 消耗
 */
private void consume(String purchaseToken) {
    if (mBillingClient.isReady()) {
        ConsumeParams consumeParams = ConsumeParams.newBuilder()
                .setPurchaseToken(purchaseToken)
                .build();
        mBillingClient.consumeAsync(consumeParams, new ConsumeResponseListener() {
            @Override
            public void onConsumeResponse(BillingResult billingResult, String s) {

            }
        });
    } else {
        mBillingClient.startConnection(new BillingClientStateListener() {
            @Override
            public void onBillingSetupFinished(BillingResult billingResult) {
                if (billingResult != null) {
                    if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
                        ConsumeParams consumeParams = ConsumeParams.newBuilder()
                                .setPurchaseToken(purchaseToken)
                                .build();
                        mBillingClient.consumeAsync(consumeParams, new ConsumeResponseListener() {
                            @Override
                            public void onConsumeResponse(BillingResult billingResult, String s) {

                            }
                        });
                    }
                }

            }

            @Override
            public void onBillingServiceDisconnected() {
            }
        });
    }

}

/**
 * 消耗
 */
private void consume2(String purchaseToken) {
    if (mBillingClient.isReady()) {
        ConsumeParams consumeParams = ConsumeParams.newBuilder()
                .setPurchaseToken(purchaseToken)
                .build();
        mBillingClient.consumeAsync(consumeParams, new ConsumeResponseListener() {
            @Override
            public void onConsumeResponse(BillingResult billingResult, String s) {

            }
        });
        recharge();
    } else {
        mBillingClient.startConnection(new BillingClientStateListener() {
            @Override
            public void onBillingSetupFinished(BillingResult billingResult) {
                if (billingResult != null) {
                    if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
                        ConsumeParams consumeParams = ConsumeParams.newBuilder()
                                .setPurchaseToken(purchaseToken)
                                .build();
                        mBillingClient.consumeAsync(consumeParams, new ConsumeResponseListener() {
                            @Override
                            public void onConsumeResponse(BillingResult billingResult, String s) {

                            }
                        });
                    }
                }

            }

            @Override
            public void onBillingServiceDisconnected() {
            }
        });
        recharge();
    }

}

/**
 * 补单操作
 */
private void queryHistory() {
   Purchase.PurchasesResult mResult = mBillingClient.queryPurchases(BillingClient.SkuType.INAPP);
    for (int i = 0; i < mResult.getPurchasesList().size(); i++) {
        if (mResult.getPurchasesList().get(i).isAcknowledged()) {
            consume2(mResult.getPurchasesList().get(i).getPurchaseToken());
        } else {
            uploadToServer2(mResult.getPurchasesList().get(i).getPurchaseToken(),
                    mResult.getPurchasesList().get(i).getOrderId(),
                    mResult.getPurchasesList().get(i).getAccountIdentifiers().getObfuscatedProfileId(),
                    mPayTest);
        }
    }

}

/**
 * 获取订单ID
 */
private void getLTOrderID() {
   //自己获取订单ID的接口(和你们自己的服务器进行商量)
    LoginRealizeManager.createOrder(mActivityRef.get(), xx, xx, xx,
            new OnRechargeStateListener() {

                @Override
                public void onState(Activity activity, RechargeResult result) {
                    if (result != null) {
                        if (result.getResultModel() != null) {
                            if (result.getResultModel().getData() != null) {
                                if (result.getResultModel().getCode() == 0) {
                                    if (result.getResultModel().getData().getOrder_number() != null) {
                                        mOrderID = result.getResultModel().getData().getOrder_number();
                                        PreferencesUtils.init(mActivityRef.get());
                                        PreferencesUtils.putString(mActivityRef.get(), GAME_ORDER_ID, mOrderID);
                                        recharge();
                                    }
                                } else {
                                    mListener.onState(mActivityRef.get(),
                                            RechargeResult.failOf(result.getResultModel().getMsg()));
                                    mActivityRef.get().finish();
                                    activity.finish();
                                }

                            }

                        }
                    }
                }

            });

}

/**
 * 上传到服务器验证接口(具体传值和你们的服务器进行沟通确认)
 */
private void uploadToServer(final String purchaseToken,String mGoogleOrder, String mOrderID, int mPayTest) {
    LoginRealizeManager.googlePlay(mActivityRef.get(),
            purchaseToken, mOrderID, mPayTest, new OnRechargeStateListener() {
                @Override
                public void onState(Activity activity, RechargeResult result) {
                    if (result != null) {
                        if (result.getResultModel() != null) {
                            if (result.getResultModel().getCode() == 0) {
                                mListener.onState(mActivityRef.get(), RechargeResult
                                        .successOf(result.getResultModel()));
                                consume(purchaseToken);
                            } else if (result.getResultModel().getCode() == 10500) {//网络中断再次重新上传验证上传
                                uploadToServer(purchaseToken,mGoogleOrder, mOrderID, mPayTest);
                            } else {//上传订单验证错误日志信息到服务器
                                LoginRealizeManager.sendGooglePlayFailed(mActivityRef.get(), mOrderID, purchaseToken,
                                        mGoogleOrder,
                                        mPayTest, result.getResultModel().getMsg(), mListener);
                            }
                        }

                    }

                }

            });

}

/**
 * 上传到服务器验证接口(具体传值和你们的服务器进行沟通确认)
 */
private void uploadToServer2(final String purchaseToken,String mGoogleOrder, String mOrderID, int mPayTest) {
    LoginRealizeManager.googlePlay(mActivityRef.get(),
            purchaseToken, mOrderID, mPayTest, new OnRechargeStateListener() {
                @Override
                public void onState(Activity activity, RechargeResult result) {
                    if (result != null) {
                        if (result.getResultModel() != null) {
                            if (result.getResultModel().getCode() == 0) {
                                consume2(purchaseToken);
                                if (mConsume.equals("1")) {
                                    recharge();
                                }
                            } else if (result.getResultModel().getCode() == 10500) {
                                uploadToServer2(purchaseToken,mGoogleOrder, mOrderID, mPayTest);
                            } else {
                                LoginRealizeManager.sendGooglePlayFailed(mActivityRef.get(), mOrderID, purchaseToken,
                                        mGoogleOrder,
                                        mPayTest, result.getResultModel().getMsg(), mListener);
                            }
                        }

                    }

                }

            });

}

   /**
    * 上传到服务器验证
    */
private void uploadToServer3(final String purchaseToken, String mGoogleOrder,String mOrderID, int mPayTest) {
    LoginRealizeManager.googlePlay(mActivityRef.get(),
            purchaseToken, mOrderID, mPayTest, new OnRechargeStateListener() {
                @Override
                public void onState(Activity activity, RechargeResult result) {
                    if (result != null) {
                        if (result.getResultModel() != null) {
                            if (result.getResultModel().getCode() == 0) {
                                consume2(purchaseToken);
                            } else if (result.getResultModel().getCode() == 10500) {
                                uploadToServer3(purchaseToken,mGoogleOrder, mOrderID, mPayTest);
                            } else {
                                LoginRealizeManager.sendGooglePlayFailed(mActivityRef.get(), mOrderID, purchaseToken,
                                        mGoogleOrder,
                                        mPayTest, result.getResultModel().getMsg(), mListener);
                            }
                        }

                    }

                }

            });

}


/**
 * 释放
 */
void release() {
    if (mBillingClient.isReady()) {
        mBillingClient.endConnection();
    }
}

/**
 * 补单操作
 */
public void addOrder() {
    mBillingClient = BillingClient.newBuilder(mActivityRef.get())
            .setListener(mPurchasesUpdatedListener)
            .enablePendingPurchases()
            .build();
    mBillingClient.startConnection(new BillingClientStateListener() {
        @Override
        public void onBillingSetupFinished(BillingResult billingResult) {
            if (billingResult != null) {
                if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
                    Purchase.PurchasesResult mResult = mBillingClient.queryPurchases(BillingClient.SkuType.INAPP);
                    for (int i = 0; i < mResult.getPurchasesList().size(); i++) {
                        if (mResult.getPurchasesList().get(i).isAcknowledged()) {//服务器验证
                            consume2(mResult.getPurchasesList().get(i).getPurchaseToken());
                        } else {//服务器未验证走验证流程
                            uploadToServer3(mResult.getPurchasesList().get(i).getPurchaseToken(),
                                    mResult.getPurchasesList().get(i).getOrderId(),
                                    mResult.getPurchasesList().get(i).getAccountIdentifiers().getObfuscatedProfileId(),
                                    mPayTest);
                        }
                    }
                }
            }

        }

        @Override
        public void onBillingServiceDisconnected() {
        }
    });
}


}
Copy the code

The last

Ok, so that’s Google Pay for today. If you have any questions, you can discuss nightdress (493180098).