文章目录

  • 一、前言
  • 二、Google支付官方文档
  • 三、Google支付Github Demo工程
  • 四、Google支付流程图
  • 五、Google支付接口讲解
    • 1、初始化(监听支付事件)
    • 2、连接Google服务器(必须)
    • 3、查询商品信息(通过sku_id查询)
    • 4、拉起支付页(需要传sku和订单号)
    • 5、关闭订单(发货完后执行)
    • 6、查询订单(补单用)
  • 六、Unity如何拿到billing sdk的jar文件
  • 七、补充
    • 1、添加BILLING权限
    • 2、billing v2版与v3版的区别
  • 八、结束语

一、前言

点关注不迷路,持续输出Unity干货文章。
嗨,大家好,我是新发。最近实在太忙了,博客停了好几天没更新。
项目要出海,需要接入Google支付,今天就来说说如何接入Google支付吧。

要接入Google支付,需要先在Google Console上注册一个账号并申请一个应用,
Google Console网址:https://developer.android.com/distribute/console
账号注册和应用申请不是本文重点,这里就不展开讲了,另:需要科学上网才能访问Google Console

二、Google支付官方文档

Google支付官方文档:https://developer.android.com/google/play/billing/integrate#java

三、Google支付Github Demo工程

Github工程地址:https://github.com/android/play-billing-samples

Demo下载下来后,使用Android Studio打开ClassyTaxiJava工程即可。

其中,BillingClientLifecycle.java就是最主要的演示脚本。

四、Google支付流程图

Google支付的流程略微有点复杂,为了方便大家理解,我把Google支付的流程图画一下,图片可以放大看。

容易漏掉的就是补单。
国内硬核渠道的SDK(比如应用宝、OPPOVIVO、小米、华为等),一般支付完成,是SDK服务端通过callback_url(一般是一个https请求)的方式回调给游戏服务端,游戏服务端进行发货。
Google支付不一样,它没有callback_url,那游戏服务端怎么知道用户支付完成了呢?
需要游戏客户端在支付完成后主动动通知服务端发货,确认发货后客户端再关闭订单。
正因为是由客户端来通知服务端发货的,所以就有可能会掉单,比如客户端支付成功后,还没来得及通知服务端发货,客户端就异常退出了。
这个时候,就需要补单了。游戏客户端在完成登录游戏服务端后,需要主动调用Google的订单查询接口,把漏掉的单子补发货,发完货后,客户端关闭订单。

五、Google支付接口讲解

1、初始化(监听支付事件)

private PurchasesUpdatedListener purchasesUpdatedListener = new PurchasesUpdatedListener() {@Overridepublic void onPurchasesUpdated(BillingResult billingResult, List<Purchase> purchases) {// To be implemented in a later section.}
};private BillingClient billingClient = BillingClient.newBuilder(activity).setListener(purchasesUpdatedListener).enablePendingPurchases().build();

支付事件在PurchasesUpdatedListener中监听,比如支付完成:

  @Overridepublic void onPurchasesUpdated(BillingResult billingResult, List<Purchase> purchases) {int responseCode = billingResult.getResponseCode();String debugMsg = billingResult.getDebugMessage();Log.d("GooglePay", "responseCode: $responseCode, debugMsg: $debugMsg");if(null != purchases) {for(Purchase purchase : purchases) {if(BillingResponseCode.OK == responseCode) {// TODO 通知服务端发货,发货成功后,把订单关闭// handlePurchase(purchase);   // 注意,必须确保服务器发货成功后再执行handlePurchase}}}}

2、连接Google服务器(必须)

billingClient.startConnection(new BillingClientStateListener() {@Overridepublic void onBillingSetupFinished(BillingResult billingResult) {if (billingResult.getResponseCode() ==  BillingResponseCode.OK) {// The BillingClient is ready. You can query purchases here.}}@Overridepublic void onBillingServiceDisconnected() {// Try to restart the connection on the next request to// Google Play by calling the startConnection() method.}
});

判断是否已连接

if(billingClient.isReady())
{}

3、查询商品信息(通过sku_id查询)

List<String> skuList = new ArrayList<> ();
skuList.add("sku_id");
SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
params.setSkusList(skuList).setType(SkuType.INAPP);
billingClient.querySkuDetailsAsync(params.build(),new SkuDetailsResponseListener() {@Overridepublic void onSkuDetailsResponse(BillingResult billingResult,List<SkuDetails> skuDetailsList) {// Process the result.}});

建议把查询结果做缓存,查过的商品,下次直接从缓存中获取即可,例:

private Map<String, SkuDetails> skuDetailsMap = new HashMap();// ...
if(skuDetailsMap.containsKey("sku_id"))
{// skuDetailsMap.get("sku_id");return;
}List<String> skuList = new ArrayList<> ();
skuList.add("sku_id");
SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
params.setSkusList(skuList).setType(SkuType.INAPP);
billingClient.querySkuDetailsAsync(params.build(),new SkuDetailsResponseListener() {@Overridepublic void onSkuDetailsResponse(BillingResult billingResult,List<SkuDetails> skuDetailsList) {// Process the result.int resultCode = billingResult.getResponseCode();if(BillingResponseCode.Ok == resultCode) {for(SkuDetails skuDetails : skuDetailsList) {// 缓存if(!skuDetailsMap.containsKey(skuDetails.getSku())) {skuDetailsMap.put(skuDetails.getSku(), skuDetails);}}}}});

4、拉起支付页(需要传sku和订单号)

// An activity reference from which the billing flow will be launched.
Activity activity = ...;// Retrieve a value for "skuDetails" by calling querySkuDetailsAsync().
BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder().setSkuDetails(skuDetails).setObfuscatedAccountId(orderId)   // 塞入订单号.build();
int responseCode = billingClient.launchBillingFlow(activity, billingFlowParams).getResponseCode();// Handle the result.

5、关闭订单(发货完后执行)

支付成功,服务端发货完成后,需要客户端将订单关闭。

void handlePurchase(Purchase purchase) {// Purchase retrieved from BillingClient#queryPurchases or your PurchasesUpdatedListener.Purchase purchase = ...;// Verify the purchase.// Ensure entitlement was not already granted for this purchaseToken.// Grant entitlement to the user.ConsumeParams consumeParams =ConsumeParams.newBuilder().setPurchaseToken(purchase.getPurchaseToken()).build();ConsumeResponseListener listener = new ConsumeResponseListener() {@Overridepublic void onConsumeResponse(BillingResult billingResult, String purchaseToken) {if (billingResult.getResponseCode() == BillingResponseCode.OK) {// Handle the success of the consume operation.}}};billingClient.consumeAsync(consumeParams, listener);
}

6、查询订单(补单用)

用户登录进游戏服务端后,需要执行一下查询订单,发现有掉单,需要通知服务端补发货,发货完成后,客户端关闭订单。

Purchase.PurchasesResult result = billingClient.queryPurchases(SkuType.INAPP);
if(BillingResponseCode.OK == result.getResponseCode()) {for(Purchase purchase : result.getPurchasesList()) {if(Purchase.PurchaseState.PURCHASED == purchase.getPurchaseState()) {// TODO 通知服务端补发货,发货完成后,客户端关闭订单。}}
}

六、Unity如何拿到billing sdk的jar文件

如果你是Android Studio做的原生应用,那么直接在build.gradle中配置一下即可。

dependencies {// ...// Google Play Billing Library.implementation 'com.android.billingclient:billing:3.0.0'// ...
}

如下:

如果是Unity项目,则需要把依赖的jar文件拷贝到Assets/Plugins/Android/libs文件夹中。
我们可以通过Android Studio来定位这个jar文件,把鼠标移动到BillingClient类上,按住Ctrl键不放,点击,即可跳转到.class文件里,即可通过.class文件定位到.jar文件所在的目录。

如下:

我们把classes.jar文件重名名为google_billing_3.0.0.jar,然后再丢进Unity工程中,
googlebilling其实是aar,是包含一些资源文件的,所以我们只拷贝jar还不够,jar文件外层的这些文件也需要。

不过这里建议使用下面这种方式一步到位下载aar文件。
进入googlemaven网站:https://mvnrepository.com/

直接搜索你要下载的库即可。
比如搜索com.android.billingclient:billing

直接下载aar文件。

七、补充

1、添加BILLING权限

提审Google Play,需要添加BILLING权限。
AndroidManifest.xml中添加这个:

<uses-permission android:name="com.android.vending.BILLING" />

2、billing v2版与v3版的区别

参见Google官方文档,这里:https://developer.android.com/google/play/billing/migrate

八、结束语

完毕。
喜欢Unity的同学,不要忘记点击关注,如果有什么Unity相关的技术难题,也欢迎留言或私信~

教你接入Google谷歌支付V3版本,图文讲解(Android、Unity)相关推荐

  1. 微信支付V3版本的 签名生成,验签,解密,统一下单的简单封装

    微信支付 V3版本的 签名生成,验签,解密,统一下单的简单封装 V3Base 获取平台证书 回调报文解密 统一下单 暂时看了文档只完成了这部分,感觉封装的不是特别完美,希望有大佬指点一下,想着封装好一 ...

  2. 微信Native支付V3版本

    微信Native支付V3版本 微信支付在开发之前也是需要进行商户接入的 接入文档链接: https://pay.weixin.qq.com/index.php/core/home/login Nati ...

  3. 2020微信支付v3版本java对接详细流程

    都0202年,我似乎翻遍了百度,都没找到最新版微信支付v3的对接相关的详细博客,我都纳闷了,只有自己摸索.还有就是竟然还有人用一些v3对接的假代码,来骗积分,我真的服了,感同身受,以下是我对接的过程, ...

  4. PHP实现小程序微信支付(v3版本)

    PS:本篇文章是PHP对小程序进行微信支付v3版本的实现,仅用于对支付流程的了解,具体使用方面需要大家自行调整 小程序端JS代码: getPrepayID(){var that = thiswx.ge ...

  5. 微信支付v3版本对接记录

    微信支付v3版本对接记录 1.申请公众号和商户号 2.配置商户API_V3_key和商户证书 3.导入依赖 4.构建调用接口httpclient 5.调用jsapi下单示例 6.签名解释 7.回调示例 ...

  6. PHP实现小程序微信支付v3版本退款,以及对退款订单进行查询

    PS:本篇文章仅用作对小程序微信支付v3版本的退款流程以及对退款订单进行查询的流程展示,如要用于实际,还请自行修改代码 文章中调用的API_Connect.php 与API_v3Connect.php ...

  7. 安卓集成Google Play支付(谷歌支付)最新版本

    Google Play 支付文档:https://developer.android.com/google/play/billing/integrate Google Play 支付库已经升级到5.0 ...

  8. 微信支付V3版本回调+验签流程

    本文主要是接前面2篇微信V3支付参数准备和微信V3支付整合进项目中的后续之微信支付后的回调. 一.回调验签流程介绍 二.核心流程操作 本文主要是接前面2篇微信V3支付参数准备和微信V3支付整合进项目中 ...

  9. 手把手教你接入网站微信支付

    文章目录 为何需要接入微信支付? 申请微信公众号 申请商户号 Java SDK代码示例 支付流程 Native API的使用示例 支付结果通知 第三方支付平台 相关法规 相关链接 支付宝支付接入 为何 ...

最新文章

  1. 今日头条员工感慨:30岁以上既可怜又可悲,宁愿选择23岁的,便宜、听话、好用!...
  2. github建立静态网站,域名解析和跳转
  3. 微信小程序利用缓存提高接口请求性能
  4. 地图 插件 html 经纬度,如何往地图位置(经纬度)选择插件页面传递经纬度
  5. Unity面试题精选(1)
  6. 华为机试HJ8:合并表记录
  7. Windows XP启用telnet服务图文教程
  8. mysql拼接两字段查询
  9. React 中setState更新state何时同步何时异步?
  10. 动态规划实战13 leetcode-121. Best Time to Buy and Sell Stock
  11. Ubuntu下QT的安装配置
  12. vi编辑器 末尾添加_linux下的VI编辑器使用手册
  13. Spring Interceptor vs Filter 拦截器和过滤器区别
  14. 编程猫海龟编辑器(python)_编程猫海龟编辑器
  15. function func() { for(var i=0; i<3; i++) { setTimeout(()=>{ consol
  16. view.post到底是干嘛的
  17. 使用 git add -p 整理 patch
  18. 利穗IT网络工程师面试试题
  19. JVM内存模型与内存溢出异常
  20. Qt6-在线获取和安装

热门文章

  1. 四川华巨同诚:拼多多如何修改类目信息
  2. 图漾深度相机开发-PCL点云实时显示
  3. 个性主张:玩转你的86400秒
  4. Linux向日葵同步剪贴板,向日葵Windows客户端“剪切板”功能:打破“无形的墙”...
  5. 每一个搞爬虫的人,都应该知道的神器!
  6. 新来一00后,给我卷崩溃了..
  7. 一场沙龙三位大咖30条金句!你关心的5G问题都在这儿了
  8. 华为云桌面解读-流畅的原理
  9. 极简个性时尚IOS风PPT-朴尔PPT
  10. ESP-Skainet智能语音助手,智能物联网方案,语音唤醒识别准确率高