Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


¿Estoy consiguiendo los pasos correctos para verificar la suscripción de Android de un usuario en la aplicación?

Estoy haciendo una aplicación que no requiere una cuenta de usuario / inicio de sesión, y permite al usuario comprar una suscripción. Quiero utilizar la API de Google Play Developer para verificar si un usuario tiene una suscripción adquirida o activa. De toda la documentación, he reunido los siguientes pasos.

¿Están correctos, y podría responder a las dos preguntas en ellos?

  1. Cree una cuenta de servicio en la Consola de API de Google.
  2. Guardar la clave privada que se me da (¿dónde? Seguramente no en mi código / en el dispositivo como sugiere este código de ejemplo )
  3. Utilizar la biblioteca de cliente de API de Google para Java para crear y firmar un JWT con la clave privada (¿cómo ?, los documentos me dan esto , pero eso no es código Java … ¿Qué hago con él?)
  4. Construya una petición de token de acceso y obtenga acceso a la API
  5. La aplicación ahora puede enviar una solicitud GET a la API para averiguar si el usuario tiene o no una suscripción
  6. Cuando el token de acceso expire, vuelva al paso 3.

Además, tengo un servicio web, aunque no sé nada acerca de los servicios web o la programación de servicios web … solo sé lo suficiente como para ser conscientes de que es probablemente necesario usar aquí.

EDIT: Estos pasos no eran correctos. Vea mi respuesta a continuación para ver los pasos correctos. Sin embargo, tenga en cuenta que esto sólo se aplica al uso de una cuenta de servicio (porque no quería que un usuario tuviera que permitir explícitamente el acceso a la API)

  • Cómo crear GoogleCredential mediante la cuenta de servicio JSON
  • ¿Cómo comprobar si un usuario tiene una suscripción (facturación de Android en la aplicación)?
  • Prueba de las suscripciones de compra de IAP / In-App de Android
  • Cuando se renueva automáticamente una suscripción en la aplicación de Google Play, ¿envía otra notificación de compra (en la notificación de la aplicación)?
  • ¿Estoy recibiendo estos pasos correctamente para comprobar la suscripción de facturación de un usuario en la aplicación?
  • Se ha rechazado una tasa increíblemente alta de "tarjeta del cliente" en la API de suscripción
  • Problema con Android IAP, sin OrderID en el objeto de compra
  • Obtener estado de la suscripción de Android, falló con 403
  • 7 Solutions collect form web for “¿Estoy consiguiendo los pasos correctos para verificar la suscripción de Android de un usuario en la aplicación?”

    Como resulta, mis pasos no eran correctos. Me tomó semanas para entender esto y no parece ser documentado en ningún otro lugar. De nada:

    1. Cree una cuenta de aplicación Web en la Consola de API de Google . Poner cualquier sitio web como un "URI de redireccionamiento"; No importa ya que en realidad no lo estarás usando. Obtendrá una identificación de cliente y secreto de cliente cuando cree la cuenta.

    2. En un navegador de su computadora, vaya a https://accounts.google.com/o/oauth2/auth?scope=https://www.googleapis.com/auth/androidpublisher&response_type=code&access_type=offline&redirect_uri=[YOUR REDIRECT URI]&client_id=[YOUR CLIENT ID] y permitir acceso cuando se le solicite.

    3. Busque en la barra de direcciones. Al final de la URI que ingresó originalmente será su token de actualización. Parece 1/.... Necesitará este "código" en el siguiente paso. El token de actualización nunca caduca.

    4. Convierta este "código" en un "token de actualización" https://accounts.google.com/o/oauth2/token?client_id=[YOUR CLIENT ID]&client_secret=[YOUR CLIENT SECRET]&code=[CODE FROM PREVIOUS STEP]&grant_type=authorization_code&redirect_uri=[YOUR REDIRECT URI] a https://accounts.google.com/o/oauth2/token?client_id=[YOUR CLIENT ID]&client_secret=[YOUR CLIENT SECRET]&code=[CODE FROM PREVIOUS STEP]&grant_type=authorization_code&redirect_uri=[YOUR REDIRECT URI] . Puede guardar el valor resultante en su programa; Nunca expira a menos que sea revocada explícitamente. ( Este paso es insertado por @BrianWhite – vea comentarios ) Asegúrese de que está utilizando POST (insertado por Gintas)

    5. En su código, envíe una solicitud HttpPost a https://accounts.google.com/o/oauth2/token con los nombres de "grant_type","refresh_token" BasicNameValuePairs "grant_type","refresh_token" , "client_id",[YOUR CLIENT ID] , "client_secret",[YOUR CLIENT SECRET] "refresh_token",[YOUR REFRESH TOKEN] "client_secret",[YOUR CLIENT SECRET] , "refresh_token",[YOUR REFRESH TOKEN] . Para un ejemplo, mira aquí . Tendrá que hacer esto en un hilo independiente, probablemente utilizando AsyncTask. Esto devolverá un JSONObject.

    6. Obtenga el token de acceso del objeto JSONObject devuelto. Para un ejemplo, mira aquí . Necesitará obtener la cadena "access_token". El token de acceso expira en 1 hora.

    7. En su código, envíe una solicitud HttpGet a https://www.googleapis.com/androidpublisher/v1/applications/[YOUR APP'S PACKAGE NAME]/subscriptions/[THE ID OF YOUR PUBLISHED SUBSCRIPTION FROM YOUR ANDROID DEVELOPER CONSOLE]/purchases/[THE PURCHASE TOKEN THE USER RECEIVES UPON PURCHASING THE SUBSCRIPTION]?accesstoken="[THE ACCESS TOKEN FROM STEP 4]" . Para un ejemplo, mira aquí .

    Si usted es como yo, y quiere hacer esto en PHP , aquí está el procedimiento de cómo hacerlo … Gracias a la respuesta de Kalina me tomó sólo tres días para trabajar cómo funciona :).

    Aquí va:

    1. Vaya a la consola de desarrolladores de Google https://console.developers.google.com/ y cree una aplicación web . Ponga "developers.google.com/oauthplayground como un" URI de redireccionamiento "; Lo usará en el paso 2. Obtendrá una identificación de cliente y un secreto de cliente cuando cree la cuenta. Asegúrate de añadir la API para desarrolladores de Google Play para Android .

    2. Vaya a Google oauth2 playground https://developers.google.com/oauthplayground/ . Esta gran herramienta es tu mejor amigo para los próximos días. Ahora vaya a la configuración: asegúrese de que se utilicen sus propias credenciales de OAuth . Solamente entonces usted puede llenar su identificación del cliente y secreto del cliente en la forma abajo.

    3. En Google oauth2 playground vaya al paso 1 Seleccione y autorice APIs rellene el ámbito en el campo de entrada https://www.googleapis.com/auth/androidpublisher . No pude encontrar la API de Google Play para desarrolladores de Android en la lista, tal vez agregue algún tiempo después. Pulse AUTORIZAR APIS . Haga la autorización que sigue.

    4. En Google oauth2 playground vaya al paso 2 Código de autorización de intercambio de tokens . Si todo ha ido bien verás un código de autorización que comienza con / 4. Si algo no va bien verifique el mensaje de error a la derecha. Ahora toca 'token de acceso de actualización'. Copie el token Refresh … comenzará con / 1 …

    5. ¡Ahora usted puede conseguir siempre un token de acceso! aquí es cómo:

       $url ="https://accounts.google.com/o/oauth2/token"; $fields = array( "client_id"=>"{your client id}", "client_secret"=>"{your client secret}", "refresh_token"=>"{your refresh token 1/.....}", "grant_type"=>"refresh_token" ); $ch = curl_init($url); //set the url, number of POST vars, POST data curl_setopt($ch, CURLOPT_POST,count($fields)); curl_setopt($ch, CURLOPT_POSTFIELDS, $fields); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); //execute post $lResponse_json = curl_exec($ch); //close connection curl_close($ch); 

    Ahora usted tiene un ACCESS TOKEN hooray … el JSON se verá así:

     "access_token" : "{the access token}", "token_type" : "Bearer", "expires_in" : 3600 

    ¡Finalmente usted está listo para pedir algo de google! Aquí está cómo hacerlo:

     $lAccessToken = "{The access token you got in}" ; $lPackageNameStr = "{your apps package name com.something.something}"; $lURLStr = "https://www.googleapis.com/androidpublisher/v1.1/applications/$lPackageNameStr/subscriptions/$pProductIdStr/purchases/$pReceiptStr"; $curl = curl_init($lURLStr); curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $curlheader[0] = "Authorization: Bearer " . $lAccessToken; curl_setopt($curl, CURLOPT_HTTPHEADER, $curlheader); $json_response = curl_exec($curl); curl_close($curl); $responseObj = json_decode($json_response,true); 

    El JSON devuelto contendrá dos marcas de tiempo, el initiationTimestampMsec y validUntilTimestampMsec el momento en que la suscripción es válida. Ambos son el nr de millisecs para agregar a la fecha 1/1/1970!

    No sé en 2012, pero en 2015 no debería hacer ninguno de estos pasos manualmente. Tuve un tiempo muy difícil encontrar la documentación por lo que estoy publicando aquí en caso de que ayuda a nadie.

    1. Sólo debe consultar las compras en la aplicación desde su servidor por razones de seguridad, ya que de lo contrario no puede confiar en ninguno de los 2 extremos del proceso de compra.

    Ahora, en el lado del servidor (creo que todavía puede usar el mismo código de su aplicación si es absolutamente necesario), incluya la biblioteca cliente google-api-services-androidpublisher en su proyecto (consulte https://developers.google.com / Api-cliente-biblioteca / java / apis / androidpublisher / v1 )

    Como mencionaste, necesitas una cuenta de servicio con un archivo P12 (la biblioteca cliente sólo acepta archivo P12).

    A continuación, el código siguiente se autenticará y obtendrá información de compra muy bien:

      HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport(); JsonFactory jsonFactory = new JacksonFactory(); List<String> scopes = new ArrayList<String>(); scopes.add(AndroidPublisherScopes.ANDROIDPUBLISHER); Credential credential = new GoogleCredential.Builder().setTransport(httpTransport).setJsonFactory(jsonFactory) .setServiceAccountId(googleServiceAccountId) .setServiceAccountPrivateKeyFromP12File(new File(googleServicePrivateKeyPath)) .setServiceAccountScopes(scopes).build(); AndroidPublisher publisher = new AndroidPublisher.Builder(httpTransport, jsonFactory, credential).build(); AndroidPublisher.Purchases purchases = publisher.purchases(); final Get request = purchases.get(packageName, productId, token); final SubscriptionPurchase purchase = request.execute(); // Do whatever you want with the purchase bean 

    Puede encontrar información sobre la autenticación de cliente Java aquí: https://developers.google.com/identity/protocols/OAuth2ServiceAccount

    Usuarios de .NET: espero que esta respuesta salve a alguien una tonelada de dolor.

    Como @Christophe Fondacci señaló en 2015, la solución aceptada funcionó muy bien hace unos años. Ahora es 2017 y el proceso es mucho más fácil y rápido .

    Mi caso de uso es validar las suscripciones en la aplicación, donde mi aplicación móvil envía información de compra de suscripción a mi servidor RESTful, que a su vez contacta a Google para validar una compra de suscripción.

    La estrategia es crear una cuenta de servicio que operará en su nombre.

    1. Inicia sesión en tu Consola de desarrollo de Google Play y haz clic en la aplicación que estás configurando.
    2. Visita Configuración -> Acceso a la API
    3. En Cuentas de servicio , pulse el botón Crear cuenta de servicio .
    4. A partir de enero de 2017 aparece un diálogo con instrucciones sobre cómo configurar una cuenta de servicio. El cuadro de diálogo lo lleva a la Consola de API de Google; desde allí,

      A) Haga clic en Crear cuenta de servicio

      B) Crear el nombre de cuenta de servicio que tiene sentido. Ya que estamos interesados ​​en acceder a Android Publisher Services, elegí "editor".

      C) Para el rol, solo elija algo – puede cambiarlo más tarde.

      D) Elija "Proporcionar nueva clave privada" y elija P12 para implementaciones .Net. ¡No pierdas este archivo!

    5) Ahora que ha terminado con # 4, verá su nueva cuenta de servicio en la lista; Haga clic en "Conceder acceso" para habilitarlo.

    6) Toque en el enlace "Ver permisos". Debe modificar los permisos según sus necesidades y la API.

    Para validar las compras en la aplicación, visite Cog-> Change Permissions y habilite los permisos GLOBAL "Visiblity" y "Manage Orders".

    Aceptar en este momento usted ha configurado todo en el final de Google. Ahora para configurar su servidor a cosas de servidor. Recomiendo crear una aplicación de consola .Net para probar su implementación y luego descargarlo donde sea necesario.

    1) Agregue la Biblioteca de Cliente de Publisher de Android de Nuget

     PM> Install-Package Google.Apis.AndroidPublisher.v2 

    2) Agregue el archivo P12 a su raíz del proyecto

    3) Cambie las propiedades de P12 para que "Acción de construcción" sea "Contenido" y "Copiar en Directorio de salida" a "Copiar si es más reciente".

    4) Implementar algo como esto para probar su acceso y afinar.

     using System.Threading.Tasks; using System.Security.Cryptography.X509Certificates; using Google.Apis.Services; using Google.Apis.Auth.OAuth2; using Google.Apis.AndroidPublisher.v2; ... public Task<SubscriptionPurchase> GetSubscriptionPurchase(string packageName, string productId, string purchaseToken) { var certificate = new X509Certificate2( "{{your p12 file name}}", "{{ your p12 secret }}", X509KeyStorageFlags.Exportable ); var credentials = new ServiceAccountCredential( new ServiceAccountCredential.Initializer("{{ your service account email }}") { Scopes = new[] { AndroidPublisherService.Scope.Androidpublisher } }.FromCertificate(certificate)) ; var service = new AndroidPublisherService(new BaseClientService.Initializer() { HttpClientInitializer = credentials, ApplicationName = "my server app name", }); return service.Purchases.Subscriptions.Get(packageName, productId, purchaseToken).ExecuteAsync(); } 

    Buena suerte, espero que esto ayude a alguien.

    Fuentes:

    Uso de OAuth 2.0 para aplicaciones de servidor a servidor

    .Net Client Library para Google.Apis.AndroidPublisher.v2

    Puedo interpretar incorrectamente tu pregunta, pero no veo una razón para que utilices los enlaces a los que te estás refiriendo para que funcione la aplicación de facturación para una aplicación de Android. Esta página es mucho más útil:

    http://developer.android.com/guide/google/play/billing/index.html

    Puedes probar la aplicación de demostración que incluyen (Dungeons – http://developer.android.com/guide/google/play/billing/billing_integrate.html#billing-download ). Que utiliza productos (compras únicas) en lugar de suscripciones, pero debería ser capaz de modificar para probar lo que desea.

    Creo que la clave, para ti, sería el método restoreTransactions que proporcionan en la muestra para ver si la cuenta de Google Play tiene alguna suscripción para tu aplicación:

     @Override public void onRestoreTransactionsResponse(RestoreTransactions request, int responseCode) { if (responseCode == BillingVars.OK) { // Update the shared preferences so that we don't perform a RestoreTransactions again. // This is also where you could save any existing subscriptions/purchases the user may have. SharedPreferences prefs = getSharedPreferences(my_prefs_file, Context.MODE_PRIVATE); SharedPreferences.Editor edit = prefs.edit(); edit.putBoolean(DB_INITIALIZED, true); edit.commit(); } else { Log.e(TAG, "RestoreTransactions error: " + responseCode); } } 

    Como tiene un servicio web al que puede llamar su aplicación, recomendaría almacenar su clave privada de forma segura en su servidor. Debe buscar moverse tanto de las cosas en la aplicación a las llamadas de servicio, como sea posible, vea este enlace . He implementado la suscripción en la aplicación, pero era antes de que esta parte de la API estuviera desactivada. Tuve que hacer mi propio registro y verificación de seguridad, pero parece que esta API hace la mayor parte de eso para usted, usando OAuth, aunque parece que usted todavía es responsable de almacenar la solicitud / verificación de suscripción.

    Cuando se habla de la firma de su JWT con una biblioteca existente, que parecen proporcionarle enlaces a una biblioteca de Java, una biblioteca de Python y una biblioteca de PHP – depende de lo que su servicio web o componente de servidor está escrito en (mina es C #, Así que utilizo RSACryptoServiceProvider) para verificar las compras firmadas. Están utilizando objetos JSON para la transferencia real de datos.

    Si alguien está teniendo problemas con los mensajes aceptados paso final (# 7), encontré ?access_token= trabajar en lugar de ?accessToken=

    Demasiado desbordamiento de pila no me dejará hacer ese comentario directamente al hilo …

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.