admin管理员组

文章数量:1604648

关注公众号,经常分享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

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,谢谢

本文标签: 最新playGoogle