Проверить статус покупки Android, но не вернуть токен покупки

Я назвал google play android api, чтобы проверить статус покупки и потребления элемента в приложении. Для некоторых заказов я могу получить правильный результат, но некоторые возвращают ошибку, как показано ниже:

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." } 

Купить токен предоставляется google, может ли он быть фальшивым?

Я обнаружил, что если я отменил заказ Google, а затем проверьте статус покупки, он вернет токен покупки, который не найден. Если нет, я получу правильный статус покупки.

Надеюсь, кто-то может помочь.

Если вы продаете один и тот же продукт INAPP одному и тому же пользователю в течение короткого периода времени, то очень вероятно, что все токены доступа, кроме последней покупки, вернут код 404 .

Например:

John@example.com отправился в ваше приложение и несколько раз купил com.example.test.product , вы, вероятно, заметите в своих записях (или в аккаунте Google Wallet Merchant), что тот же пользователь покупает продукт.

Когда вы переходите на проверку последней покупки у этого пользователя, возможно, появится следующее:

 { kind: "androidpublisher#inappPurchase", purchaseTime: "1409823171827", purchaseState: "0", consumptionState: "1", developerPayload: "My Product | Ref | 1409823162466" } 

И все же, если вы должны были проверить его предыдущие токены, то очень вероятно, что его покупки вернутся 404 !

Я где-то читал (не могу вспомнить, где), что токен покупки, созданный для каждой покупки, в основном основан на продукте inapp и пользователе google. Поэтому очень вероятно, что каждая покупка «уничтожит» любой предыдущий токен покупки, созданный для того же пользователя.

Надеюсь, это объяснение поможет. Я постоянно сталкиваюсь с этой проблемой каждый день, когда мой сервер пытается подключиться к API Google и проверять транзакции. Возможно, однажды кто-нибудь прочитает это и предоставит решение 🙂

Документы вводят в заблуждение. Вам не нужно использовать этот API для проверки покупок.

Мобильное приложение имеет INAPP_PURCHASE_DATA и INAPP_DATA_SIGNATURE из метода getBuyIntent .

Вы можете проверить покупку с подписью и открытым ключом .

https://developer.android.com/google/play/billing/billing_reference.html#getBuyIntent

Вы можете найти открытый ключ в 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") } 
Intereting Posts
BitmapFactory не может декодировать растровое изображение от Uri после фотографий, сделанных на Android Nougat Диалоговое взаимодействие с панелью действий Пользовательский тост на экране Android: восстановление диалогового окна и т. Д. После изменения вращения При использовании JSON во Фрагментах приложение не отвечает в Android Development Изменить EditText setError drawable gravity Textview с длинным текстом выталкивает другие виды в GridLayout, несмотря на то, что ellipsize = end Android Отзывчивый дизайн Android – Анимируйте верхний вид ViewMargin / bottomMargin / etc в LinearLayout или RelativeLayout SetX, setTranslationX, setLeft, LayoutParam.leftMargin, Matrix .. В чем разница Изменение временной зоны в андроиде программно Сервисы Google Play для Froyo Proguard больше не работает с Retrofit Являются ли OpenGL Textures более эффективными с точки зрения памяти, чем растровые изображения Android? Код не выполнялся, когда диалоговое окно Android было слишком быстро ответвлено (состояние гонки)