Android: inApp satın alma makbuzu doğrulaması google play


92

Google ürününü satın aldıktan sonra ödeme ağ geçidim için google cüzdan kullanıyorum, bana aşağıdaki yanıtı veriyor:

{ 
 "orderId":"12999763169054705758.1371079406387615", 
 "packageName":"com.example.app",
 "productId":"exampleSku",
 "purchaseTime":1345678900000,
 "purchaseState":0,
 "developerPayload":"bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ",
 "purchaseToken":"rojeslcdyyiapnqcynkjyyjh"
 }

Google'ın yeni tanıttığı Makbuz Doğrulamasını kullanmaya çalışıyorum.Google Geliştirici konsolunda İzin kısmında Hizmet Hesabına göre sertifika anahtarı yaptım . Ancak Google Play mağazasından bir Ürün satın aldıktan sonra Makbuz Doğrulamasını nasıl kullanacağım konusunda kafam karıştı.

Teneke herkes Yani nasıl yapılacağını bana yardım edin Makbuz doğrulama ait InAppPurchase.


Merhaba Binil, abonelik satın almak için tamamladınız mı?
Anshul Tyagi

yönetme ürünü @Anshul Tyag
Binil Surendran

@BinilSurendran .. Benim sorum, sorunuzdan farklı, ancak uygulama içi satın alma için kullanılan e-posta kimliğini bilmem gerekiyor. Uygulamamda daha fazla referans için ihtiyacım olduğu için bu e-postayı nasıl alabileceğim konusunda yardım edebilir misin
Pallavi

@Pallavi. üzgünüm, alıcının e-posta kimliğini alma fikrim yok. satın alma işleminden sonra google tarafından verilen yanıtın email_id yok
Binil Surendran

Yanıtlar:


216

Google, Google Play Geliştirici API'si aracılığıyla makbuz doğrulaması sağlar; API dahilinde en çok ilginizi çekecek iki uç nokta vardır: Purchases.products: get ve Purchases.subscriptions: get .

Purchases.products: getOtomatik yenilenmeyen bir ürün satın alımını doğrulamak için kullanılabilir, burada Purchases.subscriptions: getotomatik yenilenen ürün aboneliklerini doğrulamak ve yeniden doğrulamak içindir.

Bilmeniz gereken her iki bitiş noktası kullanmak için packageName, productId, purchaseTokenbunların hepsi sizi satın alınan yük bulunabilir. Ayrıca access_tokenbir Google API hizmet hesabı oluşturarak alabileceğiniz bir şeye de ihtiyacınız var .

Bir hizmet hesabını kullanmaya başlamak için önce Google Play Geliştirici konsolu API erişim ayarları sayfasına gidin ve Yeni proje oluştur düğmesini tıklayın:

Yeni bir Google API Projesi oluşturun

Şimdi yeni bir Bağlı Proje ve birkaç yeni bölüm görmelisiniz, Hizmet Hesabı bölümünde Hizmet hesabı oluştur düğmesine tıklayın.

Yeni bir Hizmet Hesabı oluşturun

Hizmet hesabınızı oluşturma talimatlarını içeren bir bilgi kutusu ile karşılaşacaksınız. Google Developers Console bağlantısını tıkladığınızda yeni bir sekme açılır.

Google Developers Console'u açın

Şimdi Yeni İstemci Kimliği Oluştur'u tıklayın, seçeneklerden Hizmet hesabı'nı seçin ve İstemci Kimliği Oluştur'u tıklayın.

Yeni bir Müşteri Kimliği oluşturun

Bir JSON dosyası indirilecek, bu sizin JSON Web Jetonunuzdur, bu access_tokenyüzden onu güvende tutun

Daha sonra sekmeleri Google Play Geliştirici konsoluna geri getirin ve bilgi kutusunda Bitti'yi tıklayın. Listede yeni hizmet hesabınızı görmelisiniz. Hizmet hesabı e-postasının yanındaki Erişim izni ver seçeneğine tıklayın.

Erişim ver

Bu kullanıcı için bir rol seçin'in altında Finans'ı seçin ve Kullanıcı ekle'yi tıklayın.

Rolü Finans olarak ayarlayın

Artık hizmet hesabınızı kurdunuz ve makbuz doğrulamalarını gerçekleştirmek için gerekli tüm erişime sahip. Sırada, JWT'nizi bir access_token ile değiştirmek.

access_tokenDeğişim bir saat kadar bazı sunucu kodu bu işlemek için ve Google (geniş kapsamlı değil liste) Bu işlemek için birçok dilde birkaç kütüphaneleri sağladık gerek sonra sona erer:

Bu kütüphaneleri kullanma konusunda belgelerin bol çünkü detaylı girmeyeceğim, ama kullanmak istediğiniz bahsedilecek https://www.googleapis.com/auth/androidpublisher, OAuth2 kapsamı gibi client_emailJWT'de itibaren issuerve genel anahtar adreslerden alabilirsiniz private_keyve için parola notasecretkullanılacaktır signing_key.

Bir kez access_tokensize (Yukarıdaki paragrafta aynı işlem aşağıdaki yenisini talep etmek istiyorum noktadaki sonraki saat için en az) gitmek olman iyi.

Bir sarf malzemesi (otomatik yenilenmeyen) satın alma işleminin durumunu kontrol etmek için aşağıdakilere bir http gettalebinde bulunun :https://www.googleapis.com/androidpublisher/v2/applications/com.example.app/purchases/products/exampleSku/tokens/rojeslcdyyiapnqcynkjyyjh?access_token=your_access_token

200 http yanıt kodu alırsanız, her şey planlandığı gibi gitti ve satın alma işleminiz geçerli oldu. 404, jetonunuzun geçersiz olduğu anlamına gelir, bu nedenle satın alma işlemi büyük olasılıkla bir sahtekarlık girişimidir. 401, erişim jetonunuzun geçersiz olduğu anlamına gelir ve 403, hizmet hesabınızın yetersiz erişime sahip olduğu anlamına gelir ; Google Play Geliştirici konsolunda erişim hesabı için Finans'ı etkinleştirip etkinleştirmediğinizi kontrol edin .

200'den gelen yanıt şuna benzer görünecektir:

{
  "kind": "androidpublisher#productPurchase",
  "purchaseTimeMillis": long,
  "purchaseState": integer,
  "consumptionState": integer,
  "developerPayload": string
}

Her bir özelliğin açıklaması için https://developers.google.com/android-publisher/api-ref/purchases/products adresine bakın .

Abonelikler benzerdir ancak uç nokta şuna benzer:

https://www.googleapis.com/androidpublisher/v2/applications/packageName/purchases/subscriptions/subscriptionId/tokens/token?access_token=you_access_token

Ve yanıt şu özellikleri içermelidir:

{
  "kind": "androidpublisher#subscriptionPurchase",
  "startTimeMillis": long,
  "expiryTimeMillis": long,
  "autoRenewing": boolean
}

Bkz https://developers.google.com/android-publisher/api-ref/purchases/subscriptions mülkiyet açıklamaları ve not için startTimeMillisve expiryTimeMillissöz konusu abonelik süresine bağlı olarak değiştirmek olacaktır.

Mutlu onaylar!


Geliştirici konsoluna yeni bir kullanıcı ekledim ve konsoldan alınan bir JSON sertifikası aldım. @Marc Greenstock
Binil Surendran,

@BinilS Daha spesifik olmanız gerekecek, kodunuzu hangi sunucu tarafında yazacaksınız?
Marc Greenstock

sunucu tarafında java kullanıyorum @Marc Greenstock
Binil Surendran

3
Bu, aramadan 2 gün sonra sunucu ödeme doğrulamasını uygulamaya yönelik ayrıntılı bir kılavuzu ilk kez görüyorum. Başparmak havaya. Bir yerde kullanıma hazır bir sunucu kodu var mı? Hiçbir yerde böyle bir şey bulamamak çok garip buluyorum
Anonymous

2
@MarcGreenstock Ayrıntılı cevap için teşekkürler.
Lavakush

28

Marc'ın cevabı mükemmel. Yalnızca Java için Google Play Geliştirici API İstemci Kitaplığı'nın sunucunuzdan Google Play sunucularına bağlanırken bunu çok daha basit hale getirdiğini ekleyeceğim . Kitaplık, kimlik doğrulama belirtecinin yenilenmesini otomatik olarak gerçekleştirir ve ayrıca, URL'lerle uğraşmak zorunda kalmamanız için bir tür güvenli API sağlar.

PublisherSingleton'u şu şekilde kurarsınız:

httpTransport = GoogleNetHttpTransport.newTrustedTransport();
jsonFactory = JacksonFactory.getDefaultInstance();      
credential = GoogleCredential.fromStream(getClass().getResourceAsStream("/path/to/your/key.json")).createScoped(Collections.singleton(AndroidPublisherScopes.ANDROIDPUBLISHER));
publisher = new AndroidPublisher.Builder(httpTransport, jsonFactory, credential).setApplicationName(APP_NAME).build();

Aşağıdaki kod bir ürün satın alımını sorgular:

ProductPurchase product = publisher.purchases().products().get(PACKAGE_NAME, sku, token).execute();
Integer purchaseState = product.getPurchaseState();
product.getPurchaseTimeMillis();
product.getConsumptionState();
product.getDeveloperPayload();

Benzer şekilde abonelikler için sorgulama yapabilirsiniz:

SubscriptionPurchase sub = publisher.purchases().subscriptions().get(PACKAGE_NAME, sku, token).execute();
sub.getAutoRenewing();
sub.getCancelReason();
...

Bu bir Java sunucusundaki kod mu, yoksa rastgele bir sunucuya çağrı yapmadan önce Android'de mi yürütüldü?
kullanıcı

2
@jeshurun ​​Kod için teşekkürler. Diğer okuyuculara APP_NAME = APP_PACKAGE_NAME.
blizzard

1
Python ne olacak?
Babken Vardanyan

1
Teşekkür ederim! Benim için yerine getClass().getResourceAsStream(...kullandım new FileInputStream(....
António Almeida

Teşekkürler. Çok kullanışlı. Ancak şunu da eklemem gerekiyordu: credential.refreshToken();kimlik bilgisi alma ile yayıncı arasında.
2019

5

@ marc-greenstock harika bir cevap verdi, ancak Google Play Android Geliştirici API'sini kullanarak fatura doğrulama hakkında çok önemli bir şey var.

Bu API'yi kullanırken herhangi bir sorun yaşıyorsanız ve uygulama içi ürününüzü hizmet hesabınıza bağlanmadan veya izin vermeden önce eklediyseniz, "Uygulama içi ürünler" i açmanız ve bazı güncellemeler yapmanız gerekir. Örneğin ürününüzün açıklamasını düzenleyebilir ve kaydedebilirsiniz. Anında izin almalısınız.

Neyi yanlış yaptığımı düşünerek birkaç saat geçirdim ...


2

Bu cevap mükemmel. Yönü izlerken karşılaştığımız bir başka sorun da hizmet hesabının Google Play Console'da görünmemesiydi. Yardımcı olmak için şu çözümü bulduk: Hizmet hesabı oluşturulduktan sonra Google Konsolunda görünmüyor

Temel olarak, Google API Konsolunda IAM'ye gidin ve yeni hizmet hesabını ekleyin, ardından Google Play Console'da görünecektir. ekran görüntüsü


Buraya açıklama ekleyebilir misiniz? Aksi takdirde, bağlantı iptal edilirse cevabınız geçersiz olur
Mathews Sunny

1
Eklenen hesabın rolü ne olmalıdır?
Adi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.