Android Google應用內支付(新的集成方式)

前言

以前寫過一篇經過AIDL方式集成Google支付 的文章,若有須要,能夠去看看。可是,不建議使用。爲啥呢?,由於最近看Google文檔中說已經再也不支持AIDL的方式了。因此今天就來講說新的Google支付繼承方式,固然,咱們這裏只說集成方式,配置能夠看Google(應用內支付)官方文檔html

準備工做

要集成Google支付的準備工做有哪些呢?android

  • 一、手機上安裝__Google服務__(固然是針對國內的用戶,國外的相信大部分都有Google服務);
  • 二、一個綁定信用卡的Google帳號;
  • 三、Google play客戶端;
  • 四、Google play console用於配置應用內商品信息);

首先

上面的準備工做都作好了以後須要幹什麼呢?固然是在Google play console上配置相關應用和商品信息了,至於如何配置具體能夠參考Google支付配置服務器

  • 一、支付流程說明 關於Google支付的流程說明: 1>前提條件ide

    一、檢查你的包名和簽名文件是否和Google Console 上面上傳的apk包是否一致
    二、檢查版本號是否和Google console發佈的apk版本是否一致
    三、檢查你是否能夠購買,是否綁定了銀行卡,手機支不支持Google支付,手機是否有Google服務
    複製代碼

    2>支付流程post

    一、第一步,初始化Google支付
     二、第二步,初始化成功後調用查詢購買的商品操做,查詢成功調用消耗操做,防止不能購買的情 況發生
     三、第三步,生成訂單號進行購買操做
     四、第四步,購買成功後再次調用一次消耗操做(爲了下次購買能夠成功)
     五、第五步,拿到Google支付返回的相關信息,在服務器進行驗證操做。
     六、第六步,服務器拿到你上傳的相關信息和Google支付進行交互驗證,驗證成功後Google發貨,服務器給你返回相關信息
    複製代碼
  • 二、集成工做 首先在你的項目的build.gradle文件中加入Google支付的在線依賴gradle

    implementation 'com.android.billingclient:billing:2.1.0'
    複製代碼

注意:我用的時候版本是2.1.0,你能夠去官網查查最新的版本ui

其次

上面是接入的前提條件,下面看具體代碼this

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

//訂單號
private String mOrderID;
//商品集合
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;
}




/**
 * 初始化
 */
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";
                    consume(purchase.getPurchaseToken());
                }

            }
        } 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)
                                                    .build();
                                    mBillingClient.launchBillingFlow(mActivityRef.get(), purchaseParams);
                                }
                            }
                        }

                    }
                });

    }


}


/**
 * 消耗
 */
private void consume(String purchaseToken) {
    ConsumeParams consumeParams =
            ConsumeParams.newBuilder()
                    .setDeveloperPayload(mOrderID)
                    .setPurchaseToken(purchaseToken)
                    .build();
    mBillingClient.consumeAsync(consumeParams, new ConsumeResponseListener() {

        @Override
        public void onConsumeResponse(BillingResult billingResult, String s) {

        }
    });
    //上傳服務器驗證
    uploadToServer(purchaseToken, mOrderID, mPayTest);

}

/**
 * 消耗
 */
private void consume2(String purchaseToken) {
    ConsumeParams consumeParams =
            ConsumeParams.newBuilder()
                    .setDeveloperPayload(PreferencesUtils.getString(mActivityRef.get(), Constants.LT_ORDER_ID))
                    .setPurchaseToken(purchaseToken)
                    .build();
    mBillingClient.consumeAsync(consumeParams, new ConsumeResponseListener() {

        @Override
        public void onConsumeResponse(BillingResult billingResult, String s) {
            if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
                uploadToServer2(purchaseToken, PreferencesUtils.getString(mActivityRef.get(), GAME_ORDER_ID),
                        mPayTest);
            }
        }
    });

}

/**
 * 補單操做
 */
private void queryHistory() {
    mBillingClient.queryPurchaseHistoryAsync(BillingClient.SkuType.INAPP,
            new PurchaseHistoryResponseListener() {
                @Override
                public void onPurchaseHistoryResponse(BillingResult billingResult, List<PurchaseHistoryRecord> list) {
                    if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK
                            && list != null) {
                        for (final PurchaseHistoryRecord purchase : list) {
                            consume2(purchase.getPurchaseToken());
                        }
                    } else {
                        mActivityRef.get().finish();
                    }
                }

            });


}

/**
 * 獲取訂單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 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()));
                            }else {
                                queryHistory();
                            }
                        }

                    }

                }

            });

}

/**
 * 上傳到服務器驗證接口(具體傳值和大家的服務器進行溝通確認)
 */
private void uploadToServer2(final String purchaseToken, 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) {
                               
                                if (mConsume.equals("1")) {
                                    recharge();
                                }
                            }
                        }

                    }

                }

            });

}

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

/**
 * 補單操做
 */
public void addOrder() {
    PreferencesUtils.init(mActivityRef.get());
    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) {
                    queryHistory();
                }
            }

        }

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


}
複製代碼

最後

好了,這就是今天的Google支付說明了,若是還有疑問能夠加羣探討(493180098)google

相關文章
相關標籤/搜索