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