Android Eclipse實現Google Pay內支付
現在越來越多的人都開始接觸了海外的支付方式,而google的官方支付作為一大支付方式,並且對接過程中遇到的坑較多,而我們又有可能用到,所以今天在這裡寫一下之前對接google的一些自我理解。希望可以幫助到大家:
先貼一份我對接Google支付的流程圖:(根據實際操作來進行流程修改)
google支付demo效果圖:
其實google的內支付很簡單,只是對於手機的要求比較特殊,需要手機有google框架和服務,這個在網上一搜一大把的。這裡就不說了啊。我接下來就開始直接進行專案的配置:
重點內容
- 新增Google pay開發包。
通過Android SDK Manager下載
2.下載好之後找到eclipse的路徑,然後點選sdk->extras->google->play_billing,這裡就是剛才下載好的檔案目錄了。
3.在專案src目錄下建立包名com.android.vending.billing,包名必須這樣寫。將IInAppBillingService.aidl檔案拷貝放入這個包名內,放入之後專案的gen目錄會自動生成相同包名的支付檔案;
4.將sdk->extras->google->play_billing->samples->TrivialDrive下的工程內util包的檔案拷貝進你的專案內,如下圖(注意包名):
5.支付的檔案和所用的工具類到這裡就匯入完成了,但是還有最重要的一個操作就是在AndroidManifest.xml檔案裡配置google支付的所需許可權:
<!-- google pay 必需許可權 -->
<uses-permission android:name="com.android.vending.BILLING" />
下來就是加入支付程式碼了。
6.加入google支付程式碼。第一步初始化:
/**
* 自定義初始化方法
*/
protected void GooglePayInit() {
//與Google的服務連線,並傳入金鑰驗證
//appkey為google開發者後臺稽核過後的publickey
mHelper = new IabHelper(MainActivity.this, appkey);
mHelper.enableDebugLogging(true);
//初始化
mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
public void onIabSetupFinished(IabResult result) {
//失敗
if (!result.isSuccess()) {
System.out.println("-------------------" + "初始化失敗");
return;
}
System.out.println("------------------------------" + "初始化成功");
if (mHelper == null) return;
//初始化成功
//查詢可購買的商品,並實現查詢方法的回撥
mHelper.queryInventoryAsync(mGotInventoryListener);
}
});
}
初始化的程式碼很簡單,只需要傳入appkey進行驗證即可。
7.當初始化成功之後,需要進行查詢操作,實現查詢方法並處理回撥內容:
/**
* 查詢商品的回撥
*/
IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
public void onQueryInventoryFinished(IabResult result, Inventory inventory) {
//非空
if (mHelper == null) return;
//庫存商品查詢成功
if(result.isSuccess()){
//輸出日誌,便於跟蹤程式碼
System.out.println("--------------查詢成功");
//庫存商品查詢成功後,進行與當前sku的匹配,確保當前傳入的sku在庫存中是否存在
Purchase premiumPurchase = inventory.getPurchase("" + sku);
//匹配到庫存中有當前的sku,說明查詢到了需要消耗的商品,執行消耗操作
if(premiumPurchase != null){
System.out.println("--------------查詢需要消耗的商品之後執行消耗操作");
//google商品消耗方法,並實現消耗回撥
mHelper.consumeAsync(inventory.getPurchase("" + sku), mConsumeFinishedListener);
//沒有查詢到要消耗的商品(可能已經消耗成功,或者該商品沒有購買過)
}else {
//那就直接執行購買操作
Googlepay();
}
}
//select失敗
if(result.isFailure()){
System.out.println("--------------查詢失敗");
}
}
};
註釋已經很清楚了,這裡就不過多的解釋了。。。
8.查詢成功之後,判斷是否需要消耗,如果不需要消耗操作,直接發起購買,請看9。如果需要消耗,就實現消耗操作:
/**
* 消耗回撥
*/
IabHelper.OnConsumeFinishedListener mConsumeFinishedListener = new IabHelper.OnConsumeFinishedListener() {
public void onConsumeFinished(Purchase purchase, IabResult result) {
//非空
if (mHelper == null) return;
//消耗成功方法
if (result.isSuccess()) {
//當消耗成功後,purchase為消耗成功的物件,判斷purchase的sku是否和當前的sku相同,確保消耗的商品正確
//其實這行程式碼也是一句廢話,個人覺得還是比較一下比較好
if (purchase.getSku().equals("" + sku)) {
System.out.println("------------消耗成功");
//因為google明確要求,需要先消耗後購買管理商品,所以當消耗成功後,發起購買
//購買方法
Googlepay();
}
}else {
System.out.println("------------消耗失敗");
}
}
};
注:根據個人的業務流程進行消耗。。。
9.當前如果不需要消耗,發起購買操作,並實現購買操作回撥方法:
/**
* 自定義購買方法
*/
protected void Googlepay() {
//sku 當前商品的內購ID
//inapp 因為google支付和iOS支付一樣,都是屬於應用內支付,所以這裡要傳inapp
//RC_REQUEST 這個是作為支付請求程式碼傳
//mPurchaseFinishedListener 購買回調
//payload作為透傳引數,我這裡傳的是訂單號。
//因為訂單號不能唯一,所以使用當前時間生成訂單號
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
String payload = "m" + sdf.format(new Date());
/**
* 支付方法
*/
mHelper.launchPurchaseFlow(MainActivity.this, sku, "inapp", RC_REQUEST, mPurchaseFinishedListener, payload);
}
注:RC_REQUEST作為google官方支付請求程式碼:
//支付請求程式碼
static final int RC_REQUEST = 10001;
10.執行購買方法後,需要實現購買的回撥:
/**
* 購買回調
*/
IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
public void onIabPurchaseFinished(IabResult result, Purchase purchase) {
//返回購買回調結果
Log.d("TAG", "-----購買回調:" + result);
//返回購買成功的商品
Log.d("TAG", "-----購買回調:" + purchase);
//非空
if (mHelper == null) return;
//失敗方法
if(!result.isSuccess()){
System.out.println("---------------購買失敗");
}else {
System.out.println("---------------購買成功");
//支付成功之後如果需要重複購買的話,需要進行消耗商品
//(這裡的消耗和查詢的消耗是一樣的方法,之所以呼叫兩次消耗方法,是因為害怕如果因為網路延遲在在某一步沒有消耗,所以做的一個加固消耗操作)
if(purchase.getSku().equals("" + sku)){
System.out.println("-------------支付成功之後如果需要重複購買的話,需要進行消耗商品");
//執行下號方法
mHelper.consumeAsync(purchase, mConsumeFinishedListener);
}
}
}
};
注:到這裡為止,所有的流程就已經結束了。如果配置OK的話,這時候的google介面就已經可以調出來了。
當然還要注意一些手機和google後臺配置方面的問題:
1.首先,測試用到的手機必須要有google服務和google框架;
2.測試所用的賬號需要繫結海外的信用卡,比如visa卡等等;
3.以上兩點具備之後,使用測試賬號登入google play商店,所看到的介面應該包含免費應用和付費應用兩種,才可以進行google支付的測試(IP問題);
4.應用提審到google後臺beta後,需要成為測試人員後,通過測試人員連結下載安裝包進行測試。
5.當支付介面提示“此版本的應用未配置為通過google play結算”,說明當前所用賬號非測試人員賬號;
6.當支付介面提示“您已擁有此商品”時,說明所購買的商品沒有被消耗成功。
當然了,當天時地利人和都佔據之後,並且對程式碼已經理解透徹,你就會覺得google支付是那麼的so easy!!!
好了,到這裡就結束啦,祝願大家都能工作順利,開開心心!
因為demo的apk因為CSDN稽核沒有通過,所以這裡就不附上apk了。。。