前言
之前寫過一篇通過AIDL方式集成Google支付
的文章逝淹,如有需要耕姊,可以去看看。但是栅葡,不建議使用茉兰。為啥呢?欣簇,因?yàn)樽罱碐oogle文檔中說已經(jīng)不再支持AIDL的方式了规脸。所以今天就來(lái)說說新的Google支付繼承方式,當(dāng)然熊咽,我們這里只說集成方式莫鸭,配置可以看Google(應(yīng)用內(nèi)支付)官方文檔。
準(zhǔn)備工作
要集成Google支付的準(zhǔn)備工作有哪些呢横殴?
- 1被因、手機(jī)上安裝Google服務(wù)(當(dāng)然是針對(duì)國(guó)內(nèi)的用戶,國(guó)外的相信大部分都有Google服務(wù));
- 2氏身、一個(gè)綁定信用卡的Google賬號(hào)巍棱;
- 3、Google play客戶端蛋欣;
- 4航徙、Google play console(用于配置應(yīng)用內(nèi)商品信息);
首先
上面的準(zhǔn)備工作都做好了之后需要干什么呢陷虎?當(dāng)然是在Google play console上配置相關(guān)應(yīng)用和商品信息了到踏,至于如何配置具體可以參考Google支付配置。
-
1尚猿、支付流程說明
關(guān)于Google支付的流程說明:
1>前提條件1窝稿、檢查你的包名和簽名文件是否和Google Console 上面上傳的apk包是否一致 2、檢查版本號(hào)是否和Google console發(fā)布的apk版本是否一致 3凿掂、檢查你是否可以購(gòu)買伴榔,是否綁定了銀行卡,手機(jī)支不支持Google支付庄萎,手機(jī)是否有Google服務(wù)
2>支付流程
1踪少、第一步,初始化Google支付 2糠涛、第二步援奢,初始化成功后調(diào)用查詢購(gòu)買的商品操作,查詢成功調(diào)用消耗操作忍捡,防止不能購(gòu)買的情 況發(fā)生 3集漾、第三步,生成訂單號(hào)進(jìn)行購(gòu)買操作 4砸脊、第四步具篇,購(gòu)買成功后再次調(diào)用一次消耗操作(為了下次購(gòu)買可以成功) 5、第五步脓规,拿到Google支付返回的相關(guān)信息栽连,在服務(wù)器進(jìn)行驗(yàn)證操作。 6侨舆、第六步秒紧,服務(wù)器拿到你上傳的相關(guān)信息和Google支付進(jìn)行交互驗(yàn)證,驗(yàn)證成功后Google發(fā)貨挨下,服務(wù)器給你返回相關(guān)信息
支付流程.jpg
補(bǔ)單流程.jpg
后臺(tái)驗(yàn)證流程.png
- 2熔恢、集成工作
首先在你的項(xiàng)目的build.gradle文件中加入Google支付的在線依賴
implementation 'com.android.billingclient:billing:3.0.0'
注意:我用的時(shí)候版本是2.1.0,你可以去官網(wǎng)查查最新的版本
其次
上面是接入的前提條件臭笆,下面看具體代碼
public class GooglePlayHelper {
private static final String TAG = GooglePlayHelper.class.getSimpleName();
private static final int GAME_ORDER_ID=0x01;
//訂單號(hào)
private String mOrderID;
//用戶信息
privata String mUserID;
//商品集合
private WeakReference<Activity> mActivityRef;
//回調(diào)
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();
}
}
}
/**
* 購(gòu)買回調(diào)
*/
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: {//服務(wù)連接超時(shí)
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: {//服務(wù)未連接
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: {//服務(wù)不可用
mListener.onState(mActivityRef.get(), RechargeResult.failOf("2"));
mActivityRef.get().finish();
break;
}
case BillingClient.BillingResponseCode.BILLING_UNAVAILABLE: {//購(gòu)買不可用
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 的無(wú)效參數(shù)
mListener.onState(mActivityRef.get(), RechargeResult.failOf("5"));
mActivityRef.get().finish();
break;
}
case BillingClient.BillingResponseCode.ERROR: {//錯(cuò)誤
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: {//不可購(gòu)買
mListener.onState(mActivityRef.get(), RechargeResult.failOf("8"));
mActivityRef.get().finish();
break;
}
}
}
}
};
/**
* 購(gòu)買
*/
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();
}
}
/**
* 補(bǔ)單操作
*/
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的接口(和你們自己的服務(wù)器進(jìn)行商量)
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();
}
}
}
}
}
});
}
/**
* 上傳到服務(wù)器驗(yàn)證接口(具體傳值和你們的服務(wù)器進(jìn)行溝通確認(rèn))
*/
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) {//網(wǎng)絡(luò)中斷再次重新上傳驗(yàn)證上傳
uploadToServer(purchaseToken,mGoogleOrder, mOrderID, mPayTest);
} else {//上傳訂單驗(yàn)證錯(cuò)誤日志信息到服務(wù)器
LoginRealizeManager.sendGooglePlayFailed(mActivityRef.get(), mOrderID, purchaseToken,
mGoogleOrder,
mPayTest, result.getResultModel().getMsg(), mListener);
}
}
}
}
});
}
/**
* 上傳到服務(wù)器驗(yàn)證接口(具體傳值和你們的服務(wù)器進(jìn)行溝通確認(rèn))
*/
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);
}
}
}
}
});
}
/**
* 上傳到服務(wù)器驗(yàn)證
*/
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();
}
}
/**
* 補(bǔ)單操作
*/
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()) {//服務(wù)器驗(yàn)證
consume2(mResult.getPurchasesList().get(i).getPurchaseToken());
} else {//服務(wù)器未驗(yàn)證走驗(yàn)證流程
uploadToServer3(mResult.getPurchasesList().get(i).getPurchaseToken(),
mResult.getPurchasesList().get(i).getOrderId(),
mResult.getPurchasesList().get(i).getAccountIdentifiers().getObfuscatedProfileId(),
mPayTest);
}
}
}
}
}
@Override
public void onBillingServiceDisconnected() {
}
});
}
}
最后
好了秤掌,這就是今天的Google支付說明了,如果還有疑問可以加群探討(493180098)