继上一篇Google 内购及登录和Facebook登录的KEY 申请和可能遇到的问题,总结一篇客户端和服务器的整体流程。
首先需要明白以下概念
- Google inapp分为购买
mHelper.launchPurchaseFlow(context, productId, RC_REQUEST, mPurchaseFinishedListener, payload);
和消耗mHelper.consumeAsync(purchase, mConsumeFinishedListener);
两个步骤。如果购买成功,再调用消耗方法,下次可以继续购买。如果购买成功,不调用消耗的方法,那么下次将不能再次购买,返回的错误码为7。 - 调用查询方法
mHelper.queryInventoryAsync(mGotInventoryListener);
,可以查询到当前用户未消耗的商品。
代码实现
我对官方提供的demo进行了修改,将其支付相关代码抽取成了一个独立的moudle,打包成jar在项目中使用,因为该模块不涉及到任何的资源文件所以没用使用aar。
初始化
String base64EncodedPublicKey = "xxxxxxxx";
googlePay = new GooglePay(this, base64EncodedPublicKey, new GooglePayStatus() {
/**
* 初始化失败是,调用该方法。在调用购买时,需要对该参数进行判断
* https://www.jianshu.com/p/87ffdb7bc439
* 该文章有提到解决方法
*
* @param boo
*/
@Override
public void initFailed(boolean boo) {
}
@Override
public void onGgStatus(int code) {
}
@Override
public void onBuySuccess(OrderParam data) {
//说明用户购买成功
//TODO 如果设置setIsAutoConsume未false,不自动消耗。将购买订单上传到服务器,服务器到Google 服务器校验订单成功时,手动调用消耗方法
if (googlePay != null) {
googlePay.consumeAsync(data.currBuyType, data.purchaseData, data.dataSignature);
}
}
@Override
public void onConsumeSuccess() {
//说明用户消耗商品成功
}
@Override
public void unConsumeAsync(Purchase purchase) {
//如果设置setIsAutoConsume未false,用户上次有未消耗的商品,会自动回调该方法,此时上传服务器校验,如果校验成功,手动调用消耗方法
if (googlePay != null) {
googlePay.consumeAsync(purchase.getItemType(), purchase.getOriginalJson(), purchase.getSignature());
}
}
});
注册回调
如果不调用该方法googlePay.handleActivityResult(requestCode, resultCode, data)
那么支付成功后的参数将不能获取到。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (googlePay == null) return;
// Pass on the activity result to the helper for handling
if (!googlePay.handleActivityResult(requestCode, resultCode, data)) {
// not handled, so handle it ourselves (here's where you'd
// perform any handling of activity results not related to in-app
// billing...
super.onActivityResult(requestCode, resultCode, data);
} else {
}
}
释放对象
@Override
protected void onDestroy() {
super.onDestroy();
if (googlePay != null) {
googlePay.DestoryQuote();
}
}
购买商品方法
/**
* 用于购买商品
*
* @param context
* @param productId Google play store 后台定义的商品的id。如果错误的话,将提示检索失败
* @param payload 该字段随机生成一定长度的字符串,用于生成的订单支付成功后根据google返回的订单信息关联。
*/
public void buyGoods(Activity context, String productId, String payload) {
Log.i("payload", "GpGoods:" + payload);
try {
mHelper.launchPurchaseFlow(context, productId, RC_REQUEST,
mPurchaseFinishedListener, payload);
} catch (IabHelper.IabAsyncInProgressException e) {
// complain("Error launching purchase flow. Another async operation in progress.");
// setWaitScreen(false);
if (listener != null) {
listener.onGgStatus(OnGooglePayStatusListener.INAPP_FAILED);
}
}
}
订阅商品方法
/**
* 用于订阅商品
*
* @param context
* @param productId Google play store 后台定义的商品的id。如果错误的话,将提示检索失败
* @param payload 该字段随机生成一定长度的字符串,用于生成的订单支付成功后根据google返回的订单信息关联。
*/
public void subsGoods(Activity context, String productId, String payload) {
Log.i("payload", "subsGoods:" + payload);
try {
mHelper.launchSubscriptionPurchaseFlow(context, productId, RC_REQUEST,
mPurchaseFinishedListener, payload);
} catch (Exception e) {
// complain("Error launching purchase flow. Another async operation in progress." + e);
// setWaitScreen(false);
if (listener != null) {
listener.onGgStatus(OnGooglePayStatusListener.SUBS_FAILED);
}
}
}
常用方法和参数说明
-
googlePay.setIsAutoConsume(true);
方法设置为true时,购买完成后会自动调用消耗方法。构造函数中的第三个参数的void unConsumeAsync(Purchase purchase);
方法不会被回调。 - 初始化第三个参数的方法说明
对上面的第三个参数的回调方法进行说明
/**
* 初始化失败是,调用该方法。在调用购买时,需要对该参数进行判断
* 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();
/**
*
* public void setIsAutoConsume(boolean isAutoConsume) {
* this.isAutoConsume = isAutoConsume;
* }
*
* setIsAutoConsume 设置为true时,将会自动消耗不需要重写该方法,不会回调该方法。设置为false,需要手动调用消耗方法
*
* @param purchase
*/
public void unConsumeAsync(Purchase purchase) {
}
代码混淆
配置aidl文件不被混淆
-keep class com.android.vending.billing.**{*;}
demo地址