天天看點

安卓內建google内支付

Google Play Console建立應用

我的應用是背景人員完成的,具體的可以參考Google Play Console建立應用其中需要注意的是添加測試人員隻是測試APK包,需要進行内支付測試則需要添加可用于測試的Google賬号,添加了之後此賬号在這apk中測試則不是真實支付,不會扣錢。

導入工具類

在 Android Studio 中打開Android SDK Manager(在Tools–>Android 裡面),找到并安裝Google Play Billing Library這一項。

  1. 在 Android Studio 中打開Android SDK Manager(在Tools–>Android 裡面),找到并安裝Google Play Billing Library這一項。
  2. 如果 Android Studio 中沒有Google Play Billing Library這一項,就直接下載下傳百度網盤提取碼:hu15
  3. 項目中導入IInAppBillingService.aidl檔案
    安卓內建google内支付
  4. 導入之後在Build中點選Make Project
    安卓內建google内支付
    你會發現在在根目錄下會生成該檔案的接口
    安卓內建google内支付
  5. 将其他google支付的工具放進自己項目
    安卓內建google内支付
    現在準備工作已經完成,接下來就是支付的實作

實作用戶端google内支付

  1. 添加google支付的權限
<uses-permission android:name="com.android.vending.BILLING"></uses-permission>
           
  1. 初始化 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();
                        }
                    }
                });
    }

                ...
                ...
                ...
                }
           
  1. 查詢是否有需要消耗的商品的監聽
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;
                
            }
        }
    };
           
  1. 消耗已購買商品的監聽
IabHelper.OnConsumeFinishedListener mConsumeFinishedListener = new IabHelper.OnConsumeFinishedListener() {
        @Override
        public void onConsumeFinished(Purchase purchase, IabResult result) {
            LogUtil.i("DDDDDD", result);

        }
    };
           
  1. 購買是否成功的監聽
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();
                    }
              }
    };
           
  1. 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
}
           
  1. 發起購買
  1. 最後在退出頁面時還需要将mHelper給關閉
@Override
    public void onDestroy() {
        super.onDestroy();
        if (mHelper != null) {
            try {
                mHelper.dispose();
                mHelper = null;
            } catch (IabHelper.IabAsyncInProgressException e) {
                e.printStackTrace();
            }
        }
    }

           

關于測試中遇到的問題

安卓內建google内支付
安卓內建google内支付

這些問題導緻的原因可能為:

  1. 與google play 上釋出的版本code不一緻
  2. 包的簽名不一緻
  3. 未在google背景配置相應的内購商品
  4. 你在google上傳的apk未釋出
  5. 商品id錯誤
  6. 測試賬号的支付設定地區一定不能設為大陸,設定為香港都行
  7. 調取的是預設gmail賬号付款,保證此賬号不是在google play建立應用的賬号

成功後的頁面

安卓內建google内支付

到此就将google支付接入完畢了,可能還有些細節沒有寫到,我也隻是一枚新手,代碼風格不太好,還在改進,請見諒