Compruebe el estado de compra de Android pero devuelva el token de compra no se encontró
Hice referencia a google play android api para comprobar el estado de compra y consumo de un elemento en la aplicación. Para algunos pedidos, puedo obtener el resultado correcto, pero algunos devuelven el error como a continuación:
error: { errors: [ { domain: "global", reason: "purchaseTokenNotFound", message: "The purchase token was not found.", locationType: "parameter", location: "token" } ], code: 404, message: "The purchase token was not found." }
El token de compra es proporcionado por google, ¿se puede falsificar?
- LocationServices.SettingsApi Restablecer SETTINGS_CHANGE_UNAVAILABLE flag
- Google Play Services GCM 9.2.0 pide "actualizar" a la versión original
- No puede setInterval en onLocationChanged
- Google Analytics V4 con dispositivos Amazon
- La autenticación en los Servicios de juegos de Google Play en android causa un error al iniciar sesión con la cuenta de Google Apps
Encontré si cancelo la orden de google, después comprobar el estado de la compra, él volverá el símbolo de la compra no fue encontrado. Si no, conseguiré el estado correcto de la compra.
Espero que alguien pueda ayudar.
- Cómo implementar onConnectionFailed () y onDisconnected () para un servicio de ubicación
- Error en el registro de Google Cloud Messaging
- Informe de errores de Google Play Services
- Android In-App Billing - queryInventoryAsync devuelve 0 resultado
- Negación de permisos: Acceso al servicio ComponentInfo {...} desde pid = -1
- Cómo obtener información de google play store en mi aplicación android?
- GooglePlayServices Problema de Admob: "No se pudo cargar anuncio: 0"
- Use .GetMapAsync en lugar de otro método .getMap con Google Play Services (Xamarin)
Si está vendiendo el mismo producto INAPP al mismo usuario muliple veces en un período corto, entonces es muy probable que todos los tokens de acceso excepto la última compra devolverán un código 404 .
Por ejemplo:
[email protected] fue a su aplicación y compró com.example.test.product unas cuantas veces, usted probaly aviso dentro de sus registros (o cuenta de comerciante de Google Wallet) que es el mismo usuario que compra el producto.
Cuando vaya a comprobar la última compra de este usuario, es probable que aparezca lo siguiente
{ kind: "androidpublisher#inappPurchase", purchaseTime: "1409823171827", purchaseState: "0", consumptionState: "1", developerPayload: "My Product | Ref | 1409823162466" }
Y sin embargo si usted fuera a comprobar sus fichas anteriores, entonces es muy probable que sus compras volverán 404 !
Yo había leído en algún lugar (no recuerdo dónde) que el símbolo de compra creado para cada compra se basa básicamente en el producto inapp y el usuario de google. Por lo tanto, es muy probable que cada compra "destruya" cualquier token de compra anterior creado para el mismo usuario.
Espero que esta explicación ayuda. Estoy constantemente teniendo este problema todos los días cuando mi servidor está tratando de conectarse a la API de Google y comprobar las transacciones. Tal vez un día alguien va a leer esto y proporcionar una solución 🙂
Los documentos son engañosos. No es necesario utilizar esta API para verificar las compras.
La aplicación para móviles tiene INAPP_PURCHASE_DATA e INAPP_DATA_SIGNATURE del método getBuyIntent .
Puede verificar la compra con la firma y su clave pública .
https://developer.android.com/google/play/billing/billing_reference.html#getBuyIntent
Puedes encontrar la clave pública en la Google Play Developer Console
-> YOUR_APP
-> service and API
package main import ( "crypto" "crypto/rsa" "crypto/sha1" "crypto/x509" "encoding/base64" "encoding/pem" "fmt" ) //replace const below with your own. const ( pubKeyPEM=`-----BEGIN PUBLIC KEY----- Some thing like this -----END PUBLIC KEY-----` data = `purchase data from getBuyIntent API` sign = `purchase data signature from getBuyIntent API` ) func Panic(err error) { if err != nil { panic(err) } } func main() { PEMBlock, _ := pem.Decode([]byte(pubKeyPEM)) if PEMBlock == nil { Panic(fmt.Errorf("Could not parse Public Key PEM")) } if PEMBlock.Type != "PUBLIC KEY" { Panic(fmt.Errorf("Found wrong key type")) } pubkey, err := x509.ParsePKIXPublicKey(PEMBlock.Bytes) if err != nil { Panic(err) } // compute the sha1 h := sha1.New() h.Write([]byte(data)) // decode b64 signature signature, err := base64.StdEncoding.DecodeString(sign) Panic(err) // Verify err = rsa.VerifyPKCS1v15(pubkey.(*rsa.PublicKey), crypto.SHA1, h.Sum(nil), signature) Panic(err) // It verified! fmt.Println("OK") }
- SQLite incapaz de abrir el archivo de base de datos (código 14) en la consulta "SELECT" frecuente
- ¿Cómo publicar una solicitud de HTTPS utilizando Retrofit?