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

一、前言

点关注不迷路,持续输出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() {
    @Override
    public 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中监听,比如支付完成:

  @Override
    public 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() {
    @Override
    public void onBillingSetupFinished(BillingResult billingResult) {
        if (billingResult.getResponseCode() ==  BillingResponseCode.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.
    }
});

判断是否已连接

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() {
        @Override
        public 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() {
        @Override
        public 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() {
        @Override
        public 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相关的技术难题,也欢迎留言或私信~

  • 22
    点赞
  • 84
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 26
    评论
Unity是一款跨平台的游戏开发引擎,在游戏开发过程中,如果需要接入微信扫码支付功能,可以通过以下步骤来实现。 首先,在Unity中创建一个UI界面作为扫码支付的入口界面,可以包含一个按钮或图标作为触发器。可以使用Unity内置的UI系统或第三方插件来创建界面。 接下来,需要集成微信支付SDK。可以在微信开放平台下载并导入合适版本Unity微信支付SDK,或者使用第三方插件。在导入SDK后,需要将其进行配置,包括设置APPID、商户号、API密钥等一些必要的参数。 然后,在触发器的点击事件中调用微信支付的接口。可以通过调用SDK提供的函数来实现扫码支付功能,传入订单号、支付金额以及其他必要的参数。在调用接口前,需要先判断设备是否安装了微信客户端,如果没有安装则无法进行支付。 接下来,进行支付结果的回调处理。在支付完成后,微信会返回支付结果给游戏客户端,可以通过回调函数来接收支付结果,并根据支付结果来处理游戏逻辑,例如发放游戏道具或解锁游戏内容等。 最后,进行支付流程的测试和调试。在接入微信扫码支付功能之后,需要进行充分的测试和调试,确保支付流程的稳定性和准确性。可以使用微信提供的测试账号来进行支付测试,确保支付功能正常工作。 总之,通过以上步骤可以在Unity中成功接入微信扫码支付功能,为游戏提供更方便的支付方式,增强游戏的用户体验。
评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林新发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值