1.前言
发布app到海外市场,内购不免要使用Google支付,然后发现集成Google支付有些流程和注意事项比起国内的支付宝、微信要复杂一些,在此记录一下.
2.准备工作
(1)请求的是国外的服务器,所有FQ工具是必须的.
(2)Google支付还要求手机安装Google三件套,如果没有安装,如下:
(3)准备开发者账号
Google开发者管理中心
(4)创建应用和提交测试版本(一般为Beta测试版),创建完后,要为应用添加商品,在添加测试人员账号,点击生成的链接即可,记录密匙
(5)初始化Helper的时候需要上面的密钥,根据同事反馈,密钥错误会报 response:-1003
3.Google支付大致流程
4.代码
//修改IabHelper的queryPurchases(Inventory,String)源码
else {
//失败时 获取当前失败的订单信息
failPurchaseData = purchaseData;
failSignature = signature;
PreSharedManager.setString("failPurchaseData", purchaseData, mContext);
PreSharedManager.setString("failSignature", signature, mContext);
logWarn("Purchase signature verification **FAILED**. Not adding item.");
logDebug(" Purchase data: " + purchaseData);
logDebug(" Signature: " + signature);
verificationFailed = true;
}
// 查询我们拥有的项目和订阅时,这个监听器被调用,这步发生在初始化IabHelper后
IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
public void onQueryInventoryFinished(IabResult result,
Inventory inventory) {
// Have we been disposed of in the meantime? If so, quit.
if (mHelper == null)
return;
// Is it a failure?
if (result.isFailure()) {
String faString =PreSharedManager.getString("failPurchaseData", ZeroPayActivity.this);
String sign=PreSharedManager.getString("failSignature", ZeroPayActivity.this);
if (!TextUtils.isEmpty(faString) && !TextUtils.isEmpty(sign)) {
try {
Purchase p = new Purchase("ITEM_TYPE_INAPP",faString, sign);
mHelper.consumeAsync(p, mConsumeFinishedListener);
} catch (Exception e) {
e.printStackTrace();
}
} else {
//向本地服务器请求订单号
googleProcess();
}
return;
}
/*
* Check for items we own. Notice that for each purchase, we check
* the developer payload to see if it's correct! See
* verifyDeveloperPayload().
*/
// Check for gas delivery -- if we own gas, we should fill up the
// tank immediately
Purchase gasPurchase = inventory.getPurchase(SKU_GAS);
// if (inventory != null) {
// Log.i("ym", "" + inventory.getSkuDetails(SKU_GAS));
// }
if (inventory.hasPurchase(SKU_GAS)) {
try {
mHelper.consumeAsync(inventory.getPurchase(SKU_GAS),
mConsumeFinishedListener);
} catch (IabHelper.IabAsyncInProgressException e) {
complain("Error consuming. Another async operation in progress.");
}
return;
}
// updateUi();
// setWaitScreen(false);
}
};
// Callback for when a purchase is finished购买完成时的回调
IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
public void onIabPurchaseFinished(IabResult result, Purchase purchase) {
// if we were disposed of in the meantime, quit.
if (mHelper == null)
return;
if (result.isFailure()) {
//支付未成功也要消耗产品,防止下次购买时,卡单无法支付
if (result.getResponse() == -1003||result.getResponse() == 7) {
if (purchase.getSku().equals(SKU_GAS)) {
try
{
mHelper.consumeAsync(purchase, mConsumeFinishedListener);
} catch (IabAsyncInProgressException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return;
}
if (purchase.getSku().equals(SKU_GAS)) {
try {
mHelper.consumeAsync(purchase, mConsumeFinishedListener);
} catch (IabHelper.IabAsyncInProgressException e) {
complain("Error consuming gas. Another async operation in progress.");
return;
}
}
}
};