Sample for In-App Billing version 3
可以直接将ggpaylib直接打包成aar或者是jar文件,copy到项目中即可使用。
继上一篇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 OnGooglePayStatusListener() {
/**
* 初始化失败是,调用该方法。在调用购买时,需要对该参数进行判断
* https://www.jianshu.com/p/87ffdb7bc439
* 该文章有提到解决方法
*
* @param boo
*/
@Override
public void initStatus(boolean boo) {
}
@Override
public void onErrorCode(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.onErrorCode(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.onErrorCode(OnGooglePayStatusListener.SUBS_FAILED);
}
}
}
googlePay.setIsAutoConsume(true);
方法设置为true时,购买完成后会自动调用消耗方法。构造函数中的第三个参数的void unConsumeAsync(Purchase purchase);
方法不会被回调。- 初始化第三个参数的方法说明
对上面的第三个参数的回调方法进行说明
/** * 初始化失败是,调用该方法。在调用购买时,需要对 * https://www.jianshu.com/p/87ffdb7bc439 * 该文章有提到解决方法 * * @param boo */ void initStatus(boolean boo);
/**
* 各种的支付过程中的状态
*
* @param code
*/
void onErrorCode(int code);
/**
* 调用购买或订阅成功时会回调该方法
*
* @param data
*/
void onBuySuccess(OrderParam data);
/**
* 调用消耗商品成功
*/
void onConsumeSuccess();
/**
* <p>
* public void setIsAutoConsume(boolean isAutoConsume) {
* this.isAutoConsume = isAutoConsume;
* }
* <p>
* setIsAutoConsume 设置为true时,将会自动消耗,不会回调该方法。设置为false,需要手动调用消耗方法
*
* @param purchase
*/
void unConsumeAsync(Purchase purchase);
配置aidl文件不被混淆
-keep class com.android.vending.billing.**{*;}