安卓集成google内支付
Google Play Console创建应用
我的应用是后台人员完成的,具体的可以参考Google Play Console创建应用其中需要注意的是添加测试人员只是测试APK包,需要进行内支付测试则需要添加可用于测试的Google账号,添加了之后此账号在这apk中测试则不是真实支付,不会扣钱。
导入工具类
在 Android Studio 中打开Android SDK Manager(在Tools–>Android 里面),找到并安装Google Play Billing Library这一项。
- 在 Android Studio 中打开Android SDK Manager(在Tools–>Android 里面),找到并安装Google Play Billing Library这一项。
- 如果 Android Studio 中没有Google Play Billing Library这一项,就直接下载百度网盘提取码:hu15
- 项目中导入IInAppBillingService.aidl文件
- 导入之后在Build中点击Make Project
你会发现在在根目录下会生成该文件的接口
- 将其他google支付的工具放进自己项目
现在准备工作已经完成,接下来就是支付的实现
实现客户端google内支付
- 添加google支付的权限
<uses-permission android:name="com.android.vending.BILLING"></uses-permission>
- 初始化 IabHelper
public class ScanMainActivity extends AppCompatActivity {
IabHelper mHelper;
...
...
...
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.scan_activity_main);
String base64EncodedPublicKey ="Public Key" //这是在Google Play Console创建应用的时候google给的应用公匙,这里最好是将公匙放服务器上,客户端进行网络请求获得
mHelper = new IabHelper(getContext(), base64EncodedPublicKey);
mHelper.enableDebugLogging(false);
mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
public void onIabSetupFinished(IabResult result) {
if (!result.isSuccess()) {
return;
}
if (mHelper == null) return;
try {
mHelper.queryInventoryAsync(queryInventoryFinishedListener);//查询有是否需要消耗的商品
} catch (IabHelper.IabAsyncInProgressException e) {
e.printStackTrace();
}
}
});
}
...
...
...
}
- 查询是否有需要消耗的商品的监听
IabHelper.QueryInventoryFinishedListener queryInventoryFinishedListener = new IabHelper.QueryInventoryFinishedListener() {
@Override
public void onQueryInventoryFinished(IabResult result, final Inventory inv) {
if (mHelper == null) return;
Purchase mPurchase = inv.getPurchase("你创建的内购商品的ID,如果是数组自己遍历一遍");
if (mPurchase != null) {
try {
mHelper.consumeAsync(inv.getPurchase("同上", mConsumeFinishedListener);查询到之后调用消耗监听
} catch (IabHelper.IabAsyncInProgressException e) {
e.printStackTrace();
}
return;
}
}
};
- 消耗已购买商品的监听
IabHelper.OnConsumeFinishedListener mConsumeFinishedListener = new IabHelper.OnConsumeFinishedListener() {
@Override
public void onConsumeFinished(Purchase purchase, IabResult result) {
LogUtil.i("DDDDDD", result);
}
};
- 购买是否成功的监听
IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
@Override
public void onIabPurchaseFinished(IabResult result, final Purchase info) {
if (result.isFailure()) {
return;
}
try {
mHelper.consumeAsync(info, mConsumeFinishedListener);//消耗购买成功的商品,否则不能二次购买
} catch (IabHelper.IabAsyncInProgressException e) {
e.printStackTrace();
}
}
};
- google回传的信息处理
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (mHelper == null) return;
**将回调消息分发给mHelper.handleActivityResult处理**
if (!mHelper.handleActivityResult(requestCode, resultCode, data)) {
super.onActivityResult(requestCode, resultCode, data);
} else {
}
}
在这一步我遇到一个难题,因为我是在fragment中进行google支付,所以返回的消息被父activity拦截,因此在这一步停留了许久。下面是解决方法:
在父activity中实例化支付页面并绑定id,写在onCreate方法中即可
FragmentManager manager = this.getSupportFragmentManager();
fragmentBuyCorn=(Fragment) manager.findFragmentById(R.id.flNavigationConversion);
重写父activity中的onActivityResult方法
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
Fragment fragment=getSupportFragmentManager().findFragmentById(R.id.flNavigationConversion);
fragment.onActivityResult(requestCode, resultCode, data);
这里已经将消息传递给fragment
}
- 发起购买
mHelper.launchPurchaseFlow(getActivity(),"商品ID:sku", RC_REQUEST(自己定义一个请求码,随便写), mPurchaseFinishedListener, "自己传给google的数据,可以不传");
- 最后在退出页面时还需要将mHelper给关闭
@Override
public void onDestroy() {
super.onDestroy();
if (mHelper != null) {
try {
mHelper.dispose();
mHelper = null;
} catch (IabHelper.IabAsyncInProgressException e) {
e.printStackTrace();
}
}
}
关于测试中遇到的问题
这些问题导致的原因可能为:
- 与google play 上发布的版本code不一致
- 包的签名不一致
- 未在google后台配置相应的内购商品
- 你在google上传的apk未发布
- 商品id错误
- 测试账号的支付设置地区一定不能设为大陆,设置为香港都行
- 调取的是默认gmail账号付款,保证此账号不是在google play创建应用的账号
成功后的页面
到此就将google支付接入完毕了,可能还有些细节没有写到,我也只是一枚新手,代码风格不太好,还在改进,请见谅