Google Play Console建立應用
我的應用是背景人員完成的,具體的可以參考Google Play Console建立應用其中需要注意的是添加測試人員隻是測試APK包,需要進行内支付測試則需要添加可用于測試的Google賬号,添加了之後此賬号在這apk中測試則不是真實支付,不會扣錢。
導入工具類
在 Android Studio 中打開Android SDK Manager(在Tools–>Android 裡面),找到并安裝Google Play Billing Library這一項。
- 在 Android Studio 中打開Android SDK Manager(在Tools–>Android 裡面),找到并安裝Google Play Billing Library這一項。
- 如果 Android Studio 中沒有Google Play Billing Library這一項,就直接下載下傳百度網盤提取碼:hu15
- 項目中導入IInAppBillingService.aidl檔案
安卓內建google内支付 - 導入之後在Build中點選Make Project 你會發現在在根目錄下會生成該檔案的接口
安卓內建google内支付 安卓內建google内支付 - 将其他google支付的工具放進自己項目 現在準備工作已經完成,接下來就是支付的實作
安卓內建google内支付
實作用戶端google内支付
- 添加google支付的權限
<uses-permission android:name="com.android.vending.BILLING"></uses-permission>
- 初始化 IabHelper
public class ScanMainActivity extends AppCompatActivity {
IabHelper mHelper;
...
...
...
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.scan_activity_main);
String base64EncodedPublicKey ="Public Key" //這是在Google Play Console建立應用的時候google給的應用公匙,這裡最好是将公匙放伺服器上,用戶端進行網絡請求獲得
mHelper = new IabHelper(getContext(), base64EncodedPublicKey);
mHelper.enableDebugLogging(false);
mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
public void onIabSetupFinished(IabResult result) {
if (!result.isSuccess()) {
return;
}
if (mHelper == null) return;
try {
mHelper.queryInventoryAsync(queryInventoryFinishedListener);//查詢有是否需要消耗的商品
} catch (IabHelper.IabAsyncInProgressException e) {
e.printStackTrace();
}
}
});
}
...
...
...
}
- 查詢是否有需要消耗的商品的監聽
IabHelper.QueryInventoryFinishedListener queryInventoryFinishedListener = new IabHelper.QueryInventoryFinishedListener() {
@Override
public void onQueryInventoryFinished(IabResult result, final Inventory inv) {
if (mHelper == null) return;
Purchase mPurchase = inv.getPurchase("你建立的内購商品的ID,如果是數組自己周遊一遍");
if (mPurchase != null) {
try {
mHelper.consumeAsync(inv.getPurchase("同上", mConsumeFinishedListener);查詢到之後調用消耗監聽
} catch (IabHelper.IabAsyncInProgressException e) {
e.printStackTrace();
}
return;
}
}
};
- 消耗已購買商品的監聽
IabHelper.OnConsumeFinishedListener mConsumeFinishedListener = new IabHelper.OnConsumeFinishedListener() {
@Override
public void onConsumeFinished(Purchase purchase, IabResult result) {
LogUtil.i("DDDDDD", result);
}
};
- 購買是否成功的監聽
IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
@Override
public void onIabPurchaseFinished(IabResult result, final Purchase info) {
if (result.isFailure()) {
return;
}
try {
mHelper.consumeAsync(info, mConsumeFinishedListener);//消耗購買成功的商品,否則不能二次購買
} catch (IabHelper.IabAsyncInProgressException e) {
e.printStackTrace();
}
}
};
- google回傳的資訊處理
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (mHelper == null) return;
**将回調消息分發給mHelper.handleActivityResult處理**
if (!mHelper.handleActivityResult(requestCode, resultCode, data)) {
super.onActivityResult(requestCode, resultCode, data);
} else {
}
}
在這一步我遇到一個難題,因為我是在fragment中進行google支付,是以傳回的消息被父activity攔截,是以在這一步停留了許久。下面是解決方法:
在父activity中執行個體化支付頁面并綁定id,寫在onCreate方法中即可
FragmentManager manager = this.getSupportFragmentManager();
fragmentBuyCorn=(Fragment) manager.findFragmentById(R.id.flNavigationConversion);
重寫父activity中的onActivityResult方法
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
Fragment fragment=getSupportFragmentManager().findFragmentById(R.id.flNavigationConversion);
fragment.onActivityResult(requestCode, resultCode, data);
這裡已經将消息傳遞給fragment
}
- 發起購買
- 最後在退出頁面時還需要将mHelper給關閉
@Override
public void onDestroy() {
super.onDestroy();
if (mHelper != null) {
try {
mHelper.dispose();
mHelper = null;
} catch (IabHelper.IabAsyncInProgressException e) {
e.printStackTrace();
}
}
}
關于測試中遇到的問題
這些問題導緻的原因可能為:
- 與google play 上釋出的版本code不一緻
- 包的簽名不一緻
- 未在google背景配置相應的内購商品
- 你在google上傳的apk未釋出
- 商品id錯誤
- 測試賬号的支付設定地區一定不能設為大陸,設定為香港都行
- 調取的是預設gmail賬号付款,保證此賬号不是在google play建立應用的賬号
成功後的頁面
到此就将google支付接入完畢了,可能還有些細節沒有寫到,我也隻是一枚新手,代碼風格不太好,還在改進,請見諒