Giter Site home page Giter Site logo

paystack-php's Introduction

paystack-php

Latest Version on Packagist Software License Build Status Coverage Status Quality Score Total Downloads

A PHP API wrapper for Paystack.

Paystack

Requirements

  • Curl 7.34.0 or more recent (Unless using Guzzle)
  • PHP 5.4.0 or more recent
  • OpenSSL v1.0.1 or more recent

Install

Via Composer

    $ composer require yabacon/paystack-php

Via download

Download a release version from the releases page. Extract, then:

    require 'path/to/src/autoload.php';

IMPORTANT

Version 2 is not compatible with version 1 code! It throws an error if there's problem error in cURL or if the Paystack API gives a false status in the response body.

Usage

Do a redirect to the authorization URL received from calling the transaction/initialize endpoint. This URL is valid for one time use, so ensure that you generate a new URL per transaction.

When the payment is successful, we will call your callback URL (as setup in your dashboard or while initializing the transaction) and return the reference sent in the first step as a query parameter.

If you use a test secret key, we will call your test callback url, otherwise, we'll call your live callback url.

0. Prerequisites

Confirm that your server can conclude a TLSv1.2 connection to Paystack's servers. Most up-to-date software have this capability. Contact your service provider for guidance if you have any SSL errors. Don't disable SSL peer verification!

1. Prepare your parameters

email and amount are the most common compulsory parameters. Do send a unique email per customer. If your customers do not provide a unique email, please devise a strategy to set one for each of them. Any of those below work fine. The amount we accept on all endpoint are in kobo and must be an integer value. For instance, to accept 456 naira, 78 kobo, please send 45678 as the amount.

2. Initialize a transaction

Initialize a transaction by calling our API.

    $paystack = new Yabacon\Paystack(SECRET_KEY);
    try
    {
      $tranx = $paystack->transaction->initialize([
        'amount'=>$amount,       // in kobo
        'email'=>$email,         // unique to customers
        'reference'=>$reference, // unique to transactions
      ]);
    } catch(\Yabacon\Paystack\Exception\ApiException $e){
      print_r($e->getResponseObject());
      die($e->getMessage());
    }

    // store transaction reference so we can query in case user never comes back
    // perhaps due to network issue
    save_last_transaction_reference($tranx->data->reference);

    // redirect to page so User can pay
    header('Location: ' . $tranx->data->authorization_url);

When the user enters their card details, Paystack will validate and charge the card. It will do all the below:

Redirect back to a callback_url set when initializing the transaction or on your dashboard at: https://dashboard.paystack.co/#/settings/developer . If neither is set, Customers see a Transaction was successful message.

Send a charge.success event to your Webhook URL set at: https://dashboard.paystack.co/#/settings/developer

If receipts are not turned off, an HTML receipt will be sent to the customer's email.

Before you give value to the customer, please make a server-side call to our verification endpoint to confirm the status and properties of the transaction.

3. Handle charge.success Event

We will post a charge.success event to the webhook URL set for your transaction's domain. If it was a live transaction, we will post to your live webhook url and vice-versa.

  • if using .htaccess, remember to add the trailing / to the url you set.
  • Do a test post to your URL and ensure the script gets the post body.
  • Publicly available url (http://localhost cannot receive!)
    // Retrieve the request's body and parse it as JSON
    $event = Yabacon\Paystack\Event::capture();
    http_response_code(200);

    /* It is a important to log all events received. Add code *
     * here to log the signature and body to db or file       */
    openlog('MyPaystackEvents', LOG_CONS | LOG_NDELAY | LOG_PID, LOG_USER | LOG_PERROR);
    syslog(LOG_INFO, $event->raw);
    closelog();

    /* Verify that the signature matches one of your keys*/
    $my_keys = [
                'live'=>'sk_live_blah',
                'test'=>'sk_test_blah',
              ];
    $owner = $event->discoverOwner($my_keys);
    if(!$owner){
        // None of the keys matched the event's signature
        die();
    }

    // Do something with $event->obj
    // Give value to your customer but don't give any output
    // Remember that this is a call from Paystack's servers and
    // Your customer is not seeing the response here at all
    switch($event->obj->event){
        // charge.success
        case 'charge.success':
            if('success' === $event->obj->data->status){
                // TIP: you may still verify the transaction
                // via an API call before giving value.
            }
            break;
    }

4. Verify Transaction

After we redirect to your callback url, please verify the transaction before giving value.

    $reference = isset($_GET['reference']) ? $_GET['reference'] : '';
    if(!$reference){
      die('No reference supplied');
    }

    // initiate the Library's Paystack Object
    $paystack = new Yabacon\Paystack(SECRET_KEY);
    try
    {
      // verify using the library
      $tranx = $paystack->transaction->verify([
        'reference'=>$reference, // unique to transactions
      ]);
    } catch(\Yabacon\Paystack\Exception\ApiException $e){
      print_r($e->getResponseObject());
      die($e->getMessage());
    }

    if ('success' === $tranx->data->status) {
      // transaction was successful...
      // please check other things like whether you already gave value for this ref
      // if the email matches the customer who owns the product etc
      // Give value
    }

5. Closing Notes

Generally, to make an API request after constructing a paystack object, Make a call to the resource/method thus: $paystack->{resource}->{method}(); for gets, use $paystack->{resource}(id) and to list resources: $paystack->{resource}s().

Currently, we support: 'customer', 'page', 'plan', 'subscription', 'transaction' and 'subaccount'. Check our API reference(link-paystack-api-reference) for the methods supported. To specify parameters, send as an array.

Check SAMPLES for more sample calls

Extras

There are classes that should help with some tasks developers need to do on Paystack often:

Fee

This class works with an amount and your Paystack fees. To use, create a new Fee object

    $fee = new Yabacon\Paystack\Fee();

Configure it:

    $fee->withPercentage(0.015);        // 1.5%
    $fee->withAdditionalCharge(10000);  // plus 100 NGN
    $fee->withThreshold(250000);        // when total is above 2,500 NGN
    $fee->withCap(200000);              // capped at 2000

Calculate fees

    $chargeOn300naira = $fee->calculateFor(30000);
    $chargeOn7000naira = $fee->calculateFor(700000);

To know what to send to the API when you want to be settled a particular amount

    $iWant100Naira = $fee->addFor(10000);
    $iWant4000Naira = $fee->addFor(400000);

Event

This class helps you capture and our events:

    $event = Yabacon\Paystack\Event::capture();

Verify it against a key:

    if($event->validFor($mySecretKey))
    {
        // awesome
    }

Discover the key that owns it (IN case same webhook receives for several integrations). This can come in handy for multi-tenant systems. Or simply if you want to have same test and live webhook url.

    $my_keys = [
                'live'=>'sk_live_blah',
                'test'=>'sk_test_blah',
              ];
    $owner = $event->discoverOwner($my_keys);
    if(!$owner){
        // None of my keys matched the event's signature
        die();
    }

To forward the event to another url. In case you want other systems to be notified of exact same event.

    $evt->forwardTo('http://another-webhook.url');

MetadataBuilder

This class helps you build valid json metadata strings to be sent when making transaction requests.

    $builder = new MetadataBuilder();

Add metadata

Add MetaData by calling the withKeyName magic function (These will not be shown on dashboard). Do not use CustomFields as a KeyName

    $builder->withQuoteId(10); // will add as quote_id: 10 unless you turn auto_snake_case off
    $builder->withMobileNumber(08012345678); // will add as mobile_number: 08012345678
    $builder->withCSRF('dontacceptpaymentunlessthismatches');

To turn off automatic snake-casing of Key names, do:

    MetadataBuilder::$auto_snake_case = false;

before you start adding metadata to the $builder.

Add Custom Fields

Add Custom Fields by calling the withCustomField function (These will shown on dashboard).

    $builder->withCustomField('Mobile Number', '080123456789');
    $builder->withCustomField('See Me', 'I\'m Visible on your Dashboard');

Build JSON

Finally call build() to get your JSON metadata string.

Using Custom Routes

You can add your custom routes by calling the useRoutes method on the paystack object.

    $paystack = new Yabacon\Paystack(SECRET_KEY);
    $paystack->useRoutes(["charge" => Charge::class]);

    $paystack->charge->chargeMobileMoney([
          'email' => '[email protected]',
          'reference' => 'trnx_ref',
          'amount' => 50 * 100,
          'currency' => 'GHS',
          'mobile_money' => [
            'phone' => '5533467',
            'provider' => 'MTN'
          ]
    ]);

Your custom routes should implement the Yabacon\Paystack\Contracts\RouteInterface contract

    class Charge implements RouteInterface
    {

        public static function root()
        {
            return '/charge';
        }

        public static function chargeMobileMoney()
        {
            return [
                RouteInterface::METHOD_KEY => RouteInterface::POST_METHOD,
                RouteInterface::ENDPOINT_KEY => Charge::root(),
                RouteInterface::PARAMS_KEY => [
                    'email',
                    'reference',
                    'amount',
                    'currency',
                    'mobile_money',
                ],
            ];
        }
    }

Change log

Please see CHANGELOG for more information what has changed recently.

Testing

    $ composer test

Contributing

Please see CONTRIBUTING and CONDUCT for details. Check our todo list for features already intended.

Security

If you discover any security related issues, please email [email protected] instead of using the issue tracker.

Credits

License

The MIT License (MIT). Please see License File for more information.

paystack-php's People

Contributors

epic-kaso avatar ibrahimlawal avatar kendysond avatar nwogu avatar synergixe avatar teliov avatar tobyokeke 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

paystack-php's Issues

What's the complete proper way to check if BVN is valid or not

What's the complete proper way to check if BVN is valid or not because i have play around with the code and it seems not working

$paystack = new Yabacon\Paystack(Config::get('app.paystack_secret_key'));

try
{
$responseObj = $paystack->bank->resolveBvn([
'bvn' => '22395920708', // in kobo
]);

} catch (\Yabacon\Paystack\Exception\ApiException $e) {
print_r($e->getResponseObject());
die($e->getMessage());
}

if (http_response_code(200)) {
var_dump($responseObj);
}

the above code respond on the browser with the following error

stdClass Object ( [status] => [message] => Unable to resolve BVN ) Paystack Request failed with response: 'Unable to resolve BVN'

But we need to check if its valid or not and display some certain error to the user after inserting wrong BVN

Warning: Undefined array key "transaction" in C:\greco\htdocs\paystack\vendor\yabacon\paystack-php\src\Paystack\Helpers\Router.php on line 100

Fatal error: Uncaught TypeError: get_class_methods(): Argument #1 ($object_or_class) must be an object or a valid class name, null given in C:\greco\htdocs\paystack\vendor\yabacon\paystack-php\src\Paystack\Helpers\Router.php:67 Stack trace: #0 C:\greco\htdocs\paystack\vendor\yabacon\paystack-php\src\Paystack\Helpers\Router.php(67): get_class_methods(NULL) #1 C:\greco\htdocs\paystack\vendor\yabacon\paystack-php\src\Paystack.php(106): Yabacon\Paystack\Helpers\Router->__construct('transaction', Object(Yabacon\Paystack)) #2 C:\greco\htdocs\paystack\index.php(13): Yabacon\Paystack->__get('transaction') #3 {main} thrown in C:\greco\htdocs\paystack\vendor\yabacon\paystack-php\src\Paystack\Helpers\Router.php on line 67

Subscription and Plans update on Customer

I have a plans on my site let say Entry Level #100, Bronze #200. During sign up a user will paid #100 which I understand I need to call a plan let say monthly payment and let say email or phone number is unique on my portal site.
I also know that once a customer do his/her first transaction paystack automatically register it on my customer list with a customer ID.
#The Question is:

  1. How can I automatically update the customer plan upgrading from Entry Level to Brozen after 6months of being a member ( such as I can send a phone number/email or any unique ID )
  2. How can I stop automatically if a customer don't longer interested in the service(s) provided ( such as I can send a phone number/email or any unique ID ) .

As I can't find any of this in most of the API

Thanks.

Fatal error: Uncaught exception 'Yabacon\Paystack\Exception\ApiException' with message

This error shows when I submit the pay request...

Fatal error: Uncaught exception 'Yabacon\Paystack\Exception\ApiException' with message 'Paystack Request failed with response: ' <title>400 Bad Request</title>

400 Bad Request


cloudflare '' in C:\xampp\htdocs\domain\paystack-php-master\src\Paystack\Http\Response.php:31 Stack trace: #0 C:\xampp\htdocs\domain\paystack-php-master\src\Paystack\Http\Response.php(71): Yabacon\Paystack\Http\Response->parsePaystackResponse() #1 C:\xampp\htdocs\domain\paystack-php-master\src\Paystack\Helpers\Caller.php(20): Yabacon\Paystack\Http\Response->wrapUp() #2 C:\xampp\htdocs\domain\paystack-php-master\src\Paystack\Helpers\Router.php(84): Yabacon\Paystack\Helpers\Caller->callEndpoint(Array, Array, Array) #3 [internal function]: Yabacon\Paystack\Helpers\Router->Yabacon\Paystack\Helpers{closure}(Array) #4 C:\xampp\htdocs\domain\paystack-php-master\src\Paystack\Helpers\Router.php(39): call_user_func_array(Object(Closure), in C:\xampp\htdocs\domain\paystack-php-master\src\Paystack\Http\Response.php on line 31

How to use metadata builder

Problem/Motivation

There is no full example of how to use the MetaBuilder when initiating a transaction. Though there are examples of how the metadata would be built, I'm confused as to when to build the metadata.

I have the code below when initiating a transaction

        $paystack = new Paystack(config('paystack.secret_key'));
        $builder = new MetadataBuilder();
        $builder->withQuoteId(10); // will add as quote_id: 10 unless you turn auto_snake_case off
        $builder->withMobileNumber('08012345678'); // will add as mobile_number: 08012345678
        $builder->withCSRF('dontacceptpaymentunlessthismatches');
        $builder->withCustomField('Mobile Number', '080123456789');
        $builder->withCustomField('See Me', 'I\'m Visible on your Dashboard');
        $builder->build();
        try {
            $transaction = $paystack->transaction->initialize([
                'amount'     => (Cart::totalFloat() + 8000) * 100,
                'email'      => $request->input('email'),
                'reference'  => $orderCode,
            ]);
        } catch (\Yabacon\Paystack\Exception\ApiException $e) {
            return redirect()->back()->with('message', [
                'status'  => 'danger',
                'body'    => 'Failed to make request to payment provider. Please try again',
            ]);
        }

But when the transaction is verified, the metadata field is an empty string.

How should the builder be used when initiating a transaction?
Where does the metadata go?
How would the embedded metadata be retrieved from the transaction detail response?

save_last_transaction_reference() function not found

While trying to setup the paystack on my site and trying to verify a transaction(Test phase), this problem occurred Fatal error: Uncaught Error: Call to undefined function save_last_transaction_reference() in /home/vagrant/Code/Project/public/payProcess.php on line 28

I don't know if a function like this is in the software save_last_transaction_reference(). What is the way around it

Expected Results:

I expect it to store transaction reference

Verification fails for test keys

I keep getting an InvalidArgumentException: A Valid Paystack Secret Key must start with 'sk_'. which seems to be happening because Paystack's test keys begin with 'pk' instead.

Maybe we could update the checker code in the Paystack() constructor or find a better way to check for valid keys.

Steps to repeat: (Describe how the issue can be repeated by someone who is to work on it)

  1. Generate a test key from paystack dashboard.
  2. Attempt to pass test key as a parameter to the constructor.

improvement to autoload.php

Problem/Motivation

Trying to get paystack-php to work with a PHP 5.3 framework...because I have no choice, really. So while running autoload.php, I get Parse error: syntax error, unexpected '[', expecting ')'...

Proposed resolution

The problem is on L11. str_replace expects either a string or an array as per http://php.net/manual/en/function.str-replace.php. Switching it out with $file .= str_replace(array('Yabacon\\', '\\'), array('', DIRECTORY_SEPARATOR), $class_name) . '.php'; seems to fix my problem. My wild guess is that this modification shouldn't break anything for newer versions of PHP.

Is that a list in PHP?

Repeatable

Always

This is not really a bug, say a tinny winny improvement.

Please I need more explanation on

// Do something with $event->obj
// Give value to your customer but don't give any output
// Remember that this is a call from Paystack's servers and
// Your customer is not seeing the response here at all
if possible please a sample code

And on step 4 you mentioned verify transaction before giving value I still don't get what value to give and how

Fatal Error Uncaught InvalidArgumentException: Class &quot;transaction&quot; does not exist. in /storage/ssd4/502/13888502/public_html/vendor/yabacon/paystack-php/src/Paystack/Helpers/Router.php:69

Problem/Motivation

I'm getting this error on live server when trying to call the api for redirect user to payment page
0 /storage/ssd4/502/13888502/public_html/vendor/yabacon/paystack-php/src/Paystack.php(106): Yabacon\Paystack\Helpers\Router->__construct('transaction', Object(Yabacon\Paystack))
1 /storage/ssd4/502/13888502/public_html/framework/Models/Subscriptions.php(61): Yabacon\Paystack->__get('transaction')

An uncaught Exception was encountered Type: InvalidArgumentException

An uncaught Exception was encountered Type: InvalidArgumentException

Hi guys I'm working on a codeigniter, everything works fine with correct secret key but when there's an invalid secret this error comes up I've tried using catch () trie to catch the error but it doesn't work and when debugging is disabled it throws HTTP 500 error

400 Bad Request on PHP 7

Paystack Request failed with response:
400 Bad Request

Works fine when I use php 5 but throws the 400 error on php 7.

Any fix for this?

Please Enable Cookies Error

Please i'm having issue initializing new transaction with paystack.

I got this error

"Paystack Request failed with response: '
Please enable cookies.

I've previously setup paystack on several servers without any issues but on this new server i'm finding it difficult to get it to work. I've also confirmed that cookies is enable on the server.

Thank you.

Create plans programmatically

Hi, does Paystack allows you to create plans programmatically?
I can't seem to find anything in the sdk or documentation about creating plans programmatically incases where you need to have dynamic plans amount for different users or other scenarios.

ApiException on live server

I got the following error when using the library on a live server even though it works locally on my system. All resource method returns the same error.

`Yabacon\Paystack\Exception\ApiException

Paystack Request failed with response: '

<title>400 Bad Request</title>

400 Bad Request


cloudflare-nginx `

chargeMobileMoney

class_implements(): Class Charge does not exist and could not be loaded in C:\greco\htdocs\paystack\yabacon\vendor\yabacon\paystack-php\src\Paystack.php on line 45

If Initialize is to get payment from users, What is the method to send money to users?

Problem/Motivation

(Why the issue was filed, steps to reproduce the problem, etc.)

Proposed resolution

(Description of the proposed solution, the rationale behind it, and workarounds for people who cannot use the patch.)

Repeatable

Always|Sometimes|Specific conditions|Specific times

(If it is a bug, you are reporting lease specify:)

Steps to repeat: (Describe how the issue can be repeated by someone who is to work on it)

  1. Step 1
  2. Step 2
  3. ...

Expected Results:

(What you expected steps 1, 2 and 3 to give)

Actual Results:

(What is gave including any error messages, memory dump etc that can help)

400 Bad Request

Paystack Request failed with response:

<html> <head><title>400 Bad Request</title></head> <body> <center><h1>400 Bad Request</h1></center> <hr><center>cloudflare</center> </body> </html>

'Please waith' Loading never goes away

Actual Results:

There were no error messages

http://prntscr.com/usngk8


<?php
require_once 'vendor/autoload.php';

// documented at https://github.com/yabacon/paystack-php
use Yabacon\Paystack;
use Yabacon\Paystack\MetadataBuilder;

define('PAYSTACK', '1');


define('PAYSTACK_SECRET', 'sk_test_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');
$path = filter_input(INPUT_GET, 'path');

// sample code to start a transaction
// more about thr transaction/initialize enpoint
// here: https://developers.paystack.co/v1.0/reference#initialize-a-transaction
if($path === 'new-access-code'){
    if(!(($email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL)) 
        && ($amount = filter_input(INPUT_POST, 'amount', FILTER_VALIDATE_FLOAT)))){
        http_response_code(400);
        die('Invalid Email or amount sent');
    }

    $amountinkobo = 100 * $amount;
    $builder = new MetadataBuilder();
    $builder->withCustomField('MyStudio', 'Premium Plan Charge');
    time()%2 && $builder->withCustomFilters(['recurring'=>true]);
    $metadata = $builder->build();

    try{
        $paystack = new Paystack(PAYSTACK_SECRET);
        $paystack->disableFileGetContentsFallback();
        $trx = $paystack->transaction->initialize([
            'amount'=>$amountinkobo,
            'email'=>$email,
            'metadata'=>$metadata,
        ]);
    } catch(Exception $e){
        http_response_code(400);
        die($e->getMessage());
    }

    die($trx->data->access_code);
}

// sample code to verify a transaction reference
// more about the transaction/verify enpoint
// here: https://developers.paystack.co/v1.0/reference#verifying-transactions
if(strpos($path, 'verify/') === 0){
    // whatever is after verify is our refernce
    $reference = substr($path, 7);

    try{
        $paystack = new Paystack(PAYSTACK_SECRET);
        $paystack->disableFileGetContentsFallback();
        $trx = $paystack->transaction->verify([
            'reference'=>$reference,
        ]);
    } catch(Exception $e){
        http_response_code(400);
        die($e->getMessage());
    }

    if($trx->data->status === 'success'){
        // give value
        require '../config.php';
        //require '../logged_user_info.php';

        //genereate a unique token for each transaction secure system
        //$token = bin2hex(openssl_random_pseudo_bytes(6));
        $dated=time();
        $timeDated=date('D, M m, Y ');
        $SubscribePlan=$db->query("INSERT INTO service_sub (user_id_fk, tr_id_fk, sub_type, timeDated, sub_dated)
            VALUES ('$user_uid', '$reference', 'premium', '$timeDated', '$dated' )");

        $SubscribePlan=$db->query("UPDATE users SET service_status='on', tr_id='$reference' WHERE uid='$user_uid' ");

                # code...
          echo '<div class="notice success"><p>Your account is now activated to Premium.</p>
           <a href="../subscription.php" class="btn btn-azure" data-paystack="submit">Finished</a></div>';

    }

    // dump gateway response for display to user
    die($trx->data->gateway_response);
}

// our payment form
if($path === 'payment'){
    include_once 'pay.php';
    die();
}

// our payment form
if(($path === '/') || ($path === '')){
    include_once 'pay.php';
    die();
}

// log a client-side error
if($path === 'report'){
    file_put_contents('client-errors.log', "\n".json_encode($_POST), FILE_APPEND);
    die();
}

// if it got here, it was neither of the recognized paths
// show the welcome message
http_response_code(404);
?><p>Your server is set up.
    <br>/<?php echo $path; ?> does not exist<br>
    Open <i>/payment</i> to test the form.
    </p>

http_error is false for guzzle

Currently http_errors is being set as false which would mean that if the request failed for any reason the user would get only an empty result but not a description of what exactly went wrong.

I think the same thing is happening with curl as well. No error message is returned.

Outdated Release code

Hi,

The latest release on the release page of this repo is outdated, it is still version 2.0, which throws an error when I try

$paystack->transaction->verify()

It throws the Class transaction does not exist.error.

I fixed it by clone the repo itself. Please, make a new release on the latest version

Cannot call ->plan->fetch(planCode)

Basically i think one should be able to call $paystack->plan->fetch() with a plan ID or code. This would keep the library consistent with the API. As opposed to $paystack->plan() which only accepts an integer value.

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.