應用建立
建立應用需要上傳一個簽名後的包。可以是個空包,也就是說,可以上傳一個和正式包一樣包名和簽名的就可以提前獲得回覆的key。
GooglePay內購及訂閱概念
1.GoogleInapp(內購)
GoogleInapp也叫google內購,內購分為兩個步驟,第一步為購買。購買成功後,需要消耗該商品。如果該商品未消耗,那麼當前裝置下次購買該商品將會失敗,返回code碼為7.使用者如果第一次購買該商品,在兩小時內可以不通過開發者同意進行退款(該規則同樣適用於訂閱功能)。在伺服器校驗流程中,可以根據code碼判斷是否退款。
2.GoogleSubs(訂閱)
googleSubs也叫google訂閱。定期的扣除使用者的費用。直到使用者到googlePlay中接觸訂閱。
/**
* 用於訂閱商品
*
* @param context
* @param productId Google play store 後臺定義的商品的id。如果錯誤的話,將提示檢索失敗
* @param payload 該欄位隨機生成一定長度的字串,用於生成的訂單支付成功後根據google返回的訂單資訊關聯。
*/
public void subsGoods(Activity context, String productId, String payload)
複製程式碼
業務接入流程
- 呼叫queryProductDetails(productId,listener)方查詢google後臺是否擁有該商品id。如果有該商品id,同時返回該商品價格,貨幣,描述資訊等資訊
- 根據返回資訊到伺服器建立預支付訂單。
- 建立成功後,呼叫googlePay.buyGoods(activity,productId,developerPayload)購買方法,下面分為兩種情況,一種是購買成功,觸發onBuySuccess(OrderParam orderParam)方法(下一步驟為4),一種是購買失敗,而失敗中如果是由於未消耗造成的會返回狀態碼為7(下一步驟為6);觸發haveGoodsUnConsume()方法。
- 購買成功,到伺服器校驗該商品.
- 如果商品校驗成功,呼叫googlePay.consumeAsync(mPurchasingItemType,purchaseData, dataSignature)方法消耗該商品,如果消耗失敗,那麼下次購買時,到步驟1,直到消耗成功後才能進行下一次支付,這樣可以百分百的保證不丟單.
- 根據返回的狀態碼為7時,會觸發haveGoodsUnConsume方法,在該方法中呼叫handQueryInventoryAsync()方法查詢未消耗商品的資訊
- 根據查詢到的資訊,到伺服器校驗該商品資訊;(下一步驟為5)。
GooglePay接入方法說明
初始化GooglePay物件
/**
* 初始化Google pay
*
* @param context 上下文引數
* @param base64EncodedPublicKey 購買需要的公鑰
* @param listener 初始化和購買的回撥
*/
public GooglePay(Activity context, String base64EncodedPublicKey, GooglePayStatus listener)
複製程式碼
GooglePayStatus中包含購買過程會用到的方法
/**
* 初始化失敗是,呼叫該方法。在呼叫購買時,需要對該引數進行判斷
* https://www.jianshu.com/p/87ffdb7bc439
* 該文章有提到解決方法
*
* @param boo
*/
public abstract void initFailed(boolean boo);
/**
* 各種的支付過程中的狀態
*
* @param code
*/
public abstract void onGgStatus(int code);
/**
* 呼叫購買或訂閱成功時會回撥該方法
*
* @param data 返回Google pay購買成功返回的引數
*/
public abstract void onBuySuccess(OrderParam data);
/**
* 呼叫消耗商品成功
*/
public abstract void onConsumeSuccess();
/**
* <p>
* public void setIsAutoConsume(boolean isAutoConsume) {
* this.isAutoConsume = isAutoConsume;
* }
* <p>
* 當setIsAutoConsume 設定為true時,
* 將會回撥該方法,根據自己的業務邏輯進行處理消耗商品邏輯
*
* @param purchase
*/
public void unConsumeAsync(Purchase purchase) {
}
public void cancelPurchase() {
}
/**
* 購買時,有未消耗的商品,回撥該方法
*/
public void haveGoodsUnConsume() {
}
/**
* 其他錯誤
* @param status
* @param error
*/
public void ohterError(int status, String error) {
}
複製程式碼
購買成功後的回撥,需要在onActivityResult方法中處理
public boolean onActivityResult(int requestCode, int resultCode, Intent data) {
if (googlePay != null && googlePay.isSetupDone()) {
return googlePay.handleActivityResult(requestCode, resultCode, data);
}
return false;
}
複製程式碼
查詢商品是否存在,如果存在,返回該商品id的相關資訊
/**
* 查詢商品的詳情資訊,同時用於判斷伺服器是否配置了該商品id。
*
* @param productId 待查詢的商品id
* @param listener 回撥資訊
*/
private void queryItemDetails(String productId, IQueryProductDetailListener listener) ;
複製程式碼
package com.google.pay;
public interface IQueryProductDetailListener {
/**
* @param price 價格
* @param currency 貨幣單位
* @param other 商品名稱
*/
void querySuccess(long price, String currency, String other);
/**
* 查詢失敗,不存在該商品
*
* @param status
* @param msg
*/
void queryFailed(int status, String msg);
/**
* 查詢失敗
*/
void queryIdNoExist();
}
複製程式碼
呼叫購買方法
/**
* 用於購買商品
*
* @param context
* @param productId Google play store 後臺定義的商品的id。如果錯誤的話,將提示檢索失敗
* @param payload 該欄位隨機生成一定長度的字串,用於生成的訂單支付成功後根據google返回的訂單資訊關聯。
*/
public void buyGoods(Activity context, String productId, String payload)
複製程式碼
消耗商品的方法
/**
* 該方法使用者手動消耗購買的商品。預設情況下,購買成功後不消耗商品。需要呼叫該方法。
* 下面三個引數都是Purchase獲取到的。
*
* @param mPurchasingItemType
* @param purchaseData
* @param dataSignature
*/
public void consumeAsync(String mPurchasingItemType, String purchaseData, String dataSignature)
複製程式碼
伺服器校驗流程
Purchase purchase = inventory.getPurchase(product);
Log.d(TAG, "Purchase state: " + purchase.getPurchaseState());
// 0 (purchased), 1 (canceled), or 2 (refunded).
複製程式碼
測試相關
其他問題說明
支付遭拒
1.1 應用商品可能違反了當地的政策,例如vpn在中東很多國家是違法的。
1.2 由於代理的vpn,ip頻繁切換導致過銀行風控
1.3 繫結的銀行卡地址和google後臺註冊的地址不相符和,可以通過修改google的地址進行解決,但是該種方式很複雜,成功率很低。
1.4 出現支付遭拒的訂單號客戶端是由兩串number
構成的,如果是成功的情況,訂單號是由GPA.number
構成。
1.5 出現支付遭拒是一件正常的事情,我諮詢過很多做遊戲和應用的開發,在國外都有遇到支付遭拒的情況,應該能排查程式碼的問題。
1.6 手機裝置root過,不能支付成功
關於繫結銀行卡支付
- 如果使用真實貨幣支付,首先你需要一張支援外幣的信用卡。例如mastcard,visa等。在繫結銀行卡的過程中,你可能需要切換你的賬單地址,否者很難繫結成功,總之,這個過程比較麻煩。測試支付可以新增測試賬號測試。
不能彈出Google 支付的介面
- 你是否給Google Service
顯示懸浮框
許可權 - 該賬號是否已經存在購買的商品,但是還未消耗,此時也不會彈出支付框
測試裝置服務不支援
- google service版本太低,需要到應用商店的設定中,點選版本號,提示更新。這個過程有點慢,感覺點選沒有反應,實際上是在後臺下載。需要等一會兒,或者需要重啟一下裝置等。反正就是要讓應用商店更新到最新的版本。否者會出現裝置不支援google pay。
關於Google play store 升級
如果手機的Google 服務先關元件是通過三方安裝,那麼很有可能版本比較低。不支援支付的api version3. 此時需要對Google play stroe 進行升級。在選單欄中-->設定-->點選版本號。然後點選確認。需要注意的是,點選確認後,手機可能看試沒有反應。實際上在下載。根據網路情況,等一定時間,重啟手機。應用就更新了。
初始化失敗
如果Google服務的版本已經是最新了還出現出事話失敗的情況,可以通過以下方式解決。
-
需要將手機中的google賬號全部刪除
-
然後把google service和google play商店中的快取全部清理掉
-
重新登入賬號。。
-
手機沒有安裝service相關元件,下載go安裝器安裝手機相關的元件,需要手動更新下,預設下載的版本有些老。