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的都能下載測試,“封閉式測試
圖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是不是已過期。
若轉載,請指明出處,一隻剛開始寫部落格的程式狗狗,歡迎大家交流,不足之處,請諒解。