@Override public void install (final PurchaseObserver observer, PurchaseManagerConfig config, boolean autoFetchInformation) { this.observer = observer; this.config = config; // --- copy all available products to the list of productIdentifiers int offerSize = config.getOfferCount(); productIdentifiers = new HashSet<String>(offerSize); for (int z = 0; z < config.getOfferCount(); z++) { productIdentifiers.add(config.getOffer(z).getIdentifierForStore(storeName())); } PurchasingService.registerListener(activity.getApplicationContext(), this); // PurchasingService.IS_SANDBOX_MODE returns a boolean value. // Use this boolean value to check whether your app is running in test mode under the App Tester // or in the live production environment. showMessage(LOGTYPELOG, "Amazon IAP: sandbox mode is:" + PurchasingService.IS_SANDBOX_MODE); observer.handleInstall(); PurchasingService.getUserData(); PurchasingService.getProductData(productIdentifiers); }
@Override public void purchase (String identifier) { // Find the SKProduct for this identifier. String identifierForStore = config.getOffer(identifier).getIdentifierForStore(PurchaseManagerConfig.STORE_NAME_IOS_APPLE); SKProduct product = getProductByStoreIdentifier(identifierForStore); if (product == null) { // Product with this identifier not found: load product info first and try to purchase again log(LOGTYPELOG, "Requesting product info for " + identifierForStore); Set<String> identifierForStoreSet = new HashSet<String>(1); identifierForStoreSet.add(identifierForStore); productsRequest = new SKProductsRequest(identifierForStoreSet); productsRequest.setDelegate(new AppleProductsDelegatePurchase()); productsRequest.start(); } else { // Create a SKPayment from the product and start purchase flow log(LOGTYPELOG, "Purchasing product " + identifier + " ..."); SKPayment payment = new SKPayment(product); SKPaymentQueue.getDefaultQueue().addPayment(payment); } }
@Override public void install(final PurchaseObserver observer, final PurchaseManagerConfig purchaseManagerConfig, final boolean autoFetchInformation) { this.observer = observer; this.purchaseManagerConfig = purchaseManagerConfig; if (googleInAppBillingService.isListeningForConnections()) { // Supports calling me multiple times. // TODO: scenario not unit tested, test this! googleInAppBillingService.disconnect(); } googleInAppBillingService.requestConnect(new ConnectionListener() { @Override public void connected() { onServiceConnected(observer, autoFetchInformation); } @Override public void disconnected(GdxPayException exception) { observer.handleInstallError(new GdxPayException("Failed to bind to service", exception)); } }); }
public static Transaction convertJSONPurchaseToTransaction(String inAppPurchaseData) throws JSONException { JSONObject object = new JSONObject(inAppPurchaseData); Transaction transaction = new Transaction(); transaction.setStoreName(PurchaseManagerConfig.STORE_NAME_ANDROID_GOOGLE); if (object.has(PURCHASE_TOKEN)) { transaction.setTransactionData(object.getString(PURCHASE_TOKEN)); } if (object.has(ORDER_ID)) { transaction.setOrderId(object.getString(ORDER_ID)); } transaction.setIdentifier(object.getString(PRODUCT_ID)); transaction.setPurchaseTime(new Date(object.getLong(PURCHASE_TIME))); if (object.has(PURCHASE_STATE)) { fillTransactionForPurchaseState(transaction, object.getInt(PURCHASE_STATE)); } return transaction; }
@Override protected PurchaseManagerConfig getPurchaseManagerConfig() { PurchaseManagerConfig purchaseManagerConfig = new PurchaseManagerConfig(); for (LevelPack levelPack : LevelManager.getLevelPacks()) { if (!levelPack.isFree()) { Offer offer = new Offer(); offer .setType(OfferType.ENTITLEMENT) .setIdentifier(levelPack.getGoogleSku()); offer.putIdentifierForStore( PurchaseManagerConfig.STORE_NAME_ANDROID_GOOGLE, levelPack.getGoogleSku()); purchaseManagerConfig.addOffer(offer); } } String key = PhysicsComponent.s(com.draga.shape.Circle.s( GraphicComponent.s(Circle.s) + MenuScreen.s(IngameMenuScreen.s, -3) + GraphicComponent.s(HudScreen.s) + MenuScreen.s(DeadZoneInputModifier.s, 4) + GraphicComponent.s(Joystick.s))); purchaseManagerConfig.addStoreParam( PurchaseManagerConfig.STORE_NAME_ANDROID_GOOGLE, key); return purchaseManagerConfig; }
public void setupPurchaseManager() { PurchaseSystem.onAppRestarted(); if (PurchaseSystem.hasManager()) { PurchaseManagerConfig purchaseManagerConfig = getPurchaseManagerConfig(); PurchaseSystem.install(new PurchaseObserver(), purchaseManagerConfig); } }
/** Converts a Receipt to our transaction object. */ static Transaction convertReceiptToTransaction(int i, String requestId, Receipt receipt, final UserData userData) { // build the transaction from the purchase object Transaction transaction = new Transaction(); transaction.setIdentifier(receipt.getSku()); transaction.setOrderId(receipt.getReceiptId()); transaction.setStoreName(PurchaseManagerConfig.STORE_NAME_ANDROID_AMAZON); transaction.setRequestId(requestId); transaction.setUserId(userData.getUserId()); transaction.setPurchaseTime(receipt.getPurchaseDate()); transaction.setPurchaseText("Purchased: " + receipt.getSku().toString()); // transaction.setPurchaseCost(receipt.getSku()); // TODO: GdxPay: impl. // parsing of COST + CURRENCY via skuDetails.getPrice()! // transaction.setPurchaseCostCurrency(null); if (receipt.isCanceled()) { // order has been refunded or cancelled transaction.setReversalTime(receipt.getCancelDate()); // transaction.setReversalText(receipt..getPurchaseState() == 1 ? // "Cancelled" : "Refunded"); } else { // still valid! transaction.setReversalTime(null); transaction.setReversalText(null); } transaction.setTransactionData(receipt.toJSON().toString()); // transaction.setTransactionDataSignature(purchase.getSignature()); return transaction; }
/** * @param autoFetchInformation is not used, because without product information on ios it's not possible to fill * {@link Transaction} object on successful purchase **/ @Override public void install (PurchaseObserver observer, PurchaseManagerConfig config, boolean autoFetchInformation) { this.observer = observer; this.config = config; log(LOGTYPELOG, "Installing purchase observer..."); // Check if the device is configured for purchases. if (SKPaymentQueue.canMakePayments()) { // Create string set from offer identifiers. int size = config.getOfferCount(); Set<String> productIdentifiers = new HashSet<String>(size); for (int i = 0; i < size; i++) { productIdentifiers.add(config.getOffer(i).getIdentifierForStore(PurchaseManagerConfig.STORE_NAME_IOS_APPLE)); } // Request configured offers/products. log(LOGTYPELOG, "Requesting products..."); productsRequest = new SKProductsRequest(productIdentifiers); productsRequest.setDelegate(new IosFetchProductsAndInstallDelegate()); productsRequest.start(); } else { log(LOGTYPEERROR, "Error setting up in-app-billing: Device not configured for purchases!"); observer.handleInstallError(new RuntimeException( "Error installing purchase observer: Device not configured for purchases!")); } }
/** * @param autoFetchInformation is not used, because without product information on ios it's not possible to fill * {@link Transaction} object on successful purchase **/ @Override public void install(PurchaseObserver observer, PurchaseManagerConfig config, boolean autoFetchInformation) { this.observer = observer; this.config = config; log(LOGTYPELOG, "Installing purchase observer..."); // Check if the device is configured for purchases. if (SKPaymentQueue.canMakePayments()) { // Create string set from offer identifiers. int size = config.getOfferCount(); NSMutableSet<String> productIdentifiers = (NSMutableSet<String>) NSMutableSet.alloc() .initWithCapacity(size); for (int i = 0; i < size; i++) { productIdentifiers.addObject(config.getOffer(i).getIdentifierForStore (PurchaseManagerConfig.STORE_NAME_IOS_APPLE)); } // Request configured offers/products. log(LOGTYPELOG, "Requesting products..."); productsRequest = SKProductsRequest.alloc().initWithProductIdentifiers (productIdentifiers); productsRequest.setDelegate(new IosFetchProductsAndInstallDelegate()); productsRequest.start(); } else { log(LOGTYPEERROR, "Error setting up in-app-billing: Device not configured for " + "purchases!"); observer.handleInstallError(new RuntimeException("Error installing purchase observer:" + " Device not configured for purchases!")); } }
@Override public void purchase(String identifier) { // Find the SKProduct for this identifier. Offer offer = config.getOffer(identifier); if (offer == null) { log(LOGTYPEERROR, "Invalid product identifier, " + identifier); observer.handlePurchaseError(new RuntimeException("Invalid product identifier, " + identifier)); } else { String identifierForStore = offer.getIdentifierForStore (PurchaseManagerConfig.STORE_NAME_IOS_APPLE); SKProduct product = getProductByStoreIdentifier(identifierForStore); if (product == null) { // Product with this identifier not found: load product info first and try to purchase again log(LOGTYPELOG, "Requesting product info for " + identifierForStore); NSMutableSet<String> identifierForStoreSet = (NSMutableSet<String>) NSMutableSet .alloc().initWithCapacity(1); identifierForStoreSet.addObject(identifierForStore); productsRequest = SKProductsRequest.alloc().initWithProductIdentifiers (identifierForStoreSet); productsRequest.setDelegate(new AppleProductsDelegatePurchase()); productsRequest.start(); } else { // Create a SKPayment from the product and start purchase flow log(LOGTYPELOG, "Purchasing product " + identifier + " ..."); SKPayment payment = SKPayment.paymentWithProduct(product); ((SKPaymentQueue) SKPaymentQueue.defaultQueue()).addPayment(payment); } } }
public static Transaction transactionFullEditionEuroGooglePlaySandbox() { Transaction transaction = new Transaction(); transaction.setPurchaseCostCurrency("EUR"); transaction.setPurchaseCost(100); transaction.setStoreName(PurchaseManagerConfig.STORE_NAME_ANDROID_GOOGLE); transaction.setPurchaseTime(new Date()); transaction.setIdentifier(PRODUCT_IDENTIFIER_FULL_EDITION); transaction.setTransactionData("minodojglppganfbiedlabed.AO-J1OyNtpooSraUdtKlZ_9gYs0o20ZF_0ryTNACmvaaaG5EwPX0hPruUdGbE3XejoXYCYzJA2xjjAxrDLFhmu9WC4fvTDNL-RDXCWjlHKpzLOigxCr1QhScXR8uXtX8R94iV6MmMHqD"); return transaction; }
public static PurchaseManagerConfig managerConfigGooglePlayOneOfferBuyFullEditionProduct() { PurchaseManagerConfig config = new PurchaseManagerConfig(); config.addStoreParam(STORE_NAME_ANDROID_GOOGLE, "kbiosdfjoifjkldsfjowei8rfjiwfklmujwemflksdfjmsdklfj/sdifjsdlfkjsdfksd"); config.addOffer(offerFullEditionEntitlement()); return config; }
public static PurchaseManagerConfig managerConfigGooglePlayOneOfferConsumbableProduct() { PurchaseManagerConfig config = new PurchaseManagerConfig(); config.addStoreParam(STORE_NAME_ANDROID_GOOGLE, "kbiosdfjoifjkldsfjowei8rfjiwfklmujwemflksdfjmsdklfj/sdifjsdlfkjsdfksd"); config.addOffer(offerConsumable()); return config; }
public static PurchaseManagerConfig managerConfigGooglePlayOneOfferSubscriptionProduct() { PurchaseManagerConfig config = new PurchaseManagerConfig(); config.addStoreParam(STORE_NAME_ANDROID_GOOGLE, "kbiosdfjoifjkldsfjowei8rfjiwfklmujwemflksdfjmsdklfj/sdifjsdlfkjsdfksd"); config.addOffer(offerSubscription()); return config; }
private String storeNameFromOpenIAB (String storeNameOpenIAB) { if (storeNameOpenIAB == null) { return null; } else { if (storeNameOpenIAB.equals(OpenIabHelper.NAME_GOOGLE)) { return PurchaseManagerConfig.STORE_NAME_ANDROID_GOOGLE; } else if (storeNameOpenIAB.equals(OpenIabHelper.NAME_AMAZON)) { return PurchaseManagerConfig.STORE_NAME_ANDROID_AMAZON; } else if (storeNameOpenIAB.equals(OpenIabHelper.NAME_SAMSUNG)) { return PurchaseManagerConfig.STORE_NAME_ANDROID_SAMSUNG; } else if (storeNameOpenIAB.equals(OpenIabHelper.NAME_NOKIA)) { return PurchaseManagerConfig.STORE_NAME_ANDROID_NOKIA; } else if (storeNameOpenIAB.equals(OpenIabHelper.NAME_SLIDEME)) { return PurchaseManagerConfig.STORE_NAME_ANDROID_SLIDEME; } else if (storeNameOpenIAB.equals(OpenIabHelper.NAME_APTOIDE)) { return PurchaseManagerConfig.STORE_NAME_ANDROID_APTOIDE; } else if (storeNameOpenIAB.equals(OpenIabHelper.NAME_APPLAND)) { return PurchaseManagerConfig.STORE_NAME_ANDROID_APPLAND; } else if (storeNameOpenIAB.equals(OpenIabHelper.NAME_YANDEX)) { return PurchaseManagerConfig.STORE_NAME_ANDROID_YANDEX; } else { // we should get here: the correct store should always be mapped! Log.d(TAG, "Store name could not be mapped: " + storeNameOpenIAB); return null; } } }
private String storeNameToOpenIAB (String storeName) { if (storeName == null) { return null; } else { if (storeName.equals(PurchaseManagerConfig.STORE_NAME_ANDROID_GOOGLE)) { return OpenIabHelper.NAME_GOOGLE; } else if (storeName.equals(PurchaseManagerConfig.STORE_NAME_ANDROID_AMAZON)) { return OpenIabHelper.NAME_AMAZON; } else if (storeName.equals(PurchaseManagerConfig.STORE_NAME_ANDROID_SAMSUNG)) { return OpenIabHelper.NAME_SAMSUNG; } else if (storeName.equals(PurchaseManagerConfig.STORE_NAME_ANDROID_NOKIA)) { return OpenIabHelper.NAME_NOKIA; } else if (storeName.equals(PurchaseManagerConfig.STORE_NAME_ANDROID_SLIDEME)) { return OpenIabHelper.NAME_SLIDEME; } else if (storeName.equals(PurchaseManagerConfig.STORE_NAME_ANDROID_APTOIDE)) { return OpenIabHelper.NAME_APTOIDE; } else if (storeName.equals(PurchaseManagerConfig.STORE_NAME_ANDROID_APPLAND)) { return OpenIabHelper.NAME_APPLAND; } else if (storeName.equals(PurchaseManagerConfig.STORE_NAME_ANDROID_YANDEX)) { return OpenIabHelper.NAME_YANDEX; } else { // we should get here: the correct store should always be mapped! Log.d(TAG, "Store name could not be mapped: " + storeName); return null; } } }
@Override protected PurchaseManagerConfig getPurchaseManagerConfig() { return null; }
@Override public String storeName () { return PurchaseManagerConfig.STORE_NAME_DESKTOP_APPLE; }
@Override public void install (PurchaseObserver observer, PurchaseManagerConfig config, boolean autoFetchInformation) { // TODO Auto-generated method stub }
@Override public String storeName () { return PurchaseManagerConfig.STORE_NAME_ANDROID_AMAZON; }
@Override public String storeName () { return PurchaseManagerConfig.STORE_NAME_IOS_APPLE; }
@Override public String toString () { return PurchaseManagerConfig.STORE_NAME_IOS_APPLE; // FIXME: shouldnt this be PurchaseManagerConfig.STORE_NAME_IOS_APPLE or storeName() ??!! }
@Override public String storeName () { return PurchaseManagerConfig.STORE_NAME_ANDROID_OUYA; }
@Override public void install (final PurchaseObserver observer, PurchaseManagerConfig config, boolean autoFetchInformation) { this.observer = observer; this.config = config; // Obtain applicationKey and developer ID. Pass in as follows: // ------------------------------------------------------------------------- // config.addStoreParam( // PurchaseManagerConfig.STORE_NAME_ANDROID_OUYA, // new Object[] { OUYA_DEVELOPERID_STRING, applicationKeyPathSTRING }); // ------------------------------------------------------------------------- Object[] configuration = (Object[])config.getStoreParam(storeName()); String developerID = (String)configuration[0]; applicationKeyPath = (String)configuration[1]; // store our OUYA applicationKey-Path! ouyaFacade = OuyaFacade.getInstance(); ouyaFacade.init((Context)activity, developerID); // --- copy all available products to the list of purchasables productIDList = new ArrayList<Purchasable>(config.getOfferCount()); for (int i = 0; i < config.getOfferCount(); i++) { productIDList.add(new Purchasable(config.getOffer(i).getIdentifierForStore(storeName()))); } // Create a PublicKey object from the key data downloaded from the developer portal. try { // Read in the key.der file (downloaded from the developer portal) FileHandle fHandle = Gdx.files.internal(applicationKeyPath); byte[] applicationKey = fHandle.readBytes(); X509EncodedKeySpec keySpec = new X509EncodedKeySpec(applicationKey); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); ouyaPublicKey = keyFactory.generatePublic(keySpec); showMessage(LOGTYPELOG, "succesfully created publicKey"); // ---- request the productlist --------- requestProductList(); // notify of successful initialization observer.handleInstall(); } catch (Exception e) { // notify about the problem showMessage(LOGTYPEERROR, "Problem setting up in-app billing: Unable to create encryption key"); observer.handleInstallError(new RuntimeException( "Problem setting up in-app billing: Unable to create encryption key: " + e)); } }
@Override public String storeName () { return PurchaseManagerConfig.STORE_NAME_ANDROID_GOOGLE; }
@Override public String storeName() { return PurchaseManagerConfig.STORE_NAME_GWT_GOOGLEWALLET; }
@Override public String storeName() { return PurchaseManagerConfig.STORE_NAME_IOS_APPLE; }
@Override public String toString() { return PurchaseManagerConfig.STORE_NAME_IOS_APPLE; // FIXME: shouldnt this be PurchaseManagerConfig.STORE_NAME_IOS_APPLE or storeName() ??!! }
@Override public String storeName() { return PurchaseManagerConfig.STORE_NAME_ANDROID_GOOGLE; }
protected abstract PurchaseManagerConfig getPurchaseManagerConfig();