Giter Site home page Giter Site logo

akshaaatt / google-iap Goto Github PK

View Code? Open in Web Editor NEW
226.0 10.0 54.0 10.6 MB

Android Library for easing Google Play Billing to your apps with support for Subscriptions, Non-Consumable and Consumable Purchases with a beautiful sample app.

Home Page: https://play.google.com/store/apps/details?id=com.redalck.gameone

License: GNU General Public License v3.0

Kotlin 90.29% Java 9.71%
android kotlin google library billing inapppurchase 2021 iap consumables android-library

google-iap's Introduction

Google-IAP (Play Billing Library Version 6.0.1)

GitHub issues GitHub last commit GitHub issues GitHub pull requests

FeaturesDevelopmentUsageLicenseContribution


Google-IAP


ezgif-com-gif-maker-3.gif

IAP is an Android library to handle In-App purchases with minimal code.

Features

  • Written in Kotlin
  • No boilerplate code
  • Easy initialization
  • Supports InApp & Subscription products
  • Simple configuration for consumable products

Gradle Dependency

  • Add the JitPack repository to your project's build.gradle file
allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}
  • Add the dependency in your app's build.gradle file
dependencies {
    implementation 'com.github.akshaaatt:Google-IAP:1.6.0'
}

Development

  • Prerequisite: Latest version of the Android Studio and SDKs on your pc.
  • Clone this repository.
  • Use the gradlew build command to build the project directly or use the IDE to run the project to your phone or the emulator.

Usage

Establishing connection with Play console

val iapConnector = IapConnector(
    context = this, // activity / context
    nonConsumableKeys = nonConsumablesList, // pass the list of non-consumables
    consumableKeys = consumablesList, // pass the list of consumables
    subscriptionKeys = subsList, // pass the list of subscriptions
    key = "LICENSE KEY", // pass your app's license key
    enableLogging = true // to enable / disable logging
)

Receiving events

iapConnector.addPurchaseListener(object : PurchaseServiceListener {
    override fun onPricesUpdated(iapKeyPrices: Map<String, DataWrappers.SkuDetails>) {
        // list of available products will be received here, so you can update UI with prices if needed
    }
    
    override fun onProductPurchased(purchaseInfo: DataWrappers.PurchaseInfo) {
        // will be triggered whenever purchase succeeded
    }
    
    override fun onProductRestored(purchaseInfo: DataWrappers.PurchaseInfo) {
        // will be triggered fetching owned products using IapConnector
    }
})

iapConnector.addSubscriptionListener(object : SubscriptionServiceListener {
    override fun onSubscriptionRestored(purchaseInfo: DataWrappers.PurchaseInfo) {
        // will be triggered upon fetching owned subscription upon initialization
    }
    
    override fun onSubscriptionPurchased(purchaseInfo: DataWrappers.PurchaseInfo) {
        // will be triggered whenever subscription succeeded
    }
    
    override fun onPricesUpdated(iapKeyPrices: Map<String, DataWrappers.SkuDetails>) {
        // list of available products will be received here, so you can update UI with prices if needed
    }
})

Making a purchase

iapConnector.purchase(this, "<sku>")

Making a subscription

iapConnector.subscribe(this, "<sku>")

Removing a subscription

iapConnector.unsubscribe(this, "<sku>")

Sample App

  • Add your products to the developer console

  • Replace the key with your App's License Key

Apps Using this Library

License

This Project is licensed under the GPL version 3 or later.

Contribution

You are most welcome to contribute to this project!

google-iap's People

Contributors

a7madkaddour avatar adrcotfas avatar akshaaatt avatar amarilindra avatar artsimonyan23 avatar dependabot[bot] avatar kf99916 avatar mrz07 avatar skaldebane avatar timfuzail avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

google-iap's Issues

Just after adding "implementation 'com.github.akshaaatt:Google-IAP:1.0.5", building failed.

implementation 'com.github.akshaaatt:Google-IAP:1.0.5
or
implementation 'com.github.akshaaatt:Google-IAP:1.0.6

error:
Runtime JAR files in the classpath should have the same version. These files were found in the classpath:
C:/Users/Administrator/.gradle/caches/transforms-2/files-2.1/96c8c5d7c1e5ca87e67af706227dbbb3/jetified-kotlin-stdlib-jdk8-1.3.72.jar (version 1.3)
C:/Users/Administrator/.gradle/caches/transforms-2/files-2.1/1d35d82fe6aa6f9d45a3881db262460b/jetified-kotlin-stdlib-jdk7-1.4.31.jar (version 1.4)
C:/Users/Administrator/.gradle/caches/transforms-2/files-2.1/8609a778c58b5aa635e98ada99641c90/jetified-kotlin-stdlib-1.4.31.jar (version 1.4)
C:/Users/Administrator/.gradle/caches/transforms-2/files-2.1/5f1db97a87cfe304c27dc9b271d9322b/jetified-kotlin-stdlib-common-1.4.31.jar (version 1.4)

No matter what I do(clean the project, clean .gradle, change kotlinversion), it does't work.
If I delete the implementation, everything goes well.

How to handle PENDING purchases?

How can we handle pending purchases?
As far as I understand iapConnector.getAllPurchases(); will call onProductsPurchased listener and there we can check if the purchase was successful or not, but calling getAllPurchases(); always crash under NPE
Is there a way to get the status of the purchase (accepted or declined)?

Library interface does not provide essential callbacks

The user of the library will receive a callback when a purchase is made but this does not mean that the purchase will succeed acknowledgement.

Another essential callback, in my opinion, would be for the finished billing setup event so the library user can know when to unlock certain logic to allow purchases or notify the user of errors.

Call the onProductsPurchased event even if the user hasn't bought anything

Sorry for my english.
My task is to check if the user has bought the product.

My idea is to request all the purchases made, and if there is no desired purchase in the list, then assume that the user did not make it.
But, after calling getAllPurchases, onProductsPurchased is not called.
I was expecting to get an empty list.

Please make it possible to receive an empty list.
As an option, add the check function IapConnector.isSubscribed(sku);

I wrote code like this:

@Override
protected void onCreate(Bundle savedInstanceState) {
        mIapConnector = new IapConnector(this, InAppConstants.LICENSE_KEY)
                .setSubscriptionIds(InAppConstants.getSubscriptionsList());
        mIapConnector.setOnInAppEventsListener(new InAppEventsListener() {
            @Override
            public void onSubscriptionsFetched(List<DataWrappers.SkuInfo> list) {
               //   after IapConnector loading I need check if user subscription
               //   I call getAllPurchases to show user purchases
               mIapConnector.getAllPurchases();
            }

            @Override
            public void onProductsPurchased(List<DataWrappers.PurchaseInfo> list) {
               //   not called if there are no purchases
               boolean subscribedPremium = list.stream().anyMatch(a -> a.getSku().equals(InAppConstants.SKU_SUBSCRIBE_PREMIUM_ONE_YEAR));
             
            }
            @Override public void onInAppProductsFetched(List<DataWrappers.SkuInfo> list) { }
            @Override public void onPurchaseAcknowledged(DataWrappers.PurchaseInfo info) {  }
            @Override public void onError(IapConnector iapConnector, DataWrappers.BillingResponse billingResponse) { }
        });
        mIapConnector.connect();
}

Add onError listener

This library should have an error listener to inform both users when something happens and developers to take proper actions.

Purchased Item not consumed immediately

Whenever I purchase an item that is part of the consumable keys list, it is not beein processed correctly. onProductPurchased is not beeing called until I try to buy the item again. The Google Play Dialog then says "Product already owned" and in this exact second onProductPurchased is beeing called and the item previously purchased is consumed, so that I can buy it again.
I really hope this can be fixed.

[Question] Check if the purchase was successful

How to check if the purchase was successful?

Is something like this?

override fun onProductsPurchased(purchases: List<DataWrappers.PurchaseInfo>) {

                if (fetchedSkuDetailsList.find { it.sku == "android.test.purchased" } != null) {
                    //purchase was successful
                }
            }

Can we have the sample code in java as well?

Thanks for the hard work put on this..
its really helpful for many people if the sample implementation is done in java too as people looks for library like this are old school developers and not professionals. (like me :))
Many people are using anjlib, as there is no update from them on billing lib 3, people looking for alternative. this library really has potential.. Also try to ad some keywords in the title all description like billing library 3 , in-app purchase , subscription etc. etc. so that It will be easy to find the library.

How to get Price and Currency Symbol Separately?

onPricesUpdated send iapKeyPrices: Map<String, String> which contains the list of SKUs and their price.

Currently, the price is a String Eg: Rs. 300.00
Is it possible to get "Rs" (String) and "300.00" (Double) separately?

Use case: We'll be running seasonal discounts and it is important to get the price (Double) to calculate the price difference.

error: buy. Google billing service is not ready yet.

I followed the java example in the documentation using version 1.1.7.

The problem is that when I call iapConnector.purchase(), nothing happens.
Only one line is printed in logcat: "error: buy. Google billing service is not ready yet."

I have activated Google Play Services on AVD and completed the google account login.
I tested it with a real device too, but it was the same.

License key and product_id are already registered in development console and string.xml.
I couldn't find any clues that could be the problem.

It's probably similar to the following issue. #42

Thanks.

Google auto refund all orders after 3 days

I recently integrated your library to my app. I follow your guide, but after 3 days. Google auto refunded all of user's orders (All are non comsumable items). Anything I need to add?
Thanks for your respond.
Details of integration as below:
1. Add dependency library:
implementation 'com.github.akshaaatt:Google-IAP:1.1.7'
2. In the main code:
String key = "";
List nonConsumablesList = Arrays.asList("item_1", "item_2", "item_3");
List consumablesList = Collections.emptyList();
List subsList = Collections.emptyList();

    iapConnector = new IapConnector(
            this,
            nonConsumablesList,
            consumablesList,
            subsList,
            key,
            true
    );
    iapConnector.addPurchaseListener(new PurchaseServiceListener() {
        public void onPricesUpdated(Map iapKeyPrices) {

        }

        public void onProductPurchased(DataWrappers.PurchaseInfo purchaseInfo) {
            if (purchaseInfo.getSku().equals("item_1")) {
                //enable feature of item_1
            }
            else if (purchaseInfo.getSku().equals("item_2")) {
                //enable feature of item_2
            }
            else if (purchaseInfo.getSku().equals("item_3")) {
                 //enable feature of item_3
            }
        }

        public void onProductRestored(DataWrappers.PurchaseInfo purchaseInfo) {

        }
    });

Restore Purchases

Sorry bad English

I'm just learning please help me

how to add functionality to this code

public void onProductRestored (@nullable String sku) {

        }
    });

What is consumable and nonConsumable Keys?

Hi,

I have product purchase key(example "1") then what should be the value of these Lists:-

List<String> nonConsumablesList = Collections.singletonList("lifetime");
        List<String> consumablesList = Arrays.asList("base", "moderate", "quite", "plenty", "yearly");
        List<String> subsList = Collections.singletonList("subscription");

How can I define that?

Bug: older purchases are not restored

I'm testing the library with an app installed on a device where the user has a non-consumable purchase already made in the past.
This purchase is not restored and onPurchasesUpdated never gets called unless I make a new purchase.
Older versions of the library did not have this issue (previous to the package name change).

Failed to resolve: com.github.akshaaatt:Google-IAP:1.2.1

Getting this issue after adding the library in the app - even though I've added the repo

repositories {
        google()
        mavenCentral()
        maven { url 'https://jitpack.io' }
    }

Logcat of Run command

FAILURE: Build completed with 7 failures.

1: Task failed with an exception.
-----------
* What went wrong:
Execution failed for task ':app:checkDebugAarMetadata'.
> Could not resolve all files for configuration ':app:debugRuntimeClasspath'.
   > Could not find com.github.akshaaatt:Google-IAP:1.2.1.
     Searched in the following locations:
       - https://dl.google.com/dl/android/maven2/com/github/akshaaatt/Google-IAP/1.2.1/Google-IAP-1.2.1.pom
       - https://repo.maven.apache.org/maven2/com/github/akshaaatt/Google-IAP/1.2.1/Google-IAP-1.2.1.pom
       - https://jcenter.bintray.com/com/github/akshaaatt/Google-IAP/1.2.1/Google-IAP-1.2.1.pom
     Required by:
         project :app

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
==============================================================================

2: Task failed with an exception.
-----------
* What went wrong:
Execution failed for task ':app:mergeDebugResources'.
> Could not resolve all files for configuration ':app:debugRuntimeClasspath'.
   > Could not find com.github.akshaaatt:Google-IAP:1.2.1.
     Searched in the following locations:
       - https://dl.google.com/dl/android/maven2/com/github/akshaaatt/Google-IAP/1.2.1/Google-IAP-1.2.1.pom
       - https://repo.maven.apache.org/maven2/com/github/akshaaatt/Google-IAP/1.2.1/Google-IAP-1.2.1.pom
       - https://jcenter.bintray.com/com/github/akshaaatt/Google-IAP/1.2.1/Google-IAP-1.2.1.pom
     Required by:
         project :app

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
==============================================================================

3: Task failed with an exception.
-----------
* What went wrong:
Execution failed for task ':app:processDebugMainManifest'.
> Could not resolve all files for configuration ':app:debugRuntimeClasspath'.
   > Could not find com.github.akshaaatt:Google-IAP:1.2.1.
     Searched in the following locations:
       - https://dl.google.com/dl/android/maven2/com/github/akshaaatt/Google-IAP/1.2.1/Google-IAP-1.2.1.pom
       - https://repo.maven.apache.org/maven2/com/github/akshaaatt/Google-IAP/1.2.1/Google-IAP-1.2.1.pom
       - https://jcenter.bintray.com/com/github/akshaaatt/Google-IAP/1.2.1/Google-IAP-1.2.1.pom
     Required by:
         project :app

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
==============================================================================

4: Task failed with an exception.
-----------
* What went wrong:
Execution failed for task ':app:mergeDebugAssets'.
> Could not resolve all files for configuration ':app:debugRuntimeClasspath'.
   > Could not find com.github.akshaaatt:Google-IAP:1.2.1.
     Searched in the following locations:
       - https://dl.google.com/dl/android/maven2/com/github/akshaaatt/Google-IAP/1.2.1/Google-IAP-1.2.1.pom
       - https://repo.maven.apache.org/maven2/com/github/akshaaatt/Google-IAP/1.2.1/Google-IAP-1.2.1.pom
       - https://jcenter.bintray.com/com/github/akshaaatt/Google-IAP/1.2.1/Google-IAP-1.2.1.pom
     Required by:
         project :app

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
==============================================================================

5: Task failed with an exception.
-----------
* What went wrong:
Execution failed for task ':app:checkDebugDuplicateClasses'.
> Could not resolve all files for configuration ':app:debugRuntimeClasspath'.
   > Could not find com.github.akshaaatt:Google-IAP:1.2.1.
     Searched in the following locations:
       - https://dl.google.com/dl/android/maven2/com/github/akshaaatt/Google-IAP/1.2.1/Google-IAP-1.2.1.pom
       - https://repo.maven.apache.org/maven2/com/github/akshaaatt/Google-IAP/1.2.1/Google-IAP-1.2.1.pom
       - https://jcenter.bintray.com/com/github/akshaaatt/Google-IAP/1.2.1/Google-IAP-1.2.1.pom
     Required by:
         project :app

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
==============================================================================

6: Task failed with an exception.
-----------
* What went wrong:
Execution failed for task ':app:desugarDebugFileDependencies'.
> Could not resolve all files for configuration ':app:debugRuntimeClasspath'.
   > Could not find com.github.akshaaatt:Google-IAP:1.2.1.
     Searched in the following locations:
       - https://dl.google.com/dl/android/maven2/com/github/akshaaatt/Google-IAP/1.2.1/Google-IAP-1.2.1.pom
       - https://repo.maven.apache.org/maven2/com/github/akshaaatt/Google-IAP/1.2.1/Google-IAP-1.2.1.pom
       - https://jcenter.bintray.com/com/github/akshaaatt/Google-IAP/1.2.1/Google-IAP-1.2.1.pom
     Required by:
         project :app

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
==============================================================================

7: Task failed with an exception.
-----------
* What went wrong:
Execution failed for task ':app:mergeDebugNativeLibs'.
> Could not resolve all files for configuration ':app:debugRuntimeClasspath'.
   > Could not find com.github.akshaaatt:Google-IAP:1.2.1.
     Searched in the following locations:
       - https://dl.google.com/dl/android/maven2/com/github/akshaaatt/Google-IAP/1.2.1/Google-IAP-1.2.1.pom
       - https://repo.maven.apache.org/maven2/com/github/akshaaatt/Google-IAP/1.2.1/Google-IAP-1.2.1.pom
       - https://jcenter.bintray.com/com/github/akshaaatt/Google-IAP/1.2.1/Google-IAP-1.2.1.pom
     Required by:
         project :app

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
==============================================================================

* Get more help at https://help.gradle.org

Deprecated Gradle features were used in this build, making it incompatible with Gradle 8.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/7.0.2/userguide/command_line_interface.html#sec:command_line_warnings

BUILD FAILED in 3s
19 actionable tasks: 7 executed, 12 up-to-date

Several basic Issues and complaints

A lose, unsorted lists or problems and missed expectations:

  • DataWrappers.BillingResponse.responseCode default code is Google's OK code (0) when it shouldn't be any of Google's codes for wrapper errors
  • No constant error codes, for wrapper errors. I would have to look into your source to find "Products not fetched" to String.equal() with and to know I must call something else first and when to check the int code and when to test the String.
  • Wrong errors: I can't call something else. "Products not fetched" means Billing is not available at all, failed to connect, the init SKUs are unknown, or connect() query() is simply not yet done.
  • Missing subscription support is hidden: this will cause NPEs or fail silently on purchase attempts. There is no public isSubSupported() method.
  • Hiding errors: BILLING_UNAVAILABLE and other connection errors should trigger listener.onError()
  • Hiding errors: iapClient.launchBillingFlow() returned response is ignored, silently. I never get a callback if the flow doesn't start.
  • NPE: calling makePurchase() with an unknown sku
  • NPE: getAllPurchases()if client is not ready
  • enabling autoAcknoledge will also autoConsume
  • naming: getAllPurchases() doesn't return purchases, inAppEventsListener?.onProductsPurchased(validPurchases) will be called. It is more a query than a get.
  • lost service connections are ignored or crash, disconnected -> connect is async so there might not currently be a connection
  • no access to use backend server purchase validation
  • it doesn't look robust: a lot of real fringe cases are ignored, like new or removed SKUs after app release and start. I expect my app not to crash for users if I add or remove an SKU in the Play Console.
  • no helpful "hint" exceptions for programming errors.
    • i.e. setSubscriptionIds() could throw IllegalArgument if I use an empty list instead of telling me later querySku failed
    • iapClient.launchBillingFlow() could tell me I never requested that SKU in setSubscriptionIds() instead of failing silently

iapConnector?.purchase does not working

Hi bro!! Please help me!!! iapConnector?.purchase(this@MainActivity, product_id_key) doesn't show anything. My project is waiting review version testing, I filled in the correct input permission license key and product_id. Please explain is it a bug or is it because the app is not published yet so it doesn't show anything??

What about Test purchases?

I didn't find anything related to testing purchases why is it directly charges from me instead of test purchases.

OnProductRestore

OnProductRestore must be called on once and must give list of own purchases instead of calling it multiple times.

this will allow us to restore purchases on SplashScreen and move to main screen when triggered once.

Issue with Acknowledgment and Payments are getting cancelled

There was a method in your old build to auto acknowledge the purchase which was not working but now in your current build it's not present publicly and purchases are still being canceled as well after some time for not acknowledging.

I think you got a fix lots of things and should update your documentation as well because you had done lots of changes.

Screenshot 2021-04-21 170833

Subscription transaction details

Hi..
Will a method be added that returns purchase information as a result of the purchase?
Example... SubsId,purchaseToken and another sku details..

onProductPurchased not called immediately (for consumable SKUs)

Hey there. The event onProductPurchased() is not being triggered (immediately) on completion of a consumable SKU. It's only called when I reopen the app.

iapConnector = new IapConnector(this, Collections.emptyList(), consumableSKUs, subscriptionSKUs, key, true);

iapConnector.addPurchaseListener(new PurchaseServiceListener() {
	@Override
	public void onProductPurchased(@NotNull DataWrappers.PurchaseInfo purchaseInfo) {
		thankUser();
	}

	@Override
	public void onProductRestored(@NotNull DataWrappers.PurchaseInfo purchaseInfo) {
	}

	@Override
	public void onPricesUpdated(@NotNull Map<String, String> map) {
		updatePrices(map);
	}
});

About onPricesUpdated

1、Why named as prices updated?but actually it's not like $1 to $2, I think it should be named as onPricesFetched
2、The method onPricesUpdated is called 3 times when the view created.
3、The old interface onInAppProductsFetched and onInAppProductsFetched's param : skuDetailsList should be needed, not only the price.For example : description.

Bug: refunded and removed entitlement IAP appear as purchased

I was testing the refund with removing the entitlement which should remove access to the non-consumable IAPs but I see this is not the case.

iapConnector.setOnInAppEventsListener(object : InAppEventsListener {
            override fun onInAppProductsFetched(skuDetailsList: List<DataWrappers.SkuInfo>) {
                // I see that this will call queryPurchases, processPurchases and then inAppEventsListener.onProductsPurchased
                // so I assumed this is the way to go to restore previous purchases for users re-installing the app 
                iapConnector.getAllPurchases()
            }
            override fun onProductsPurchased(purchases: List<DataWrappers.PurchaseInfo>) {
                // Here, a previous purchased product but refunded still appears in the list (unexpected)
                // For a different account which did not purchase the IAP in the first place, this is not called (expected)
            }
            ...
})

How to get transaction details?

Hi,

I want to get transaction details like what I have purchased earlier like this:-

TransactionDetails transactionDetails = bp.getPurchaseTransactionDetails("1");
if (transactionDetails != null){
    prefManager.setString("orderId", transactionDetails.purchaseInfo.purchaseData.orderId);
}

I want to know that I have already purchased that product or not?

Error reporting is not working.

when you are getting any error the error reporting is nowhere reported back to the activity and in that case we never know what was the error. if there is a way then please let me know how i can get errors reported back to the activity.

Update Subscriptions

Implement the method to Downgrade/Upgrade current subscriptions.

fun updateSubscription (activity: Activity, oldSku: String, purchaseTokenOfOriginalSubscription: String,sku: String) { val flowParams = BillingFlowParams.newBuilder() .setOldSku(oldSku, purchaseTokenOfOriginalSubscription) .setReplaceSkusProrationMode(IMMEDIATE_WITHOUT_PRORATION) .setSkuDetails(fetchedSkuDetailsList.find { it.sku == sku }!!) .build(); val responseCode = iapClient.launchBillingFlow(activity, flowParams) }

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.