AndroidGoogle應用內支付

NO IMAGE

轉載請標明出處,謝謝Android Google應用內支付

前言

之前寫過了Facebook登錄Google登錄,那麼Google支付能錯過嗎?當然是不能的了。今天來說說Google支付,我們這裡只說集成方式,配置可以看Google(應用內支付)官方文檔

準備工作

要集成Google支付的準備工作有哪些呢?

  • 1、手機上安裝__Google服務__(當然是針對國內的用戶,國外的相信大部分都有Google服務);
  • 2、一個綁定信用卡的Google賬號;
  • 3、Google play客戶端;
  • 4、Google play console用於配置應用內商品信息);
  • 5、科學上網的工具。

首先

上面的準備工作都做好了之後需要幹什麼呢?當然是在Google play console上配置相關應用和商品信息了,至於如何配置具體可以參考Google支付配置

  • 1、支付流程說明
    關於Google支付的流程說明:
    1>前提條件

    1、檢查你的包名和簽名文件是否和Google Console 上面上傳的apk包是否一致
    2、檢查版本號是否和Google console發佈的apk版本是否一致
    3、檢查你是否可以購買,是否綁定了銀行卡,手機支不支持Google支付,手機是否有Google服務
    

    2>支付流程

     1、第一步,初始化Google支付
     2、第二步,初始化成功後調用查詢購買的商品操作,查詢成功調用消耗操作,防止不能購買的情 況發生
     3、第三步,生成訂單號進行購買操作
     4、第四步,購買成功後再次調用一次消耗操作(為了下次購買可以成功)
     5、第五步,拿到Google支付返回的相關信息,在服務器進行驗證操作。
     6、第六步,服務器拿到你上傳的相關信息和Google支付進行交互驗證,驗證成功後Google發貨,服務器給你返回相關信息
    
  • 2、集成工作
    首先在AndroidManifest文件中加入支付權限和版本

    <uses-permission android:name="com.android.vending.BILLING"/>
    //在application的節點下添加
    <meta-data
          android:name="com.google.android.gms.vision.DEPENDENCIES"
          android:value="face" />
    
  • 3、複製Google支付的aidl文件和util包中的各種文件

AndroidGoogle應用內支付

其次

Google支付管理類的創建(支付封裝成一個工具類)

public class GooglePlayManager {
private static final String TAG = GooglePlayManager.class.getSimpleName();
@SuppressLint("StaticFieldLeak")
private static IabHelper mHelper;
//是否初始化
private static boolean mSetupDone = false;
//公鑰
private static String mPublicKey;
//訂單號
private static String payload;
//商品集合
private static List<String> mGoodsList = new ArrayList<>();
/**
* 初始化
*
* @param context   上下文
* @param publicKey 公鑰
* @param productID 商品ID
* @param goodsList 商品集合
* @param mListener 接口
*/
public static void init(final Context context, String publicKey, final String productID,
final OnGoogleInitListener mListener) {
mPublicKey = publicKey;
//創建谷歌幫助類
mHelper = new IabHelper(context, publicKey);
mHelper.enableDebugLogging(true);
mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
@Override
public void onIabSetupFinished(IabResult result) {
if (!result.isSuccess()) {
mListener.onGoogleInitFailed(result.getMessage());
mSetupDone = false;
} else {
mSetupDone = true;
mListener.onGoogleInitSuccess("init Success");
//getLTOrderID(LTAppID, LTAppKey,gid, packageId, params);
try {
mHelper.queryInventoryAsync(true, null, null,
new IabHelper.QueryInventoryFinishedListener() {
@Override
public void onQueryInventoryFinished(IabResult result, Inventory inv) {
if (inv != null && inv.getAllPurchases() != null
&& inv.getAllPurchases().size() > 0) {
mGoodsList = getGoodsList(inv.getAllPurchases());
}
if (result != null && inv != null) {
if (result.isSuccess() && inv.getAllPurchases() != null
&& inv.getAllPurchases().size() > 0) {
//消費, 並下一步, 這裡Demo裡面我沒做提示,將購買了,但是沒消費 
// 掉的商品直接消費掉, 正常應該
//給用戶一個提示,存在未完成的支付訂單,是否完成支付
for (int i = 0; i < inv.getAllPurchases().size(); i++) {
consumeProduct(inv.getAllPurchases().get(i));
}
}
}
}
});
} catch (IabHelper.IabAsyncInProgressException e) {
e.printStackTrace();
}
}
}
});
}
/**
* 消費掉商品
*/
private static void consumeProduct(Purchase purchase) {
try {
mHelper.consumeAsync(purchase, new IabHelper.OnConsumeFinishedListener() {
@Override
public void onConsumeFinished(Purchase purchase, IabResult result) {
});
} catch (IabHelper.IabAsyncInProgressException e) {
e.printStackTrace();
}
}
/**
* 購買
*
* @param context     上下文
* @param requestCode 請求碼
* @param goodsList   商品集合
* @param productID   商品ID
* @param mListener   接口
*/
public static void recharge(final Context context,final int requestCode,
final String productID,
final OnGooglePlayResultListener mListener) {
if (mSetupDone) {
//創建訂單獲取訂單號(在自己的服務器上獲取訂單號)
try {
if (mHelper == null) return;
List<String> subSku = new ArrayList<>();
mHelper.queryInventoryAsync(true, goodsList, subSku,
new IabHelper.QueryInventoryFinishedListener() {
@Override
public void onQueryInventoryFinished(IabResult result, Inventory inv) {
if (result != null) {
if (result.isSuccess() && inv.hasPurchase(productID)) {
//消費, 並下一步, 這裡Demo裡面我沒做提示,將購買了,但是沒消費掉的商 
//品直接消費掉, 正常應該
//給用戶一個提示,存在未完成的支付訂單,是否完成支付
consumeProduct(inv.getPurchase(productID));
} else {
getProduct((Activity) context, requestCode, productID);
}
}
}
}
});
} catch (IabHelper.IabAsyncInProgressException e) {
e.printStackTrace();
}
} else {
if (TextUtils.isEmpty(mPublicKey)) {
//創建谷歌幫助類
mHelper = new IabHelper(context, mPublicKey);
mHelper.enableDebugLogging(true);
mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
@Override
public void onIabSetupFinished(IabResult result) {
if (result.isFailure()) {
mSetupDone = false;
}
if (result.isSuccess()) {
mSetupDone = true;
}
}
});
}
}
}
/**
* 產品獲取
*
* @param context      上下文
* @param REQUEST_CODE 請求碼
* @param SKU          產品唯一id, 填寫你自己添加的商品id
* @param mListener    回調監聽
*/
private static void getProduct(final Activity context, int REQUEST_CODE,
final String SKU, final OnGooglePlayResultListener mListener) {
if (!TextUtils.isEmpty(payload)) {
try {
mHelper.launchPurchaseFlow(context, SKU, REQUEST_CODE, new IabHelper.OnIabPurchaseFinishedListener() {
@Override
public void onIabPurchaseFinished(IabResult result, Purchase purchase) {
if (result.isFailure()) {
mListener.onPlayError(result.getMessage());
return;
}
mListener.onPlaySuccess("Purchase successful");
if (purchase.getSku().equals(SKU)) {
//購買成功,調用消耗
consumeProduct(purchase);
}
}
}, payload);
} catch (IabHelper.IabAsyncInProgressException e) {
e.printStackTrace();
}
} else {
mListener.onPlayError("Order creation failed");
}
}
/**
* 回調
*
*
* @param requestCode     請求碼
* @param resultCode      結果碼
* @param data            數據
*/
public static void onActivityResult( int requestCode, int resultCode, Intent data, int selfRequestCode) {
//將回調交給幫助類來處理, 否則會出現支付正在進行的錯誤
if (mHelper == null) return;
mHelper.handleActivityResult(requestCode, resultCode, data);
if (requestCode == selfRequestCode) {
int responseCode = data.getIntExtra("RESPONSE_CODE", 0);
//訂單信息
String purchaseData = data.getStringExtra("INAPP_PURCHASE_DATA");
String dataSignature = data.getStringExtra("INAPP_DATA_SIGNATURE");
if (!TextUtils.isEmpty(purchaseData)) {
GoogleModel googleModel = new Gson().fromJson(purchaseData, GoogleModel.class);
Log.e(TAG, googleModel.getPurchaseToken());
Map<String, Object> params = new WeakHashMap<>();
params.put(購買成功的token(具體以自己服務的規定為準), googleModel.getPurchaseToken());
params.put(訂單號, payload);
//上傳到服務器進行驗證之後再次調用消費用於消耗掉購買的商品
}
}
}
/**
* 釋放資源
*/
public static void release() {
if (mHelper != null) {
mHelper.disposeWhenFinished();
}
mHelper = null;
}
/**
* 獲取商品集合
*/
private static List<String> getGoodsList(
List<Purchase> mList) {
mGoodsList = new ArrayList<>();
for (int i = 0; i < mList.size(); i++) {
mGoodsList.add(mList.get(i).getSku());
}
return mGoodsList;
}
}

__流程說明:__首先初始化Google支付,初始化成功後查詢是否有未消費的,如果有則消費,如果沒有則繼續調用購買功能。當然,購買之前需要創建訂單,之後傳入Google支付需要的參數支付。支付成功後在onActivityResult方法裡獲取到Google返回的token,然後到自己的服務器做驗證。驗證成功後再次調用Google的消費功能,用於消耗此次購買。這一步千萬不能省,要不下次可能就不能進行購買了。

最後

好了,這就是今天的Google支付說明了,寫的不好還請諒解。

感謝

谷歌支付驗證 403錯誤

相關文章

ONEstore平臺配置

QQ平臺配置

微信平臺配置

nexus3.x私服配置(windows版)