2024最新Google Play 内购/订阅实现

2024最新Google Play 内购/订阅实现

大家好,我是小GO!近年来中国移动应用出海势头良好。对于涉及到交易业务的出海应用来说,Google 应用内支付是必不可少的支付渠道。不同于国内相对完善的移动支付体系,即使官方文档中对如何接入 Google 应用内支付做了基本阐述,但是在接入的过程中,还是会遇到很多问题。本文将介绍Google 支付接入的重点流程和核心技术要点,以及需要注意的问题。

本篇概览

在 Google Play Console 启用结算相关功能

创建和配置内购/订阅商品

设置Google Cloud Pub/Sub

交易凭证验证以及接收回调

测试支付

一、在 Google Play Console 启用结算相关功能

1、在 Google 付款中心设置付款资料,然后将该付款资料与 Google Play 开发者账号相关联。

2、上传应用:要配内购/订阅商品首先得提交一个带Billing库的aab给谷歌审核,上传到内测版本即可。

二、创建和配置内购和订阅商品

Google支付的商品分为内购(INAPP)和订阅(SUBS)两种类型,Google Play Console 创建步骤类似。对于每个商品,需要提供唯一的商品 ID、商品名、说明和定价信息。订阅具有其他必需的信息,例如选择基础方案是自动续订类型还是预付费续订类型。

1、登录谷歌商店控制后台,选择商品>订阅,点击创建订阅内容。

2、填写产品ID以及订阅项目的名称,点击创建。

3、添加订阅详情:添加福利>订阅说明>设置正确的税率和产品分类。

4、添加基础方案:设置基础方案ID>选择订阅类型>设置国家及价格,设置完毕之后点击启用即可。

5、添加优惠:优惠是在基础方案的基础上添加的,例如:使用3天;配置优惠ID>适用地区>资格条件,点击启用即可生效。

6、预览订阅方案结构,检查配置的方案是否达到你的预期。

三、设置Google Cloud Pub/Sub

1、创建Google Cloud Project,并启用相关API和服务。

2、Google Play Console 中关联 Google Cloud Project。

3、Google Cloud 创建ServiceAccount服务账号。

4、创建完账号,把密钥也创建好,将JSON下载到本地给服务端同学。

5、回到 Google Play Console 后台,在【用户与权限】中添加刚刚注册的服务账号,并分配权限。

6、把创建好的账号填进来,这一步完成,其实就可以使用服务账号的密钥信息调用 Google Play API了。

7、Google Cloud Pub/Sub创建主题以及订阅。

8、给Google Play 固定的服务账号加权限,注意这个账号是一个固定的,不是刚刚创建的那个服务账号。

google-play-developer-notifications@system.gserviceaccount.com

9、Google Play 启用实时通知,并配置Google Cloud 中创建的主题。

10、点击发送测试通知,测试一下。然后在 Pub/Sub 中看看能不能拉取到消息。

11、没问题之后,把订阅的类型改成推送,这样就能通过http发送到我们的服务了。

四、交易凭证验证以及接收回调

准备就绪,正片上代码!!!

1、依赖导入

com.google.auth google-auth-library-oauth2-http 1.19.0 com.google.apis google-api-services-androidpublisher v3-rev20231115-2.0.0

2、配置和配置类

google-play.packageName=com.xxx.xxx# 这个json就是刚刚创建服务账号密钥的时候下载的google-play.serviceAccountJson=xxxxx.json​​​​​​

@Data @Configuration @ConfigurationProperties(prefix = "google-play") public class GooglePlayConfig { private String packageName; private String serviceAccountJson; @Bean public GoogleCredentials googleCredentials() throws IOException { // 懒得搞配置文件了,直接丢resources读进来 return GoogleCredentials.fromStream(new ClassPathResource(serviceAccountJson).getInputStream()) .createScoped(AndroidPublisherScopes.ANDROIDPUBLISHER); } @Bean public AndroidPublisher androidPublisher(GoogleCredentials credentials) throws IOException, GeneralSecurityException { return new AndroidPublisher.Builder( GoogleNetHttpTransport.newTrustedTransport(), GsonFactory.getDefaultInstance(), new HttpCredentialsAdapter(credentials) ).setApplicationName(packageName).build(); } }

3、验签逻辑,其实就是根据凭证查下这笔单在不在

@Component @Slf4j public class GooglePlayComponent { @Resource private GooglePlayConfig googlePlayConfig; @Resource private AndroidPublisher androidPublisher;// 注入进来咔咔用 public ProductPurchase productPurchase(String sku, String purchaseToken) { try { return androidPublisher .purchases().products() .get(googlePlayConfig.getPackageName(), sku, purchaseToken) .execute(); } catch (IOException e) { log.error("failed to query product purchase. {}", purchaseToken, e); ServiceException.throwInternalServerEx("failed to query product purchase:" + purchaseToken); return null; } } }

4、最后,接收回调。

@PostMapping("/google_play_webhook")public Object googlePlayWebhook(@RequestBody String body) { log.info("Google play subscription webhook: {}", body);

if (StringUtils.isBlank(body)) { log.warn("Google play subscription webhook body is EMPTY"); return ResponseEntity.status(400).body("Empty body"); }

DeveloperNotification developerNotification; try { developerNotification = JacksonUtils.parseJson(body, DeveloperNotification.class); } catch (Exception e) { log.error("failed to parse body. {}", body, e); return ResponseEntity.status(400).body(e.getMessage()); } // TODO 处理过程自己写去

return ResponseEntity.ok().body("OK");}

五、测试支付

1、将测试用的aab发布到内部测试,并添加测试人员的谷歌邮箱。

2、通过链接分享给测试人员,测试人员接收邀请后即可开始测试支付了。

最后,受限于篇幅,不能将每一个点进行详尽的介绍,欢迎大家留言探讨。

相关推荐

airpods耳机冒蓝光
best365从哪能进去

airpods耳机冒蓝光

📅 07-04 👁️ 839
薏米芡实祛湿茶【八味药食同源同饮】
365名品汇个人注册推荐码

薏米芡实祛湿茶【八味药食同源同饮】

📅 08-31 👁️ 2800
行车左右行走电机,行车的电动驱动装置
365bet手机版客户端

行车左右行走电机,行车的电动驱动装置

📅 09-01 👁️ 2546