Google内购-Java服务端Springboot校验订单详细流程
目录
Google内购 Java服务端(Springboot)校验订单详细流程
因为产品需要接入Google支付,这里记录一下进行Java服务端校验的过程。
一、 Google Pay主要支付流程
1.手机端向Java服务端发起支付,生成预订单,给手机端返回生成的订单号
2.手机端向Google发起支付(传入本地服务器生成的订单号)
3.Google服务器将支付结果返回给手机端
4.手机端向Java服务端发送校验请求,校验通过后即可处理订单
二、前提条件
1.一台海外服务器(国内服务器请求Google服务器进行校验会出现请求超时的问题)
2.接入Google服务的手机客户端
3.浏览器能访问Google Paly控制台
三、Google Paly控制台准备
1.进入 ,选择开发者者账号登陆。
2.进入api权限设置,初始状态是没有的(我这里是已经创建了),直接创建一个新的项目就可以了。
3.给该api服务创建一个服务账号
4.按照弹窗的提示进行操作
5.点击创建一个服务账号
6.写好必填的名称即可直接点击完成
7.点击进入刚刚创建好的账号(可以复制一下,等等添加权限的时候需要粘贴过去),选择添加密钥
8.选择Json格式,点击创建,然后保存好生成的Json文件
9.回到控制台,给刚刚创建好的服务账号添加权限
10.邀请刚刚添加的服务账户并授权后完成邀请
11.进入应用的商品页面, 重新保存一下商品 (修改一下描述信息,然后修改回来即可),不然请求Google服务器进行校验时,会出现401没有用户没有api权限的问题!!!!!!
至此完成了控制台的准备工作
三、Java服务端处理
前提条件,需要在海外服务器才能成功调取Google Api否则会出现超时的情况
maven依赖:
<dependency>
<groupId>com.google.apis</groupId>
<artifactId>google-api-services-androidpublisher</artifactId>
<version>v3-rev24-1.24.1</version>
</dependency>
校验代码:
@RestController
public class GoogleController {
// packageName为应用程序包名、productId商品id、purchaseToken谷歌返回的收据
@PostMapping("/")
public ProductPurchase checkOrder(@RequestBody GooglePayDto googlePayDto,
HttpServletRequest requestDto) throws IOException, GeneralSecurityException {
//使用服务帐户Json文件获取Google凭据
List<String> scopes = new ArrayList<>();
scopes.add(AndroidPublisherScopes.ANDROIDPUBLISHER);
ResourceLoader resourceLoader = new DefaultResourceLoader();
Resource resource = resourceLoader.getResource("classpath:static/刚下载的json文件,这里放到了static目录下");
GoogleCredential credential = GoogleCredential.fromStream(resource.getInputStream())
.createScoped(scopes);
// 使用谷歌凭据和收据从谷歌获取购买信息
HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
JacksonFactory jsonFactory = new JacksonFactory();
AndroidPublisher publisher = new AndroidPublisher.Builder(httpTransport, jsonFactory, credential)
.setApplicationName("应用程序名").build();
AndroidPublisher.Purchases purchases = publisher.purchases();
final AndroidPublisher.Purchases.Products.Get request = purchases.products().get(googlePayDto.getPackageName(), googlePayDto.getProductId(),googlePayDto.getPurchaseToken());
System.out.println("==============="+request+"================");
final ProductPurchase purchase = request.execute();
//处理业务
return purchase;
}
}
public class GooglePayDto {
String packageName;
String productId;
String purchaseToken;
public String getPackageName() {
return packageName;
}
public void setPackageName(String packageName) {
this.packageName = packageName;
}
public String getProductId() {
return productId;
}
public void setProductId(String productId) {
this.productId = productId;
}
public String getPurchaseToken() {
return purchaseToken;
}
public void setPurchaseToken(String purchaseToken) {
this.purchaseToken = purchaseToken;
}
}
四、测试
前台传入三个参数
packageName:包名
productId:商品id
purchaseToken:支付凭证
结果: