以前寫過一篇經過AIDL方式集成Google支付 的文章,若有須要,能夠去看看。可是,不建議使用。爲啥呢?,由於最近看Google文檔中說已經再也不支持AIDL的方式了。因此今天就來講說新的Google支付繼承方式,固然,咱們這裏只說集成方式,配置能夠看Google(應用內支付)官方文檔。html
要集成Google支付的準備工做有哪些呢?android
上面的準備工做都作好了以後須要幹什麼呢?固然是在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