1. 程式人生 > >android整合GooglePay支付,實現應用內支付,如金幣等

android整合GooglePay支付,實現應用內支付,如金幣等

1、前言
釋出海外市場,應用內又有支付功能,不可避免要整合GooglePay支付,國內不支援GooglePay,要FQ.
開發文件:整合應用內支付官方文件
2、開發前工具準備
(1)FQ工具:手機,電腦各一套,目前還能用的Lantern, Shadowsocks等;
(2)申請Google Play開發者賬號,完成如下圖步驟:
圖1
這裡寫圖片描述
(3)準備測試賬號(可以與開發者賬號是同一個,但在公司中,一般開發者賬號都是通用的,所以不會繫結信用卡),測試賬號需要繫結可支付外幣的信用卡;
3、開發中工作
(1)將要整合支付的正式簽名版包,釋出到Google Pay開發者賬號上,一般釋出Beta版用於測試,建立應用步驟不贅述,釋出Beta版時(或者登入開發者賬號,點選已經建立的應用,左側選單欄出現“管理版本”->”應用管理”,右側會出現“管理Beta版”,點選進去,在“管理測試人員右側”可以選擇測試型別),Google Play提供“開發式測試”——開發性測試不必新增測試賬號,凡是能登入Google Play的都能下載測試,“封閉式測試

”——此處需要注意,選中封閉測試,要在下拉選單中新增測試人員的賬號,還要在Google Play Control首頁,設定->賬號詳情中新增測試人員賬號(否則,測試支付永遠不會成功),如下圖說明:
圖2
這裡寫圖片描述
圖3
這裡寫圖片描述
(2)在Google Play Control中建立商品ID,如下圖
圖4
這裡寫圖片描述

不同的地區,限價範圍不一樣,參考支援向Google Play使用者釋出應用的地區
超過限價後,商品建立會失敗,不支援人民幣價格,可填美元等。

(3)測試支付功能,應用必須釋出正式版/Beta版/Alpha版,釋出成功才能支付。初次在Google Play Control釋出應用時,必須左側選單欄沒有灰色歎號,否則資料填寫不全,釋出按鈕是不可點的,若實在找不到問題,可以聯絡Google 客服諮詢(上班時間週一到週五工作日)。
圖5
這裡寫圖片描述


圖6
這裡寫圖片描述

訂閱型別,沒有用過,不瞭解。。。

4、接下來擼程式碼
(1)AndroidManifest.xml新增許可權

<!--googlepay必需許可權-->
        <uses-permission android:name="com.android.vending.BILLING"/>

(2)新增Util包,並新增aidl檔案,見前言->官方文件
(3)初始化一個helper
base64EncodedPublicKey=應用建立後,Google Play Control上生成的一個key
圖7
這裡寫圖片描述

  helper= new IabHelper(mContext, base64EncodedPublicKey);
        helper.enableDebugLogging(true);
        // Start setup. This is asynchronous and the specified listener
        helper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
            public void onIabSetupFinished(IabResult result) {
                if (!result.isSuccess()) {
                    //helper設定失敗是沒法支付的,此處可以彈出提示框
                    return;
                }
                helper.queryInventoryAsync(mGotInventoryListener);

            }
        });
//查詢商品倉庫回撥 mGotInventoryListener 
//mProductID為在Google Play Control中建立的商品ID,後臺返回商品列表時將此ID會返回
IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new            IabHelper.QueryInventoryFinishedListener() {
        public void onQueryInventoryFinished(IabResult result, Inventory inventory) {
            if (helper== null) return;
            //在商品倉庫中查詢失敗
            if (result.isFailure()) {
            //修改IabHelper中的部分程式碼,看原始碼,取出查詢失敗的訂單資料,這個後面會貼程式碼
                if (!TextUtils.isEmpty(helper.failPurchaseData) && !TextUtils.isEmpty(helper.failSignature)) {
                    try {
                        Purchase p = new Purchase(helper.failPurchaseData, helper.failSignature);
                        helper.consumeAsync(p, mConsumeFinishedListener);
                    } catch (Exception e) {
                        e.printStackTrace();

                    }
                } else {
                    //向本地伺服器請求訂單號
                    order();
                }
                return;
            }

            if (inventory.hasPurchase(mProductID)) {
                helper.consumeAsync(inventory.getPurchase(mProductID), mConsumeFinishedListener);

                return;
            }
          //向本地伺服器請求訂單號
          order();
        }
    };
這裡寫程式碼片

public void order() {
//略去請求程式碼
//請求成功時,呼叫以下方法,調起本地支付SDK,走支付流程,不同版本的Util,方法可能不一樣,但原理一樣,引數2為商品ID,引數3為code碼,隨意設定,引數5為伺服器返回的訂單號
helper.launchPurchaseFlowWidthExtro(activity, productID, RC_REQUEST, mPurchaseFinishedListener, iabID);

}
//消費結束回撥
    IabHelper.OnConsumeFinishedListener mConsumeFinishedListener = new IabHelper.OnConsumeFinishedListener() {
        public void onConsumeFinished(Purchase purchase, IabResult result) {
            if (result.isSuccess()) {
            //向伺服器驗證支付憑據,引數1實際得到的為伺服器生成的訂單號,引數2為訂單資訊
            //一般會將訂單資訊中的token,商品ID,訂單傳給後臺驗證,看與伺服器端的哥們怎麼溝通了
            checkReceipt(purchase.getDeveloperPayload(), purchase);
        }
    };

    IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
        public void onIabPurchaseFinished(IabResult result, Purchase purchase) {

            if (result.isFailure()) {
                if (result.getResponse() == -1003) {//嚴正宣告失敗,
                    if (purchase.getSku().equals(mProductID)) {
                        helper.consumeAsync(purchase, mConsumeFinishedListener);
                    }
                }
                return;
            }
            if (purchase.getSku().equals(mProductID)) {
                helper.consumeAsync(purchase, mConsumeFinishedListener);

            }
        }
    };
//需要修改 IabHelper的部分程式碼,用於查詢倉庫失敗,重新生成訂單資訊
在queryPurchases(Inventory inv)方法中,iSecurity.verifyPurchase(mSignatureBase64, purchaseData, signature)返回false時,給failPurchaseData,failSignature賦值
還需要在activity中的onActicityResult,onDestory中加程式碼,這個官方開發文件/GitHub上的demo都有,就不重複貼程式碼了。

5、至此,GooglePay整合完畢
6、測試注意事項:
(1)要測試的應用必須與Google Play上釋出的應用,簽名(注意debug時的簽名和已釋出的應用簽名),包名,版本號,版本名稱一致;
(2)測試人員必須在測試連線中啟用;
(3)測試時需要連VPN,此時可開啟Google Play看看有沒有付費產品,若沒有,則切換vpn地區,若有,可以測試下其他付費應用能不能調起支付,出現“購買字樣”,同時注意已釋出應用的分發地區/範圍,若測試賬號新增的信用卡是美國地區的,但是已釋出的應用分發範圍不包含美國,是不會支援付款的。
(4)已按上述步驟新增測試賬號的,即使付款成功,也不會真正扣款。
(5)程式碼中所使用的商品id一定要和Google play control上建立的id一致,注意區分name/id.
(6)測試時,伺服器也需要FQ去驗證憑據。
7、測試支付可能出現的情況:
(1)“無法購買商品”:檢視是否配置了此商品ID,檢視分發範圍是否包括測試賬號的信用卡支付
(2) “此版本未配置Google play結算”:檢視已釋出應用的版本號,版本名稱和測試的包是不是一樣,檢視該測試賬號是否已啟用,若是封閉測試,檢視是否在開發者賬號的許可測試裡。
(3)“該版本不支援購買”類似的,檢視整合用的api是不是已過期。

若轉載,請指明出處,一隻剛開始寫部落格的程式狗狗,歡迎大家交流,不足之處,請諒解。