栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

2021-10-29

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

2021-10-29

谷歌支付服务端服务账号订单校验
    • 整个开发背景是前端在调用完google play v3 支付流程后,需要后台验证支付结果以及在自己的服务生成订单相关信息。对于服务账号的文档搜了度娘对于这块的资料少,无从下手,踩了不少坑。网上的搜出来的大多数是针对OAuth 2.0 客户端 ID的验证,需要使用到refreshAccess,但是服务账号不一样,那不需要验签通过后直接能请求查询订单。
    • 用到的 maven 依赖jar包
    • 登录校验
    • 订单创建
    • 订单成功校验

整个开发背景是前端在调用完google play v3 支付流程后,需要后台验证支付结果以及在自己的服务生成订单相关信息。对于服务账号的文档搜了度娘对于这块的资料少,无从下手,踩了不少坑。网上的搜出来的大多数是针对OAuth 2.0 客户端 ID的验证,需要使用到refreshAccess,但是服务账号不一样,那不需要验签通过后直接能请求查询订单。

这边服务端用的是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 googleIdTokenVerifier(JSonObject google_client_secret_dataJson,String idTokenString) throws IOException,java.security.GeneralSecurityException{
        
        
        GoogleClientSecrets clientSecrets = GsonFactory.getDefaultInstance().fromString(
                google_client_secret_dataJson.get("google_client_secret_data").toString(),
                GoogleClientSecrets.class);
       String CLIENT_ID=clientSecrets.getDetails().getClientId();
       logger.info("CLIENT_ID={}",CLIENT_ID);
        GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(new NetHttpTransport(), GsonFactory.getDefaultInstance())
                // Specify the CLIENT_ID of the app that accesses the backend:
                .setAudience(Collections.singletonList(CLIENT_ID))
                // Or, if multiple clients access the backend:
                //.setAudience(Arrays.asList(CLIENT_ID_1, CLIENT_ID_2, CLIENT_ID_3))
                .build();

        GoogleIdToken idToken = verifier.verify(idTokenString);
        logger.info("验证结果idToken={}",idToken);
        if (idToken == null) {
            logger.error("IDtoken验证失败!,Invalid ID token.");
            return ResultData.fail("idToken验证失败");
        }
            Payload payload = idToken.getPayload();
            logger.info("验证结果payload={}",payload);
            // Print user identifier
            String googleUserId = payload.getSubject();
            logger.info("googleUserId={}",googleUserId);
           
           
            return ResultData.success(googleUserId);
    }
 
订单创建 
略。。
订单成功校验
 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();    

    }
转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号