2012-09-26 27 views
5

से Google एंड्रॉइड सदस्यता की जांच संक्षेप में: क्या मैं Play Store में कोई ऐप प्रदान किए बिना सर्वर-साइड से Google Play Android डेवलपर API के साथ काम कर सकता हूं?सर्वर पक्ष

पृष्ठभूमि: मैं एक परियोजना पर काम कर रहा हूं जो मासिक सदस्यता के साथ ऐप्स प्रदान करता है। प्रत्येक सदस्यता (खरीद टोकन, दिनांक इत्यादि) के अनुरूप डेटा बैकएंड डेटाबेस में संग्रहीत हो जाता है। अब मैं एक क्रोनबॉज बनाना चाहता हूं जो इन प्रत्येक डेटासेट के माध्यम से पुन: प्रयास करता है। और प्रत्येक सदस्यता के लिए यदि मैं अभी भी मान्य है या नहीं, तो जानकारी पुनर्प्राप्त करने के लिए मैं Google API से संपर्क करना चाहता हूं, और प्रतिक्रिया के अनुरूप हमारे डेटाबेस को अपडेट करना चाहता हूं स्थिति।

बैकएंड तर्क के लिए मैं google-api-java-client library का उपयोग करता हूं।

या तो सदस्यता रद्द या सत्यापित करने के लिए मुझे पहले OAuth2 के साथ प्रमाणित करने की आवश्यकता है। वहां गया, ऐसा किया।

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: मुझे नहीं पता कि दिया गया खाता दायरा मान्य है या नहीं। क्योंकि मुझे यह मान बहुत कम उदाहरणों में मिल सकता है, लेकिन न तो this overview में और न ही google playground

$ 2 मुझे लगता है कि यह आवश्यक है, भले ही मुझे बहुत उदाहरण मिला जो इस जानकारी को प्रदान नहीं करता था।

लेकिन, दुर्भाग्यवश, जब मैं अमान्य डेटा (जैसे गलत ईमेल या निजी कुंजी) प्रदान करता हूं तो मुझे कोई अंतर दिखाई नहीं दे रहा है।

प्रश्न

  • मैं कैसे जांच करूं कि GoogleCredential सही है?
  • क्या मैं इसे अगले चरण में देख सकता हूं, जैसे एंड्रॉइडस्पब्लिशर एपीआई से संपर्क करना?

अगले कदम मैं एक सदस्यता की खरीद स्थिति प्राप्त करने की कोशिश में: API console -> API Access

$ 2 से मेरे डमी उत्पाद का नाम::

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 तथ्य के अलावा, कि androidpush एपीआई not allow contacting it via service accounts, but only via web server applications auth flow करता है, मेरे पास कोई तरीका नहीं है कि get-method के पैरामीटर में क्या डालना है। https://developers.google.com/android-publisher/v1/purchases/get

प्रश्न

  • पैकेज नाम क्या है और इस संदर्भ में subscriptionId क्या है:

    यहाँ एपीआई है?

  • मैं इन मानों को कहां/सेट कर सकता हूं?

this document पढ़ने के बाद मुझे पता है कि नकली/स्थैतिक प्रतिक्रियाओं से निपटने का एक तरीका है। लेकिन अगर मैं सब्सक्रिप्शन के लिए भी संभव है, या केवल मोबाइल उपकरणों पर इन-एप-बिलिंग के लिए भी संभव नहीं हूं।

मैं सोच रहा हूं कि क्यों/अगर sandbox या s.th. के साथ विकास करने का कोई आसान तरीका है। simliar।

मुझे अभी भी यह महसूस हो रहा है कि मुझे यह समझने के लिए एक बड़ा हिस्सा याद आ रहा है कि चीजों को कैसे काम करना चाहिए। शायद आप में से कोई मुझे इस संकेत पर आगे बढ़ने का संकेत दे सकता है या कह सकता है कि मैं कहां गलत हूं।

सधन्यवाद,

क्रिस्टोफर

+0

चेक http://stackoverflow.com/a/24264696/165708 एक बेहतर समाधान के लिए। –

उत्तर

4

अब मैं अपने पिछले समझ समस्याओं से ज्यादातर यह पता लगाने सकता है।

= 1 = उत्पन्न प्राधिकरण URL

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 = प्रमाणित

मैन्युअल रूप से सर्वर-webflow androidpublisher एपीआई ग्राहक अब कॉल URL में (1) उत्पन्न करना होगा के लिए काम नहीं कर रहा ।

= 3 = कॉलबैक

गूगल कॉलबैक लिए अगले कदम पर कार्रवाई करनी चाहिए। कॉलबैक में पैरामीटर "कोड" होता है जिसे हमें उपयोग करना होता है।

= 4 = अनुरोध प्राधि-टोकन

// 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 = अनुरोध रीफ़्रेश टोकन

// 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")