Google支付从创建商品到支付成功踩过的坑
最近app需要上架到谷歌应用市场,必要条件是需要集成谷歌支付,于是开始一顿操作++++一堆怼脸型的bug解决过程,先从创建应用开始。
- 创建谷歌账号,并开通开发者权限,需要支付money,公司账号。
- 创建应用,应用提前准备好名称,图片等信息,开发人员需要打出一个release包,需要签名文件签名,注意版本号,测试阶段时,使用的版本号,不能高于谷歌平台上传的这个包。release包可以无内容,主要是包名和签名固定。
- 需要开发人员 准备谷歌的测试账号,实现不用支付即可完成支付流程。
- 创建应用-上传apk-提交内容详情内容-确定内容分级-选择发布范围,整个过程。创建过程中未截图保存内容,欢迎有遇到问题的朋友,评论区留言交流。
- 新版的谷歌支付已经废弃掉原有Google In-app Billing, 复制aidl文件到项目中的方式,目前使用 BillingClient 链接谷歌-查询产品-购买-消耗等一系列流程。
app内接入流程
1、添加依赖、添加权限。
implementation 'com.android.billingclient:billing:3.0.0'
<!--谷歌商店应用内购买结算需要的权限--><uses-permission android:name="com.android.vending.BILLING" /><uses-permission android:name="com.farsitel.bazaar.permission.PAY_THROUGH_BAZAAR" />
2、创建连接。
public void init() {mBillingClient = BillingClient.newBuilder(mActivityRef.get()).setListener(mPurchasesUpdatedListener).enablePendingPurchases().build();if (!mBillingClient.isReady()) {mBillingClient.startConnection(new BillingClientStateListener() {@Overridepublic void onBillingSetupFinished(BillingResult billingResult) {if (billingResult != null) {if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {LogUtil.i(TAG, "onBillingSetupFinished==ok");} else {LogUtil.w(TAG, "onBillingSetupFinished--error==" + billingResult.getDebugMessage() + "====" + billingResult.getResponseCode());}} else {LogUtil.w(TAG, "billingResult ==== null");}}@Overridepublic void onBillingServiceDisconnected() {LogUtil.w(TAG, "onBillingServiceDisconnected");}});} else {LogUtil.w(TAG, "mBillingClient.isReady() false");}}
3、购买
/*** 购买*/public void recharge() {if (mBillingClient.isReady()) {List<String> skuList = new ArrayList<>();skuList.add(mSku);//商品的idskuList.add("gas");// 这个参数不能为空,值随便传SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();params.setSkusList(skuList).setType(BillingClient.SkuType.INAPP);
//querySkuDetailsAsync 查询方法,list集合中传入商品id,谷歌后台-》应用内商品-》具体商品mBillingClient.querySkuDetailsAsync(params.build(),new SkuDetailsResponseListener() {@Overridepublic void onSkuDetailsResponse(BillingResult billingResult,List<SkuDetails> skuDetailsList) {if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK&& skuDetailsList != null) {for (SkuDetails skuDetails : skuDetailsList) {// skuDetails 对象信息
// {
// "skuDetailsToken":"AEuhp4K_N_DyvTtZXkguU4XHEfLN2y54NJwxl9B5XxyVk1cvJ7Vkh-cZHpKEApKj3-il",
// "productId":"f0908u_",
// "type":"inapp",
// "price":"US$1.34",
// "price_amount_micros":1339320,
// "price_currency_code":"USD",
// "title":"VIP (Funchat)",
// "description":"Become VIP chatting with girls you like"
// }String sku = skuDetails.getSku();//商品idif (mSku.equals(sku)) {LogUtil.i(TAG, "sku can buy ");LogUtil.i(TAG, skuDetails.toString());//真正的购买方法BillingFlowParams purchaseParams =BillingFlowParams.newBuilder().setSkuDetails(skuDetails).build();mBillingClient.launchBillingFlow(mActivityRef.get(), purchaseParams);}}} else {LogUtil.w(TAG, "goods search fail");}}});} else {ToastUtil.toastShortMessage(mActivityRef.get().getString(R.string.google_connect_error));}}
4、购买回调接口,购买成功,调用消耗方法,不然会导致下次购买失败
/*** 购买回调*/private PurchasesUpdatedListener mPurchasesUpdatedListener = new PurchasesUpdatedListener() {@Overridepublic void onPurchasesUpdated(BillingResult billingResult, List<Purchase> list) {String debugMessage = billingResult.getDebugMessage();LogUtil.e(TAG, "--》" + debugMessage);if (list != null && list.size() > 0) {if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {LogUtil.i(TAG, "购买成功,开始消耗商品");for (Purchase purchase : list) {mConsume = "2";LogUtil.i(TAG, "PurchaseToken->" + purchase.getPurchaseToken());consume(purchase.getPurchaseToken());}}} else {switch (billingResult.getResponseCode()) {case BillingClient.BillingResponseCode.SERVICE_TIMEOUT: {//服务连接超时mListener.onState(mActivityRef.get(), RechargeResult.failOf("-3"));mActivityRef.get().finish();break;}case BillingClient.BillingResponseCode.FEATURE_NOT_SUPPORTED: {mListener.onState(mActivityRef.get(), RechargeResult.failOf("-2"));mActivityRef.get().finish();break;}case BillingClient.BillingResponseCode.SERVICE_DISCONNECTED: {//服务未连接mListener.onState(mActivityRef.get(), RechargeResult.failOf("-1"));mActivityRef.get().finish();break;}case BillingClient.BillingResponseCode.USER_CANCELED: {//取消mListener.onState(mActivityRef.get(), RechargeResult.failOf("1"));mActivityRef.get().finish();break;}case BillingClient.BillingResponseCode.SERVICE_UNAVAILABLE: {//服务不可用mListener.onState(mActivityRef.get(), RechargeResult.failOf("2"));mActivityRef.get().finish();break;}case BillingClient.BillingResponseCode.BILLING_UNAVAILABLE: {//购买不可用mListener.onState(mActivityRef.get(), RechargeResult.failOf("3"));mActivityRef.get().finish();break;}case BillingClient.BillingResponseCode.ITEM_UNAVAILABLE: {//商品不存在mListener.onState(mActivityRef.get(), RechargeResult.failOf("4"));mActivityRef.get().finish();break;}case BillingClient.BillingResponseCode.DEVELOPER_ERROR: {//提供给 API 的无效参数mListener.onState(mActivityRef.get(), RechargeResult.failOf("5"));mActivityRef.get().finish();break;}case BillingClient.BillingResponseCode.ERROR: {//错误mListener.onState(mActivityRef.get(), RechargeResult.failOf("6"));mActivityRef.get().finish();break;}case BillingClient.BillingResponseCode.ITEM_ALREADY_OWNED: {//未消耗掉mConsume = "1";queryHistory();break;}case BillingClient.BillingResponseCode.ITEM_NOT_OWNED: {//不可购买mListener.onState(mActivityRef.get(), RechargeResult.failOf("8"));mActivityRef.get().finish();break;}}}}};
5、消耗
/*** 消耗*/private void consume(String purchaseToken) {// 只有消费成功之后,才能真正到账,否则3天之后,会执行退款处理 测试阶段只有5分钟ConsumeParams consumeParams =ConsumeParams.newBuilder().setPurchaseToken(purchaseToken).build();mBillingClient.consumeAsync(consumeParams, new ConsumeResponseListener() {@Overridepublic void onConsumeResponse(BillingResult billingResult, String s) {Log.e(TAG, "onConsumeResponse code = " + billingResult.getResponseCode() + " , msg = " + billingResult.getDebugMessage() + " , purchaseToken = " + purchaseToken); // 消费成功 处理自己的流程,我选择先存入数据库LogUtil.w(TAG, "-->" + s);if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {LogUtil.i(TAG,"consume success ");}}});//上传服务器验证
// uploadToServer(purchaseToken, mOrderID, mPayTest);}
错误1:此版本的应用未配置为通过GooglePlay结算。有关详情,请访问帮助中心。
app内错误截图
出现问题原因
- 是打包的时候,versionCode的值比提交到google play后台的版本要高。
- 打包的时候,和google play后台上的包的签名不一致,APK与发布证书一起签署。(重要提示:使用“Google Play应用程序签名”时,只有直接从Google PlayStore下载才有效!
- 登录测试机已登录谷歌账号,并已添加到谷歌测试账号中,添加地址 https://play.google.com/apps/testing/包名
- 确认账号信息里可用于测试的Gmail账号里,已添加测试账号。
错误2:应用内无法查询商品id,无法吊起支付窗口
一定要等你的应用为**Published**状态之后,并且创建了应用内商品为已激活状态,在app里面才能查到商品id,执行支付等操作,否则怎么样都查不到
- 应用已经发布了,但是还是吊不起支付窗口
首先app需要安装google三件套,不知道怎么安装的,可以安装一个YouTube,进入app后会自动提示你需要安装google play,需要vpn,然后一定注意了,需要在权限设置里面,把google play的##允许应用在后台弹窗界面##这个权限打开,一定记得要打开
- 当一切准备就绪之后,报:目前还无法在您所在的国家/地区购买Google Play中的内容。这个因为在中国不允许。
网页登录你的google账户:在设置里面,把你的地址改成美国或其他支持的国家,然后清除app内google play的数据,重新进入,重新选择地区(刚才你修改的地区),选完之后会提示你切换到美国的商店,然后再添加付款信息(中国的卡就行,我用的是招商银行的信用卡),这样就万事大吉了,之后就可以正常支付了。
错误3:In-app billing API version 3 is not supported on this device.
该手机登录Google账号的问题,或者说是Google账号的归属地问题,如果之前是ok的,突然报这样的的问题,重启,重启,重启 !!!包括电脑。至于哪些地方不能使用,我没有足够的账号数据支撑。或许咱们能做的是在产品角度,给出相应提示,例如更换账号啥的。
错误4:signInResult:failed code=12501
先检查网络是否墙了
流程跑通,放鞭炮,现在回顾来看,其实还挺简单的,最最最前提的条件是,翻墙成功,测试账号信息完善,会省80%的工作量。
Google支付从创建商品到支付成功踩过的坑相关推荐
- 【iOS内购支付】Uniapp拉起苹果内购支付注意事项、实现步骤以及踩过的坑(手把手教程)
前言 Hello!又是很长时间没有写博客了,因为最近又开始从事新项目,也是第一次接触关于uniapp开发原生IOS应用的项目,在这里做一些关于我在项目中使用苹果内购支付所实现的方式以及要注意的事项,希 ...
- Google in app billing 应用内支付
一 简介 Google in app billing 是google play 商店的应用内支付,他是一种应用内的虚拟的道具支付服务,支持应用内支付(inapp)和订阅(subs)两种模式; 在中国, ...
- java微信支付v3系列——5.微信支付成功回调
目录 java微信支付v3系列--1.微信支付准备工作 java微信支付v3系列--2.微信支付基本配置 java微信支付v3系列--3.订单创建准备操作 java微信支付v3系列--4.创建订单的封 ...
- 商品-商品订单-支付订单
商品,商品订单有应缴,根据商品订单下支付订单,实缴需要大于应缴,支付回调改商品订单实缴,支付时间.改支付订单 支付时间等. 支付订单实缴在支付时候确定,应缴在创建时候确定,应缴不会改动. 支付分为 初 ...
- java微信支付v3系列——8.微信支付之退款成功回调
目录 java微信支付v3系列--1.微信支付准备工作 java微信支付v3系列--2.微信支付基本配置 java微信支付v3系列--3.订单创建准备操作 java微信支付v3系列--4.创建订单的封 ...
- 支付后但是显示未支付,再次支付如果又支付成功了怎么办? 后端代码逻辑是什么?【杭州多测师_王sir】【杭州多测师】...
什么是掉单? 所谓的掉单,就是用户下单支付,在钱包里完成了支付,结果回到电商APP一看,订单还是未支付-- 毫无疑问,用户肯定会炸,结果不是投诉,就是差评. 用户感觉受到了欺诈 那么掉单是怎么来的呢? ...
- 支付宝支付 第一集:没有营业执照,怎样申请一个支付宝的商家号进行开发?使用支付宝支付开发网页移动应用,一分钟申请注册一个支付宝支付沙箱账号,支付宝支付入驻、创建应用、获取AppID
支付宝支付 第一集:没有营业执照,怎样申请一个支付宝的商家号进行开发?使用支付宝支付开发网页&移动应用,一分钟申请注册一个支付宝支付沙箱账号,支付宝支付入驻.创建应用.获取AppID 一.资源 ...
- 支付宝支付 第十一集:支付回调成功后的监听
支付宝支付 第十一集:支付回调成功后的监听 一.代码 目录结构 更新OrderDetailController.java package com.dzy.alipay.web.order; impor ...
- 【Google Play】创建并设置应用 ( 访问权限 | 内容分级 | 受众群体 | 类别及联系方式 | 商品详情 )
Google Play 上架完整流程 系列文章目录 [Google Play]创建 Google 开发者账号 ( 注册邮箱账号 | 创建开发者账号 ) [Google Play]创建并设置应用 ( 访 ...
最新文章
- 50的阶乘用c语言编写,求10000的阶乘(c语言代码实现)
- 【c语言】蓝桥杯入门训练 圆的面积
- 架构师之路 — 分布式系统 — RPC 远程过程调用
- Apple Pay与银联的联姻,是战略,不是产品
- 常见的加密和解密算法—MD5
- IOS-字符串太长换行拼接
- 【蓝桥杯真题】地宫取宝(搜索-记忆化搜索详解)
- python如何引发和处理异常_在python3.6中,如何捕捉异常并引发异常以便稍后处理?...
- 如鹏网 net高级技术 第二章 委托和事件(复习)
- GroupCoordinator分析
- 阿里云centos 6.9安装oracle10g
- Fiddler基本介绍
- glibc升级失败及处理过程
- 手游天涯明月刀服务器维护到几点,天涯明月刀手游 1月21日停服维护 维护更新详解内容介绍...
- 性能分析工具Systrace的使用详解
- 酒旅江湖战事:携程坚挺,美团蓄力,抖音来战
- 物联网模块ESP8266-01S实现PC端和Android APP同时连接通信
- 手把手教你查看常用理财工具
- Python数据分析案例17——电影人气预测(特征工程构建)
- 方舟大洋洲服务器稳定嘛,方舟生存进化最新版182.0更新内容翻译一览