Android谷歌支付(Google pay)

  拖了这么久,终于开始写第三篇文章。废话不多说,今天来讲讲怎么接入google pay。
  写在前面:
  1.如果你的账号是买的,首次登录Google play Console后出现这个提示 “payment need verification” 一定要求对方更换账号,不然后续账号出现问题的几率很大。
  2.谷歌账号分地区。比如你买中国地区的谷歌账号,那只能绑定中国地区的visa卡。
  3.想测试google pay必须在google play商店上架,且app内不要暴露出其他支付方式。
  4.在Beta渠道或者内部测试渠道大胆上传并发布你的应用,只有发布成功才能测试支付。
  一、Google play Console后台配置

  1.完成Google play Console界面上打钩的这几个选项。期间需要上传apk,不用等到接入完支付再上传,审核需要一定时间,审核期间再接入支付,等审核过后再上传新的apk。如图:
1.png

  2.完成“应用内商品”这一项的填写。管理产品代表消耗类型产品(如:APP内购买礼物所需的钻石等货币);订阅代表持续一段时间的服务类型产品(如:APP内VIP权限等);奖励产品常见于游戏APP内(如:看一段视频广告,赠送一张道具)
2.png

  注意填写产品时状态(Status)这一项选活性(ACTIVE),这样商品才可以在APP内被购买。
3.png

添加完长这样
4.png

  3.添加沙盒测试账号(可以测试google pay):首页-setting-Developer account-Account detail 找到License Testing 添加测试账号进去(切记不要是此APP的开发者账号),如图:
5.png

  4.添加APP测试人员账号,如图:


7.png

  注意:首次提交的APP不会立即生成测试APP地址(就是图中我打马赛克的部分),google会审核你的应用(官方说首次提交APP审核最长需要48小时,实测可能需要更长时间),等到上传的APP处于发布状态,才会生成测试地址。如图:
  这样Google play Console后台配置就完成了。
6.png

  二、代码部分,这一部分官方文档讲解很清楚,依赖什么的就不说了,直接上支付页面相关代码。
  1.初始化BillingClient,官方文档没有说明,实际需要添加enablePendingPurchases()方法,重连方式参考官方例子。

官方文档是这样写:
private BillingClient billingClient;
...
billingClient = BillingClient.newBuilder(activity).setListener(this).build();
billingClient.startConnection(new BillingClientStateListener() {
    @Override
    public void onBillingSetupFinished(BillingResult billingResult) {
        if (billingResult.getResponseCode() == BillingResponse.OK) {
            // The BillingClient is ready. You can query purchases here.
        }
    }
    @Override
    public void onBillingServiceDisconnected() {
        // Try to restart the connection on the next request to
        // Google Play by calling the startConnection() method.
    }
});
==============================我是分割线===========================
实际需要这样写:
  billingClient = BillingClient.newBuilder(this).enablePendingPurchases().setListener(this).build();
        billingClient.startConnection(new BillingClientStateListener() {
            @Override
            public void onBillingSetupFinished(BillingResult billingResult) {
                if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
                    // The billing client is ready. You can query purchases here.
                    isConnect = true;
                    Log.e("PayDiamondActivity", "谷歌支付链接成功")
                } else {
                    Log.e("PayDiamondActivity", billingResult.getResponseCode() + "");
                    isConnect = false;
                }
            }

            @Override
            public void onBillingServiceDisconnected() {
                // Try to restart the connection on the next request to
                // Google Play by calling the startConnection() method.
                isConnect = false;
            }
        });

  2.根据谷歌后台设置的商品id查询商品详情:

 private void getSkuList(String goodsId) {
        skuList.clear();
        skuList.add(goodsId);
        SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
        params.setSkusList(skuList).setType(BillingClient.SkuType.INAPP);
        billingClient.querySkuDetailsAsync(params.build(),
                new SkuDetailsResponseListener() {
                    @Override
                    public void onSkuDetailsResponse(BillingResult billingResult,
                                                     List<SkuDetails> skuDetailsList) {
                        if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK
                                && skuDetailsList != null) {
                            if (skuDetailsList.size()>0){
                                skuDetail = skuDetailsList.get(0);
//                                ToastUtil.show(skuDetail.toString());
                            }
                        }
                    }
                });
    }

  3.调起支付界面。注意这里我打印了responseCode,0是调起成功,其余错误码在BillingClient类里有介绍,这里不做详述。

public void googlePay( String mOrderId) {
        this.mOrderId = mOrderId;
        if (isConnect) {
            BillingFlowParams flowParams = BillingFlowParams.newBuilder()
                    .setSkuDetails(skuDetail)
                    .build();
            int responseCode = billingClient.launchBillingFlow(PayDiamondActivity.this, flowParams).getResponseCode();
            if (responseCode != 0) {
                ToastUtil.show(responseCode + ":Current region does not support Google payments");
            }
        } else {
            ToastUtil.show("Current region does not support Google payments");
        }
    }

  4.支付完成后回调。包括向google确认订单,通知自己服务端下单了给我发货。

 @Override
public void onPurchasesUpdated(BillingResult billingResult, @Nullable List<Purchase> purchases) {
        if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK
                && purchases != null) {
            for (Purchase purchase : purchases) {
                handlePurchase(purchase);
            }
        } else if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.USER_CANCELED) {
            // Handle an error caused by a user cancelling the purchase flow.
            ToastUtil.show("User cancel");
        } else {
            // Handle any other error codes.
        }
    }
void handlePurchase(Purchase purchase) {
        if (purchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED) {
            // Grant entitlement to the user.
            // Acknowledge the purchase if it hasn't already been acknowledged.
            if (!purchase.isAcknowledged()) {
                ConsumeParams acknowledgePurchaseParams =
                        ConsumeParams.newBuilder()
                                .setPurchaseToken(purchase.getPurchaseToken())
                                .build();
             //注意这里通知方式分3种类型(消耗型、订阅型、奖励型),本文是消耗性产品的通知方式,其它方式请看官方文档
                billingClient.consumeAsync(acknowledgePurchaseParams, acknowledgePurchaseResponseListener);
            }
            String DeveloperPayload = purchase.getDeveloperPayload();
            String OrderId = purchase.getOrderId();
            String OriginalJson = purchase.getOriginalJson();
            String PackageName = purchase.getPackageName();
            String PurchaseState = purchase.getPurchaseState() + "";
            String PurchaseTime = purchase.getPurchaseTime() + "";
            String PurchaseToken = purchase.getPurchaseToken();
            String Signature = purchase.getSignature();
            String Sku = purchase.getSku();
              //通知服务端
            postGooglePay(DeveloperPayload, OrderId, OriginalJson, PackageName,
                    PurchaseState, PurchaseTime, PurchaseToken, Signature, Sku);
        }
    }
private ConsumeResponseListener acknowledgePurchaseResponseListener = new ConsumeResponseListener() {

        @Override
        public void onConsumeResponse(BillingResult billingResult, String purchaseToken) {

        }
    };

  至此代码部分就完成了,升级一下版本号,重新打release包,上传到之前上传的渠道上。如果App处于待发布状态,就等待谷歌审核通过,如已处于发布状态,把生成的测试链接发给测试人员就可以了。
  测试人员通过手机谷歌浏览器打开链接,加入测试计划,根据提示点击会跳转到谷歌商店下载App。

  相关链接
https://developer.android.com/google/play/billing/billing_library_overview#Enable
https://www.gameres.com/830049.html
https://pay.google.com/payments/u/0/home(当google账号出现payment need verification时会用到,用来更换支付、收款时绑定的visa卡)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,076评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,658评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,732评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,493评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,591评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,598评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,601评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,348评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,797评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,114评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,278评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,953评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,585评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,202评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,180评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,139评论 2 352