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

关注公众号,经常分享Google出海经验开启出海成长之旅。添加管理员微信 :kris_wuii,进群讨论出海技巧。

大家好,我是小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、依赖导入

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

@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、通过链接分享给测试人员,测试人员接收邀请后即可开始测试支付了。

图片

图片

最后,受限于篇幅,不能将每一个点进行详尽的介绍,欢迎大家留言探讨。持续高质量创作不易,欢迎大家关注我的公众号,持续分享Android出海经验,添加管理员微信号:kris_wuii,进GP出海交流群讨论出海技巧。
添加备注CSDN,谢谢

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值