In App Purchase: Diese App-Version ist nicht für die Zahlung über Google Play konf.

  • 17 Antworten
  • Letztes Antwortdatum
R

RobNeck

Ambitioniertes Mitglied
3
Moin,

ich habe mal testweise versucht, einen In App Purchase in meine App zu bauen. Leider bekomme ich aber immer dann, wenn ich den purchase durchführen möchte, die obige Meldung

"Diese App-Version ist nicht für die Zahlung über Google Play konfiguriert. Weitere Informationen finden Sie in der Hilfe."

Ich habe ein signiertes APK aus Ecplise exportiert und übers Terminal per adb install auf meinem Gerät installiert. Das exakt gleiche APK habe ich gestern als Betaversion in den DeveloperAcoount geladen. Das Konto welches ich auch dem Testgerät nutze, ist in meinem DeveloperAccount auch als Testkonto eingetragen.

Jemand ne Ahnung, woran das sonst noch liegen könnte?
 
Vielleicht keine Kreditkarte / Konto registriert auf dass das eventuelle Geld dann überwiesen werden kann.
 
Normal erhält man den Fehler, wenn die App-Version nicht in der Dev Console hochgeladen ist.

Da du dies aber gemacht hast, würde ich es mal damit probieren, dass du die Apk mal nicht als Betaversion hoch lädst, sondern als normale (musst sie ja nicht veröffentlichen, reicht als Entwurf).
 
reneph schrieb:
Normal erhält man den Fehler, wenn die App-Version nicht in der Dev Console hochgeladen ist.

Da du dies aber gemacht hast, würde ich es mal damit probieren, dass du die Apk mal nicht als Betaversion hoch lädst, sondern als normale (musst sie ja nicht veröffentlichen, reicht als Entwurf).

Im Konto des testers ist ne Kreditkarte hinterlegt. Ebenso ist alles angegeben, um Geld zu erhalten. Über das Entwicklerkonto werden bereits andere Apps im Store angeboten.

Die Idee mit der Hochstufung in die Produktionsphase kam mir auch, habe ich nun mal probiert. Leider dauert es ja immer ein paar Stunden, bis Änderungen wirksam werden. Ich werde berichten...
 
Funktioniert leider noch immer nicht... Hat jemand schon mal die Erfahrung gemacht, dass es länger als 9-10 Stunden gedauert hat, bis die Änderung in der Developer Console wirksam wurde?
 
Nein.

Hast du denn auch alles richtig eingerichtet? Sprich dein In-App-Produkt erstellt, auch aktiv, genau den gleichen Bezeichner in der App verwendet?
 
reneph schrieb:
Nein.

Hast du denn auch alles richtig eingerichtet? Sprich dein In-App-Produkt erstellt, auch aktiv, genau den gleichen Bezeichner in der App verwendet?

Jop, In App Produkt ist erstellt und aktiv uns die ID entspricht genau dem String, den ich in der App verwende.

Zur Sicherheit mal hier der Code:

In der onCreate:
Code:
base64EncodedPublicKey
		iabHelper = new IabHelper(this, base64EncodedPublicKey);
		iabHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
			    @Override
				public void onIabSetupFinished(IabResult result) {
				      if (!result.isSuccess()) {
				         // Oh noes, there was a problem.
				         Log.d(PURCHASE_TAG, "Problem setting up In-app Billing: " + result);
				      } else if (result.isSuccess()){
				         // Hooray, IAB is fully set up!
				      	Log.d(PURCHASE_TAG, "Setup completed: " + result);
				      	iabHelper.queryInventoryAsync(true, null, queryFinishedListener);
				      }
				   }

				});

In der onActivityResult:

Code:
	    if (iabHelper.handleActivityResult(requestCode, resultCode, data)) {
	        Log.d("TAG", "onActivityResult handled by IABUtil.");
	        return;
	    }

Der Buttonclick, nach dem immer die ursprünglich beschriebene Meldung auftaucht:
Code:
if(isPremium){
				saveImageToGallery(imageState.image);
			} else if (iabHelper != null) {
				iabHelper.flagEndAsync();
				purchaseItem(SKU_TEST);

Die dazugehörige Funktion:
Code:
	private void purchaseItem(String sku) {
		iabHelper.launchPurchaseFlow(this, sku, 10001,   
				   purchaseFinishedListener);
	}


Die Listener:

Code:
	IabHelper.QueryInventoryFinishedListener 
	   queryFinishedListener = new IabHelper.QueryInventoryFinishedListener() {
	   public void onQueryInventoryFinished(IabResult result, Inventory inventory)   
	   {
	      if (result.isFailure()) {
	         // handle error
	         return;
	       } else if (result.isSuccess()){
	    	   Log.d("$$$$$$$$$$$$$$$", "" + result);
	       }
	   }
	};
	
	IabHelper.OnIabPurchaseFinishedListener purchaseFinishedListener 
	   = new IabHelper.OnIabPurchaseFinishedListener() {
	   public void onIabPurchaseFinished(IabResult result, Purchase purchase) 
	   {
	      if (result.isFailure()) {
	         Log.d("ERROR_TAG", "Error purchasing: " + result);
	         return;
	      }      
	      else if (purchase.getSku().equals(SKU_TEST)) {
	         // give user access to premium content and update the UI
	    	  isPremium = purchase.getSku().equals(SKU_TEST);        
	      }
	   }

	};
	
	IabHelper.QueryInventoryFinishedListener gotInventoryListener 
	   = new IabHelper.QueryInventoryFinishedListener() {
	   public void onQueryInventoryFinished(IabResult result,
	      Inventory inventory) {

	      if (result.isFailure()) {
	        // handle error here
	      }
	      else {
	        // does the user have the premium upgrade?
	    	Log.d("$$$$$$$$$$$$$$$", "Is premium: " + isPremium);
	        // update UI accordingly
	      }
	   }
	};
 
Zuletzt bearbeitet:
Mhhh, niemand ne Idee?
 
queryFinishedListener: dort solltest du noch Premium einarbeiten, sodass auch der Kauf geladen wird, wenn man schon gekauft hat. Ich mache da bspw., wenn !result.isFailure():

(vereinfachter Auszug)
PHP:
Purchase premiumPurchase = inventory.getPurchase(SKU_PREMIUM);
mIsPremium = (premiumPurchase != null && verifyDeveloperPayload(premiumPurchase));
Hinzu kommt, warum hast du 2 mal einen QueryInventoryFinishedListener? Einer reicht. Bei deinem bereitgestellten Code wird der gotInventoryListener nicht genutzt, kann also weg.

Jedoch hat das ja grundsätzlich nichts mit dem Kaufvorgang zu tun, so weit bist du ja noch nicht.

Mögliche Fehlerpunkte:
Stimmt dein base64EncodedPublicKey?
Stimmt dein SKU_TEST wirklich mit dem in der Dev Console überein? (Ja hab ich schonmal gefragt, aber nur zur Sicherheit ^^)
 
Danke für den Hinweis, das fiel mir bei der ganzen hin und her Bastelei gar nicht mehr auf. Ich frage mal andersherum: Was muss denn in der Dev Console genau gleich sein und was muss überhaupt ausgefüllt werden, damit es funktioniert? Ich bin mir ziemlich sicher, alle Kriterien erfüllt zu haben... :-/

SKU_TEST ist definitiv richtig (da würde sonst ja auch die Meldung kommen, dass das Produkt nicht gefunden wurde) und dem base64EncodedPublicKey habe ich aus der Dev Console kopiert und aus Leerzeichen überprüft, da ist auch alles okay!
 
Zuletzt bearbeitet:
Aus der Dev Console musst du nur die SKU-ID und deinen Base64-Key übernehmen.

Sku-Id gibts unter deiner App -> In-app Products -> da steht dann die Sku-Id in Klammern deines Produkts, also bspw "App XY In-App-Product 1 (myskuid)".

Und unter deiner App -> Services & APIs findest du den Base64-Key, den du benutzen musst.


Aber das scheinst du ja alles schon gemacht zu haben.

Nur mal so, hast du in der AndroidManifest

<uses-permission android:name="com.android.vending.BILLING" /> angegeben?



Edit: Du kannst ja auch mal die SKU-Id "android.test.purchased" zum Testen nutzen, um zu sehen, ob im Ablauf schon was nicht stimmt.

Kann natürlich auch sein, dass du in so statische Antworten rein rennst, siehe Table 1: http://developer.android.com/google/play/billing/billing_testing.html#billing-testing-static
 
Zuletzt bearbeitet:
Das mit der statischen Antwort werde ich gleich mal checken. Ebenso werde ich mal die android.test.purchased probieren.

Der Rest ist definitiv korrekt konfiguriert. Danke erstmal!

Der ursprüngliche Beitrag von 12:50 Uhr wurde um 14:36 Uhr ergänzt:

also mit android.test.purchased funktioniert es problemlos. und vond en konditionen in der tabelle trifft keine der kombinationen auf meine app zu :-(
 
Zuletzt bearbeitet:
Hm erstell einfach mal ein Testprojekt oder lade die selbe App unter anderem Package-Namen hoch und teste produktiv. Kannst ja veröffentlichen und dann wieder unpublish machen (auch wenn unpublished Apps dann in deiner Dev Console nicht raus zu bekommen sind mehr).

Leider weiß ich nicht mehr, wie das bei mir am Anfang war, ob ich auch solch Testprobleme hatte. Jedenfalls gehe ich davon aus, dass - wenn mit dem android.test.purchased alles geht - du ruhig produktiv testen kannst - der Vorgang scheint ja dann i.O. zu sein.
 
Hmm, das ist ja nun echt frustrierend.

Nur noch mal zur Sicherheit:

- Lediglich APK auf dem Device und in der Dev Console müssen die gleiche Signatur haben, richtig? Es müssen nicht alle Apps in der Dev Console die gleiche Signatur haben?

- Ich installiere das aus Eclipse exportierte APK über die Shell mit adb -d install meineapp.apk
 
Jede App hat eine eigene Signatur. Wie du die App installierst sollte egal sein, wichtig ist, dass sie mit deinem Zertifikat signiert ist.
 
reneph schrieb:
Jede App hat eine eigene Signatur. Wie du die App installierst sollte egal sein, wichtig ist, dass sie mit deinem Zertifikat signiert ist.

Okay, aber über RunAs in Eclipse ja auf jeden Fall nicht, da so ja keine Signatur erstellt wird, richtig?
Hach man, das ist echt zum Durchdrehen...
 
Ich hab zwar schon 2 Jahre kein Android mehr entwickelt, aber soweit ich mich erinnere erzeugt Eclipse deine default-apk, damit du deine Apps auch testen kannst. Wenn du deine App dann richtig exportierst, mußt du deinen eigenen Key-Storage oder wie das hieß anlegen.

http://developer.android.com/tools/publishing/app-signing.html
 
Jop, genau. So hab ich es ja auch gemacht.
 

Ähnliche Themen

BerndFfm
Antworten
7
Aufrufe
809
swa00
swa00
S
  • skywalker22
2
Antworten
27
Aufrufe
777
swa00
swa00
Soljim
Antworten
8
Aufrufe
738
Soljim
Soljim
Zurück
Oben Unten