- 整个开发背景是前端在调用完google play v3 支付流程后,需要后台验证支付结果以及在自己的服务生成订单相关信息。对于服务账号的文档搜了度娘对于这块的资料少,无从下手,踩了不少坑。网上的搜出来的大多数是针对OAuth 2.0 客户端 ID的验证,需要使用到refreshAccess,但是服务账号不一样,那不需要验签通过后直接能请求查询订单。
- 用到的 maven 依赖jar包
- 登录校验
- 订单创建
- 订单成功校验
这边服务端用的是java ,在接入googgle渠道中与安卓端对接的过程就三接口,1、登录校验 2、创建订单号及校验产品id后返回订单号给安卓端 3、支付完成订单校验,google支付那没有想微信那边支付成功后回调到我们服务端,它那边是通过安卓端的请求来通知我们自己的服务端的支付成功通知,掉单的情况也是客户端来通知。。
因这边用到的是消耗型的产品,后台就省了一步acknowledge的确认,只需要校验订单支付状态。
登入前期准备以下只是格式,具体的参数从谷歌后台下载:
1、客户端秘钥,其中google_client_secret_data是我这边自己加的
{"google_client_secret_data": {
"web": {
"client_id": "123456789-1li1d7k.apps.googleusercontent.com",
"project_id": "project_id-0310",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs"
}
}
}
2、服务端秘钥其中google_service_account_data是我这边自己加的
{
"google_service_account_data": {
"type": "service_account",
"project_id": "123456789526755524298661-783",
"private_key_id": "1234567890ac89f9c70f245f1798587ae9b7",
"private_key": "-----BEGIN PRIVATE KEY-----nMIIEvQASCBKcwggSjAgEAAoIBAQCX1kMC4Au/n-----END PRIVATE KEY-----n",
"client_email": "test02661-783.iam.gserviceaccount.com",
"client_id": "123456789",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/83.iam.gserviceaccount.com"
}
}
用到的 maven 依赖jar包
登录校验com.google.api-client google-api-client 1.32.1 com.google.auth google-auth-library-oauth2-http 1.2.2 com.google.apis google-api-services-androidpublisher v3-rev20211021-1.32.1
private ResultData订单创建
略。。订单成功校验
private ResultData googlePayNotify(JSonObject google_service_account_dataJson,HttpServletRequest request) {
Map parameterMap = request.getParameterMap();
logger.info("支付回调返回参数:{}", JSONObject.toJSONString(parameterMap));
JSonObject google_service_account_data = google_service_account_dataJson.getJSONObject("google_service_account_data");
logger.info("google_service_account_data={}",google_service_account_data);
String myOrderId = parameterMap.get("myOrderId")[0] ; //自己的订单号
String purchaseToken = parameterMap.get("purchaseToken")[0]; //购买应用内产品时提供给用户设备的令牌。
String productId = parameterMap.get("productId")[0]; //产品id
String orderId = parameterMap.get("orderId")[0]; //谷歌订单号
String channelType = parameterMap.get("channelType")[0]; //支付渠道
String amount = parameterMap.get("amount")[0]; //金额
String packageName = parameterMap.get("packageName")[0]; //包名 安卓端传
//获取渠道商品ID 校验
PayOrder payOrder = payOrderDao.getPayOrder(myOrderId);
String credentialsJson = google_service_account_data.toJSONString();
InputStream stream = new ByteArrayInputStream(credentialsJson.getBytes());
ProductPurchase purchase = null;
try{
GoogleCredentials credentials = GoogleCredentials.fromStream(stream);
credentials = credentials.createScoped(Arrays.asList("https://www.googleapis.com/auth/androidpublisher")); //订单查询域
logger.info("credentials ={}",credentials);
credentials.refreshIfExpired();
logger.info("credentials.refreshIfExpired={}",credentials);
// AccessToken token = credentials.getAccessToken();
// OR
// AccessToken refreshAccess = credentials.refreshAccessToken();
//该方法已弃用 GoogleCredential googleCredential;
HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials);
AndroidPublisher publisher = new AndroidPublisher.Builder(new NetHttpTransport(),
GsonFactory.getDefaultInstance(), requestInitializer).build();
AndroidPublisher.Purchases.Products products = publisher.purchases()
.products();
//订单查询
AndroidPublisher.Purchases.Products.Get product = products.get(packageName,productId,purchaseToken);
purchase = product.execute();
logger.info("查询订单结果purchase={}",purchase);
}catch (Exception e){
logger.error("查询订单失败!",e);
return ResultData.fail("查询订单失败!");
}
logger.info("订单状态为(0.已购买1.已取消2.待定)purchaseState={},消费状态(0.尚未消耗1.已消耗)consumptionState={}," +
"确认状态(0.尚未确认1.确认)acknowledgementState={}",purchase.getPurchaseState(),
purchase.getConsumptionState(),
purchase.getAcknowledgementState());
logger.info("订单发货状态ayOrder.getDeliveryStatus={}",payOrder.getDeliveryStatus());
// 订单的购买状态:(0.已购买1.已取消2.待定)已购买 非消耗产品不用校验acknowledgementState状态
if (purchase.getPurchaseState() != 0) {
logger.error("订单未支付!");
return ResultData.fail("订单未支付");
}
//保存purchaseToken字段
//ConsumptionState=1已消耗 发货状态为已发货
if(1 == purchase.getConsumptionState() && DELIVERY_STATUS_SUCCESS == payOrder.getDeliveryStatus()){
return ResultData.fail("重复回调!,已发货!");
}
String issueOrderNo = gameOrderId;
String snOrderNo = purchase.getOrderId();
//.通知发货...
return ResultData.success();
}



