Google Play 最新内购/订阅实现

0 阅读4分钟

Google Play上架指南

本篇概览*

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

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

  • 设置Google Cloud Pub/Sub

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

  • 测试支付

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

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

截屏2026-03-09 21.25.48.png

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

截屏2026-03-09 21.29.00.png

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

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

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

截屏2026-03-09 21.55.03.png

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

截屏2026-03-09 21.58.25.png

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

截屏2026-03-09 22.03.47.png

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

截屏2026-03-09 22.42.37.png

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

截屏2026-03-09 22.46.42.png

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

截屏2026-03-09 22.48.55.png

三 、设置Google Cloud Pub/Sub

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

截屏2026-03-09 22.59.45.png

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

截屏2026-03-09 23.03.13.png

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

截屏2026-03-09 23.08.49.png

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

截屏2026-03-09 23.10.17.png

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

截屏2026-03-09 23.14.24.png

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

截屏2026-03-09 23.18.52.png

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

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

截屏2026-03-09 23.22.23.png

截屏2026-03-09 23.24.51.png

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

截屏2026-03-09 23.27.14.png

10、点击发送测试通知,测试一下。然后在 Pub/Sub 中看看能不能拉取到消息。 截屏2026-03-09 23.29.33.png

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

截屏2026-03-09 23.31.00.png

四、交易凭证验证以及接收回调**准备就绪,正片上代码!!! 1、依赖导入

1、依赖导入

<dependency>
<groupId>com.google.auth</groupId>      <artifactId>google-auth-library-oauth2-http</artifactId><version>1.19.0</version>  </dependency><dependency>      <groupId>com.google.apis</groupId>      <artifactId>google-api-services-androidpublisher</artifactId>      <version>v3-rev20231115-2.0.0</version>  </dependency>

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、验签逻辑,其实就是根据凭证查下这笔单在不在

less
代码解读
复制代码@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;          }      }  }

34、最后,接收回调。

less代码解读复制代码
@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发布到内部测试,并添加测试人员的谷歌邮箱。

1、配置内测测试用户

截屏2026-03-09 23.34.39.png

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

截屏2026-03-09 23.36.56.png

截屏2026-03-09 23.37.58.png 最后,受限于篇幅,不能将每一个点进行详尽的介绍,欢迎大家留言探讨。持续高质量创作不易,欢迎大家关注我,持续分享Android出海经验。