安卓集成google内支付

Google Play Console创建应用
我的应用是后台人员完成的,具体的可以参考Google Play Console创建应用其中需要注意的是添加测试人员只是测试APK包,需要进行内支付测试则需要添加可用于测试的Google账号,添加了之后此账号在这apk中测试则不是真实支付,不会扣钱。

导入工具类

在 Android Studio 中打开Android SDK Manager(在Tools–>Android 里面),找到并安装Google Play Billing Library这一项。

  1. 在 Android Studio 中打开Android SDK Manager(在Tools–>Android 里面),找到并安装Google Play Billing Library这一项。
  2. 如果 Android Studio 中没有Google Play Billing Library这一项,就直接下载百度网盘提取码:hu15
  3. 项目中导入IInAppBillingService.aidl文件
    如图在main文件夹下创建一个directory命名为aidl,后面的就按照上述图片中的文件结构创建
  4. 导入之后在Build中点击Make Project
    在这里插入图片描述
    你会发现在在根目录下会生成该文件的接口
    在这里插入图片描述
  5. 将其他google支付的工具放进自己项目
    在这里插入图片描述
    现在准备工作已经完成,接下来就是支付的实现

实现客户端google内支付

  1. 添加google支付的权限
    <uses-permission android:name="com.android.vending.BILLING"></uses-permission>
  1. 初始化 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();
                        }
                    }
                });
    }

                ...
                ...
                ...
                }
  1. 查询是否有需要消耗的商品的监听
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;
                
            }
        }
    };
  1. 消耗已购买商品的监听
 IabHelper.OnConsumeFinishedListener mConsumeFinishedListener = new IabHelper.OnConsumeFinishedListener() {
        @Override
        public void onConsumeFinished(Purchase purchase, IabResult result) {
            LogUtil.i("DDDDDD", result);

        }
    };
  1. 购买是否成功的监听
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();
                    }
              }
    };
  1. 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
}
  1. 发起购买
 mHelper.launchPurchaseFlow(getActivity(),"商品ID:sku", RC_REQUEST(自己定义一个请求码,随便写), mPurchaseFinishedListener, "自己传给google的数据,可以不传");

  1. 最后在退出页面时还需要将mHelper给关闭
    @Override
    public void onDestroy() {
        super.onDestroy();
        if (mHelper != null) {
            try {
                mHelper.dispose();
                mHelper = null;
            } catch (IabHelper.IabAsyncInProgressException e) {
                e.printStackTrace();
            }
        }
    }

关于测试中遇到的问题

在这里插入图片描述
在这里插入图片描述
这些问题导致的原因可能为:

  1. 与google play 上发布的版本code不一致
  2. 包的签名不一致
  3. 未在google后台配置相应的内购商品
  4. 你在google上传的apk未发布
  5. 商品id错误
  6. 测试账号的支付设置地区一定不能设为大陆,设置为香港都行
  7. 调取的是默认gmail账号付款,保证此账号不是在google play创建应用的账号

成功后的页面

在这里插入图片描述
到此就将google支付接入完毕了,可能还有些细节没有写到,我也只是一枚新手,代码风格不太好,还在改进,请见谅

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值