因为产品需要接入Google支付,这里记录一下进行Java服务端校验的过程。
一、 Google Pay主要支付流程
1.手机端向Java服务端发起支付,生成预订单,给手机端返回生成的订单号
2.手机端向Google发起支付(传入本地服务器生成的订单号)
3.Google服务器将支付结果返回给手机端
4.手机端向Java服务端发送校验请求,校验通过后即可处理订单
二、前提条件
1.一台海外服务器(国内服务器请求Google服务器进行校验会出现请求超时的问题)
2.接入Google服务的手机客户端
3.浏览器能访问Google Paly控制台
三、Google Paly控制台准备
1.进入Google控制台,选择开发者者账号登陆。
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:支付凭证
结果: