2012-09-26 48 views
5

trong tóm tắt: Tôi có thể làm việc với API nhà phát triển Android của Google Play từ phía máy chủ mà không cung cấp bất kỳ ứng dụng nào trong cửa hàng trò chơi không?Kiểm tra đăng ký google android từ phía máy chủ

Bối cảnh: Tôi đang làm việc trên một dự án cung cấp ứng dụng có đăng ký hàng tháng. Dữ liệu lõi của mỗi thuê bao (mã thông báo mua hàng, ngày vv) được lưu trữ trong cơ sở dữ liệu phụ trợ. Bây giờ tôi muốn tạo cronjob lặp qua từng bộ dữ liệu này. Và đối với mỗi đăng ký, tôi muốn liên hệ với Google API để truy xuất thông tin nếu đăng ký vẫn hợp lệ hay không và cập nhật cơ sở dữ liệu của chúng tôi tương ứng với trạng thái.

Đối với logic phụ trợ, tôi sử dụng google-api-java-client library.

Để hủy hoặc xác minh đăng ký, tôi cần xác thực bản thân mình bằng OAuth2 trước đây. Đã ở đó, đã làm điều đó.

new GoogleCredential.Builder() 
    .setTransport(HTTP_TRANSPORT) 
    .setJsonFactory(JSON_FACTORY) 
    .setServiceAccountId(SERVICE_ACCOUNT_EMAIL) 
    .setServiceAccountScopes("https://www.googleapis.com/auth/androidpublisher") // $1 
    .setServiceAccountPrivateKeyFromP12File(new File(filePath)) 
    .setClientSecrets(CLIENT_ID, CLIENT_SECRET) // $2 
    .build(); 

$ 1: Tôi không biết liệu phạm vi tài khoản đã cho có hợp lệ hay không. Bởi vì tôi chỉ có thể tìm thấy giá trị này trong một vài ví dụ, nhưng không phải trong số this overview cũng như trong google playground

$ 2 Tôi đoán điều này là cần thiết, mặc dù tôi đã tìm thấy rất nhiều ví dụ không cung cấp thông tin này.

Nhưng, thật không may, tôi không thể thấy bất kỳ sự khác biệt nào khi cung cấp dữ liệu không hợp lệ (như email sai hoặc khóa cá nhân).

Câu hỏi

  • Làm thế nào tôi có thể xác minh rằng GoogleCredential là đúng?
  • Tôi có thể nhìn thấy nó trong các bước tiếp theo, như liên hệ với nghĩa là API androidpublisher không?

Trong bước tiếp theo tôi cố gắng để có được trạng thái mua hàng của một thuê bao:

Androidpublisher publisher = new Androidpublisher.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential) 
           .setApplicationName(GOOGLE_PRODUCT_NAME) // $1     
           .build(); 
Androidpublisher.Purchases purchases = publisher.purchases(); 
Androidpublisher.Purchases.Get get = purchases.get("android.test.purchased", "monthly001", "mytoken"); // $2 
SubscriptionPurchase subscripcion = get.execute(); 

$ 1: Tên sản phẩm giả của tôi từ API console -> API Access

$ 2: Bên cạnh thực tế, rằng API androidpush not allow contacting it via service accounts, but only via web server applications auth flow, tôi không có bất kỳ đầu mối nào để chèn vào tham số của phương thức nhận.

Dưới đây là các API: https://developers.google.com/android-publisher/v1/purchases/get

Câu hỏi

  • tên gói là gì và subscriptionId trong bối cảnh này là gì?
  • Tôi lấy/đặt các giá trị này ở đâu?

Sau khi đọc this document Tôi biết có cách để giải quyết phản hồi giả/tĩnh. Nhưng tôi không thể đọc ở bất cứ đâu nếu điều này cũng có thể cho đăng ký hoặc chỉ cho hóa đơn trong ứng dụng trên thiết bị di động.

Tôi đang tự hỏi tại sao nào/nếu có bất kỳ cách dễ dàng để phát triển với một sandbox hoặc s.th. simliar.

Tôi vẫn có cảm giác rằng tôi chỉ thiếu một phần quan trọng để hiểu cách mọi thứ hoạt động. Có thể ai đó của bạn có thể cho tôi một gợi ý làm thế nào để tiến hành tại nơi này hoặc có thể nói cho tôi biết tôi đã sai ở đâu.

Trân trọng!

Christopher

+0

Kiểm tra http://stackoverflow.com/a/24264696/165708 kiếm một giải pháp tốt hơn. –

Trả lời

4

tôi bây giờ có thể tìm ra hầu hết các vấn đề hiểu biết trước đây của tôi.

= 1 = TẠO URL ỦY QUYỀN

String authorizeUrl = new GoogleAuthorizationCodeRequestUrl(googleClientId,callbackUrl,"https://www.googleapis.com/auth/androidpublisher").build()  
// See why: http://stackoverflow.com/questions/8433990/when-authenticating-with-oauth-and-youtube-always-get-error-invalid-grant-on 
authorizeUrl += "&approval_prompt=force&access_type=offline" 

= 2 = Authenticate

Kể từ khi máy chủ webflow không hoạt động cho các API androidpublisher khách hàng bây giờ phải gọi URL được tạo ra trong (1) bằng tay .

= 3 = CALLBACK

Cuộc gọi lại của Google sẽ xử lý các bước tiếp theo. Hàm gọi lại chứa tham số "mã" mà chúng ta phải sử dụng.

= 4 = YÊU CẦU AUTH-TOKEN

// Build the HTTP parameter 
    Map<String,String> params = [:] 
    params.put("grant_type", "authorization_code") 
    params.put("code", code.encodeAsURL()) 
    params.put("client_id", customer.googleClientId.encodeAsURL()) 
    params.put("client_secret", customer.googleClientSecret.encodeAsURL()) 
    params.put("redirect_uri", getCallbackUrl().encodeAsURL()) 

    // Send the POST request 
    // This action might throw an exception in case any parameter were wrong, invalid or not specified. 
    String result = HttpRequestHandler.sendRequest("https://accounts.google.com/o/oauth2/token", params); 
    JSONElement jsonResult = JSON.parse(result) 

    // Map result 
    OAuth2Result oAuth2Result = new OAuth2Result() 
    oAuth2Result.accessToken = jsonResult.getAt("access_token") 
    oAuth2Result.refreshToken = jsonResult.getAt("refresh_token") 
    oAuth2Result.ttlSeconds = Integer.parseInt(jsonResult.getAt("expires_in").toString()) 
    oAuth2Result.tokenType = jsonResult.getAt("token_type") 

= 5 = YÊU CẦU REFRESH TOKEN

// Build the HTTP parameter 
    Map<String,String> params = [:] 
    params.put("grant_type", "refresh_token") 
    params.put("refresh_token", this.customer.googleRefreshToken.encodeAsURL()) 
    params.put("client_id", customer.googleClientId.encodeAsURL()) 
    params.put("client_secret", customer.googleClientSecret.encodeAsURL()) 

    // Send the POST request 
    // This action might throw an exception in case any parameter were wrong, invalid or not specified. 
    String result = HttpRequestHandler.sendRequest("https://accounts.google.com/o/oauth2/token", params); 
    JSONElement jsonResult = JSON.parse(result) 

    // Map result 
    OAuth2Result oAuth2Result = new OAuth2Result() 
    oAuth2Result.accessToken = jsonResult.getAt("access_token") 
    oAuth2Result.refreshToken = jsonResult.getAt("refresh_token") 
    oAuth2Result.ttlSeconds = Integer.parseInt(jsonResult.getAt("expires_in").toString()) 
    oAuth2Result.tokenType = jsonResult.getAt("token_type") 
Các vấn đề liên quan