GithubHelp home page GithubHelp logo

laravel / cashier-stripe Goto Github PK

View Code? Open in Web Editor NEW
2.3K 75.0 656.0 46.7 MB

Laravel Cashier provides an expressive, fluent interface to Stripe's subscription billing services.

Home Page: https://laravel.com/docs/billing

License: MIT License

PHP 92.51% Blade 7.49%
laravel stripe billing

cashier-stripe's Introduction

Logo Laravel Cashier Stripe

Build Status Total Downloads Latest Stable Version License

Introduction

Laravel Cashier provides an expressive, fluent interface to Stripe's subscription billing services. It handles almost all of the boilerplate subscription billing code you are dreading writing. In addition to basic subscription management, Cashier can handle coupons, swapping subscription, subscription "quantities", cancellation grace periods, and even generate invoice PDFs.

Official Documentation

Documentation for Cashier can be found on the Laravel website.

Contributing

Thank you for considering contributing to Cashier! You can read the contribution guide here.

Code of Conduct

In order to ensure that the Laravel community is welcoming to all, please review and abide by the Code of Conduct.

Security Vulnerabilities

Please review our security policy on how to report security vulnerabilities.

License

Laravel Cashier is open-sourced software licensed under the MIT license.

cashier-stripe's People

Contributors

beeseenmedia avatar benjamindoe avatar cityzen avatar djug avatar driesvints avatar francismori7 avatar ghostprofile avatar grahamcampbell avatar josiasmontag avatar jubeki avatar judahnator avatar keithbrink avatar kyranb avatar laurencei avatar lnpbk avatar lucasmichot avatar lyrisbee avatar mcordingley avatar mlantz avatar mmachatschek avatar nunomaduro avatar repox avatar ryannielson avatar ryross avatar sdebacker avatar sebdesign avatar stylecibot avatar taylorotwell avatar themsaid avatar timacdonald 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  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

cashier-stripe's Issues

[Docs] Confusion over trial being set auto vs. manually

In looking at the docs about the trial end date being written to the User table:

If your plan includes a trial, the trial end date will also automatically be set on the user record.

If your plan has a trial period, make sure to set the trial end date on your model after subscribing:

The first paragraph makes it sound like the trial period will be sourced from Stripe and automatically set, however, the immediate next paragraph sounds like it needs to be set manually. Based on looking at code, it seems the second paragraph is more accurate. Will be happy to submit a PR to clean it up, but was hoping for confirmation.

Am I correct here or am I missing something?

Downloading Invoices with IE11

So I was testing the download invoices function in my test browsers and noticed that IE is seemingly ignoring the content-type and downloading the invoice as a file without extension. Chrome seems to be smart enough to add the .pdf. I can't seem to pinpoint whether or not the .pdf extension is actually added in the code, but I'm guessing it probably should be?

Existing Customers Coupon Problem

For the case of existing customers, when a new subscription is being created with a coupon like so:

$user->subscription('sub')
    ->withCoupon('code')
    ->create($token->id, false, $customer)

The subscription is created but charged at full price, however, the next invoice is set at the correct discounted value. Not sure why that would be. Perhaps the coupon is being applied in the wrong order when it's an existing customer?

subscription()->cancel() throws Exception

I'm using dev-master to pull in Cashier, and when I try to cancel the subscription using
$user->subscription()->cancel() I get:

Symfony \ Component \ Debug \ Exception \ FatalErrorException
Call to a member function cancel() on a non-object

I also tried the cancelNow(), but not working.

Just note that when I use ~1.0 for Cashier, this works, but doesn't update subscription_ends_at field in the database.

Test for cashier:table command?

I'm being totally selfish here and "stealing" bits of how Cashier works for my own (unrelated) package, including the artisan command to add required fields to a table.

I'd love to be able to test that the command works, and was hoping you'd already done the hard work for me. :) Any suggestions on how one would test this?

PDF won't open

Hey,

I'm trying to generate invoice PDF's and I've setup a controller method like so:

public function downloadInvoice($invoice_id) 
{
    if(Auth::check())
    {
        return Auth::user()->downloadInvoice($invoice_id, [
            'vendor' => 'Motion Array',
            'product' => Auth::user()->stripe_plan
        ]);
    }

    return 'Invalid invoice ID.';
}

I get a PDF however I can't open it. If I change the file extension to .html it works.

Has anyone else encountered this issue?

Extending Failed Payment Handling

I need to change other values in my database when failed payments happen. Can this be accomplished by extending the WebHookController and listening for the same event?

cancel vs cancelAtPeriodEnd

Looking through the StripeGateway, it appears that cancel() and cancelAtPeriodEnd() do the same thing except that cancelAtPeriodEnd() cancels a subscription at the end of the period on the stripe side only.

Should cancel() with $atPeriodEnd = false be canceling the subscription immediately on the local database to match stripe's database?

This may also allow for an additional method of cancelWithRefund() in which the subscription is canceled immediately and a refund is returned with a prorated rate for the remainder of the subscription.

/**
 * Cancel the billable entity's subscription.
 *
 * @return void
 */
public function cancel($atPeriodEnd = false)
{
    $customer = $this->getStripeCustomer();

    if ($customer->subscription)
    {
        $this->billable->setSubscriptionEndDate(
            Carbon::createFromTimestamp($this->getSubscriptionEndTimestamp($customer))
        );
    }

    $customer->cancelSubscription(['at_period_end' => $atPeriodEnd]);

    $this->billable->setStripeIsActive(false)->saveBillableInstance();
}

/**
 * Cancel the billable entity's subscription at the end of the period.
 *
 * @return void
 */
public function cancelAtEndOfPeriod()
{
    return $this->cancel(true);
}

Invoices declaration must be compatible with Interface.

I'm having an issue. It's only showing me this error on an environment running PHP 5.4

Declaration of Laravel\Cashier\BillableTrait::invoices($parameters = Array) must be compatible with Laravel\Cashier\BillableInterface::invoices()

It seems like the BillableTrait defines invoices as

public function invoices($parameters = array())
{
    return $this->subscription()->invoices(false, $parameters);
}

and the BillableInterface defines the function as

public function invoices();

Any help?

Secure Invoices

Right now, if a user requests a different invoice from another account, they're able to download it. This should be secured via the API to ensure that the customer has access to said invoice.

Can't create and then subscribe user

When I create a new user then try to assign a subscription() to that user (or any existing user) the data is being sent to Stripe appropriately. I can see the customer id, plan chosen, etc... but my Stripe database columns do not get updated.

When I remove the code to create() a user and just subscribe an existing user, the data persists to the database like it should. It only doesn't work after I've created a new user THEN try to subscribe any user.

When I dump the DB queries, there are none that try to insert Stripe data into the users table. However when I remove the create() line, the queries are shown and data is persisted as it should.

$user = $this->userModel->create($input);

if ($user->hasErrors()) {
    throw new \Exception($user->getErrors());
}

$this->createStripeSubscription($user->id, $input['creditCardToken']);

...

private function createStripeSubscription($user_id, $token) {
    //$this->userModel->find(1)->subscription('monthly')->create($token); // Doesn't work either
    $this->userModel->find($user_id)->subscription('monthly')->create($token);
}

SagePay Support?

Would there be SagePay support? Of a GatewayInterface so that I can make my own gateway instead of using Stripe.

problem with subscription_ends_at

Hi there,
is it normal that subscription_ends_at is always set to null? (even after calling the ubscription()->cancelAtEndOfPeriod() method)

thanks

Pagination on invoice results

I would think this would be very useful if a single user does (hopefully) stay on a subscription for more than say 10 months to a year. Any thoughts?

Upgrading Plan: the default type of Invoice Items is "invoiceitem" ?

Hi, I just found that when upgrading a plan, the invoice item type is not set correctly (should be subscription rather than invoiceitem)

data: [ { id: ******, object: "line_item", type: "invoiceitem", ... plan: {interval: "year", ...

So when I download an invoice, __ in receipt.blade.php is never be displayed. Instead, __ will be showing.

$user->updateCard($token) throws exception

If you call updateCard on a valid stripe customer you will get the following exception :

exception 'BadMethodCallException' with message 'Call to undefined method Illuminate\Database\Query\Builder::updateCard()' in /Users/XXXX/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php:1953

If you instead try $user->subscription()->updateCard($token) you receive the following exception :

exception 'ErrorException' with message 'Trying to get property of non-object' in /Users/XXXX/vendor/laravel/cashier/src/Laravel/Cashier/StripeGateway.php:334

Downloading invoice without PhantomJS returns a .pdf file with HTML contents

Hi Taylor,

Great work on Cashier.

When I call $user->downloadInvoice() and I don't have PhantomJS running on the server, I simply get the HTML invoice with a .pdf extension.

Would it be worth throwing an exception for this case?

Similarly, in the docs, there is no mention of requiring PhantomJS. Is this something I should add in through a PR?

Support Latest Stripe API

Any chance that we can get this updated to support the latest version of the Stripe API? Anyone new with Stripe and coming to use this library won't be able to at present.

file_put_contents() error on downloadInvoice()

I am receiving this error when I try to download an invoice:
file_put_contents(.../vendor/laravel/cashier/src/Laravel/Cashier/work/f19ea7e343e326a1fe7e3763227619dd.pdf): failed to open stream: Permission denied

Does this not use the standard storage location?

Canceling Subscription Not Working Properly

From what I've tried, it seems like the cancel subscription method isn't working properly.
If I call a

$user->subscription()->cancel();

the documentation claims it should cancel the subscription at the end of the period. However, this actually cancels the subscription immediately.

After digging through the code, I found that there was actually another method that can be called that will delay the canceling of the subscription until the end of the period:

$user->subscription()->cancelAtEndOfPeriod();

Running this does correctly delay the cancellation of the subscription to the end of the period in Stripe, but instead of setting a subscription_ends_at value in the Laravel application, it just sets stripe_active to 0 and leaves the ends_at value null.

documentation error with cancel and resume

Currently the cancel method sets $atPeriodEnd = false by default. If you resume a subscription before the end date, it will charge the card again. In order to ensure it does not charge again, you have to pass true to cancel:

$user->subscription->cancel(true);

It makes sense to me to change the $atPeriodEnd to true in the cancel method in StripeGateway since that seems like it would be the default behavior. Happy to edit and make pull request unless you had a reason for defaulting it to false?

Validation on the users table causes things to fail

As this is being touted as an add-on, I would think that there shouldn't be a lot of workaround to make this function properly.
That being said having to specifically clear static validation rules, seems like a large workaround just to be able to manipulate the subscriptions data.
This really should not be in the users table, as another comment mentioned (#40), but not for the reason of supporting multiple subscriptions, but instead to have a separate table to avoid these unnecessary workarounds.
Having to mess around with validation rules and workaround already in place work is ludicrous for an add-on. That being said, as I am actively developing with it, I would be more than happy to help make this a reality with PR's and the like.

Error getting Last 4 when no card is provided

When I create a subscription without a card provided an error is encountered when trying to get the last 4 digits to set the local data. Is this a bug or am I missing how to create the subscription without the card?

Unrecognized request URL (GET: /v1/customers/{my_customer_id}/cards/). Please see https://stripe.com/docs or we can help at https://support.stripe.com/.

The code I am using to create the subscription is:

$user->subscription( '25' )->create( null, array('description' => $company->name ) );

[2014-05-31 15:38:56] local.ERROR: exception 'Stripe_InvalidRequestError' with message 'Unrecognized request URL (GET: /v1/customers/{my_customer_id}/cards/). Please see https://stripe.com/docs or we can help at https://support.stripe.com/.' in /data/www/projects.dev/vendor/stripe/stripe-php/lib/Stripe/ApiRequestor.php:152 Stack trace: #0 /data/www/projects.dev/vendor/stripe/stripe-php/lib/Stripe/ApiRequestor.php(212): Stripe_ApiRequestor->handleApiError('{? "error": {?...', 404, Array) #1 /data/www/projects.dev/vendor/stripe/stripe-php/lib/Stripe/ApiRequestor.php(114): Stripe_ApiRequestor->_interpretResponse('{? "error": {?...', 404) #2 /data/www/projects.dev/vendor/stripe/stripe-php/lib/Stripe/List.php(33): Stripe_ApiRequestor->request('get', '/v1/customers/c...', NULL) #3 /data/www/projects.dev/vendor/laravel/cashier/src/Laravel/Cashier/StripeGateway.php(525): Stripe_List->retrieve(NULL) #4 /data/www/projects.dev/vendor/laravel/cashier/src/Laravel/Cashier/StripeGateway.php(465): Laravel\Cashier\StripeGateway->getLastFourCardDigits(Object(Laravel\Cashier\Customer)) #5 /data/www/projects.dev/vendor/laravel/cashier/src/Laravel/Cashier/StripeGateway.php(106): Laravel\Cashier\StripeGateway->updateLocalStripeData(Object(Laravel\Cashier\Customer)) #6 /data/www/projects.dev/app/controllers/RegisterController.php(73): Laravel\Cashier\StripeGateway->create(NULL, Array) #7 [internal function]: RegisterController->store() #8 /data/www/projects.dev/vendor/laravel/framework/src/Illuminate/Routing/Controller.php(231): call_user_func_array(Array, Array) #9 /data/www/projects.dev/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(93): Illuminate\Routing\Controller->callAction('store', Array) #10 /data/www/projects.dev/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(62): Illuminate\Routing\ControllerDispatcher->call(Object(RegisterController), Object(Illuminate\Routing\Route), 'store') #11 /data/www/projects.dev/vendor/laravel/framework/src/Illuminate/Routing/Router.php(934): Illuminate\Routing\ControllerDispatcher->dispatch(Object(Illuminate\Routing\Route), Object(Illuminate\Http\Request), 'RegisterControl...', 'store') #12 [internal function]: Illuminate\Routing\Router->Illuminate\Routing{closure}() #13 /data/www/projects.dev/vendor/laravel/framework/src/Illuminate/Routing/Route.php(105): call_user_func_array(Object(Closure), Array) #14 /data/www/projects.dev/vendor/laravel/framework/src/Illuminate/Routing/Router.php(1000): Illuminate\Routing\Route->run(Object(Illuminate\Http\Request)) #15 /data/www/projects.dev/vendor/laravel/framework/src/Illuminate/Routing/Router.php(968): Illuminate\Routing\Router->dispatchToRoute(Object(Illuminate\Http\Request)) #16 /data/www/projects.dev/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(738): Illuminate\Routing\Router->dispatch(Object(Illuminate\Http\Request)) #17 /data/www/projects.dev/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(708): Illuminate\Foundation\Application->dispatch(Object(Illuminate\Http\Request)) #18 /data/www/projects.dev/vendor/barryvdh/laravel-debugbar/src/Barryvdh/Debugbar/Middleware.php(34): Illuminate\Foundation\Application->handle(Object(Illuminate\Http\Request), 1, true) #19 /data/www/projects.dev/vendor/laravel/framework/src/Illuminate/Http/FrameGuard.php(38): Barryvdh\Debugbar\Middleware->handle(Object(Illuminate\Http\Request), 1, true) #20 /data/www/projects.dev/vendor/laravel/framework/src/Illuminate/Session/Middleware.php(72): Illuminate\Http\FrameGuard->handle(Object(Illuminate\Http\Request), 1, true) #21 /data/www/projects.dev/vendor/laravel/framework/src/Illuminate/Cookie/Queue.php(47): Illuminate\Session\Middleware->handle(Object(Illuminate\Http\Request), 1, true) #22 /data/www/projects.dev/vendor/laravel/framework/src/Illuminate/Cookie/Guard.php(51): Illuminate\Cookie\Queue->handle(Object(Illuminate\Http\Request), 1, true) #23 /data/www/projects.dev/vendor/stack/builder/src/Stack/StackedHttpKernel.php(23): Illuminate\Cookie\Guard->handle(Object(Illuminate\Http\Request), 1, true) #24 /data/www/projects.dev/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(606): Stack\StackedHttpKernel->handle(Object(Illuminate\Http\Request)) #25 /data/www/projects.dev/public/index.php(49): Illuminate\Foundation\Application->run() #26 {main} [] []

BillableTrait typo and Bug

I think that the variable name $plane should be $plan on line 213.
Even fixing the typo doesn't fix my problem, when i do:

Auth::user()->onPlan('gold')

i checked that the user is logged in and the plan exist
the error is

Trying to get property of non-object

The problem is:

$this->subscription()->planId() == $plan;

What's the problem??

Calculate prorate amount

Is there any part of the current API which helps to calculate the prorate amount.

For example, if you are upgrading from a monthly to a yearly plan, then the difference gets paid immediately (Say, from $10 to $100), then there would be a $90 fee taken immediately. Is there a way already built in which calculates this based on Stripe plans?

Update Customer Information

Cashier now nearly has all the functionality that I've needed to use where I could stop needing to use the Stripe library. However, there is no way currently to edit customer information, or update/change their credit card. Both of these methods are a part of the Stripe API, so Cashier would just need some new classes to perform them.

The Stripe API support both updating the card information (such as the customer name) or removing and adding a new card. I suppose this would have to be taken into account when creating and naming different methods.

I'm not sure how everyone thinks the naming conventions would go for them, but it could be something along the lines of:

// Update existing card information
$user->updateCard(['name' => $user->name]);

// Create new card. 
// Bool for removing other card or setting this as default payment method?
$user->newCard($creditCardToken, true);

// Fetch the User's billing information
$user->getBillingInfo();

// Update the User's billing information
$user->updateBillingInfo(['name' => $user->name]);

These are all pretty rough proposals, but the added functionality would be great!

Downloading invoice cannot render view

When trying to download an invoice via a custom route - I am getting the constant error -

My route is something like -

Route::get('companies/invoice/{id}', array('as' => 'companies.invoice', 'uses'=>'CompaniesController@invoice'));

My controller just does the following -

public function invoice($id){
    return Auth::user()->company->downloadInvoice($id, ['vendor' => 'test', 'product' => 'test']);
}

The error returned is - No Hint path is defined for [cashier]. This is being caused at line 260 of /src/Laravel/Cashier/Invoice.php

Typically when passing a class it should not be in a string and actually passed as an object Cashier::receipt instead of 'cashier::receipt' but when trying either it still fails. The only way I was able to get this to work was to copy the receipt.blade.php file to my local views and set this function to -

return View::make('cashier.receipt', $data);

Not sure what would be the proper way to fix this but wanted to note this.

How to prettify credit card exceptions?

Hi guys,

Thanks for this great addition to Laravel. All is working perfectly well but I am struggling to figure out how to pass credit card exceptions as flash message or something similar rather than this big ugly error as it is currently now?

Cannot run cashier:table

Awesome job developing this package, guys!

I'm getting an error message in Terminal when I try to run the cashier:table command.

[RuntimeException]
Not enough arguments.

Any ideas?

301 Redirect on Webhook

I have setup stripe and Cashier and its all working fine. However I have recieved an email from Stripe with regards to 301 redirect issues. The url is setup as per instructions /stripe/webhook (no trailing slash). However this is the response I get when testing in the dashboard

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <meta http-equiv="refresh" content="1;url=https://xboxapi.com/stripe/webhook" />

        <title>Redirecting to https://xboxapi.com/stripe/webhook</title>
    </head>
    <body>
        Redirecting to <a href="https://xboxapi.com/stripe/webhook">https://xboxapi.com/stripe/webhook</a>.
    </body>
</html>

Please make new release

Hi @taylorotwell,

Are you able to please make a 2.0.4 release at 3fb0e39 so people who have required Cashier in composer as instructed in the docs ("laravel/cashier": "~2.0") can update and use the missing method.

I wondered why Stripe was still sending me emails saying my webhook was broken even after I ran composer update

Thanks

Canceled Subscription Invoices

When a subscription is active, pulling invoices works fine, but when a subscription is canceled the invoices stop showing up. Looking over BillableTrait.php i see:

/**
* Get an array of the entity's invoices.
*
* @return array
*/
public function invoices()
{
    return $this->stripeIsActive() ? $this->subscription()->invoices() : [];
}

Is there a reason why this is only returning invoices when a subscription is active? It's an easy fix, I was just wondering if there was a specific reason for this.

Thanks.

Requiring token for resuming subscription

If a user wants to resume their subscription, right now, Cashier requires a new CC token. There might be a good reason for this, but should it be optional? If Stripe already has them as a customer, then the token is unnecessary, and we should be able to just do $user->subscription('monthly')->resume(), and it will work. If that's the case, then it could be:

public function resume($token = null) {}

Maybe I'm missing a good reason why it's required, though.

[Request] Implementation or improved documentation for 'one-off' purchases

I can't see any documentation for making one-off 'shopping cart' style purchases using Cashier and I think this would be a great feature to have in the package, not everyone wants to process subscriptions and if the functionality is already available then I think improved documentation on the subject is required.

handleWebhook throwing 404 for unmanaged webhook events

Just had an email from stripe support regarding failed attempts to send a webhook. This has only started happening after i updated cashier, which would have included 0ea0d1a

It looks like we've had a bit of trouble delivering webhooks to your test webhook handler running at my webhook url. Since 2014-06-19 19:36:31 +0000, at least 5782 of the times we've attempted to deliver a webhook have failed, and none have succeeded. Looking at the most recent failure, we received an HTTP status code of 404 from your webhook URL. However, our webhook systems only treats a webhook as successful if we get back a status code between 200 and 299.

In order to reduce load on our systems, we'll stop sending webhooks to this URL if we continue to see failures after June 28. However, we'd appreciate it if you could either fix the issue or delete the webhook URL before then.

Webhook model configuration

Hi,
first of all, thanks for great work on cashier!

Im struggling with setting the billable model class for webhook handler.

I've tried Config::set('services.stripe.model', '\App\Models\User'); in global.php, but I get
Class '\App\Models\User' not found when handling webhook, where I use
$user = $this->getBillable($payload['data']['object']['customer']);

Am I doing something wrong?

Thanks.

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.