Code Monkey home page Code Monkey logo

softon / indipay Goto Github PK

View Code? Open in Web Editor NEW
63.0 5.0 83.0 83 KB

The Laravel Framework Package for Indian Payment Gateways. Currently Supported Gateway: CCAvenue, PayUMoney, EBS, CitrusPay ,ZapakPay (Mobikwik), Paytm, InstaMojo , Mocker

Home Page: http://softon.github.io/indipay

License: MIT License

PHP 86.11% Blade 13.89%
laravel-5-package laravel55 laravel-package payment-gateway payment-integration ccavenue-laravel payumoney-laravel paytm-laravel mocker-laravel zapakpay-laravel

indipay's Introduction

IndiPay

The Laravel 5+ Package for Indian Payment Gateways. Currently supported gateway: CCAvenue, PayUMoney, EBS, CitrusPay ,ZapakPay (Mobikwik), Paytm, Mocker

For Laravel 4.2 Package Click Here

Installation

Step 1: Install package using composer

    composer require softon/indipay

Step 2: Add the service provider to the config/app.php file in Laravel (Optional for Laravel 5.5+)


    Softon\Indipay\IndipayServiceProvider::class,

Step 3: Add an alias for the Facade to the config/app.php file in Laravel (Optional for Laravel 5.5+)


    'Indipay' => Softon\Indipay\Facades\Indipay::class,

Step 4: Publish the config & Middleware by running in your terminal


    php artisan vendor:publish --provider="Softon\Indipay\IndipayServiceProvider" 

Step 5: Modify the app\Http\Kernel.php to use the new Middleware. This is required so as to avoid CSRF verification on the Response Url from the payment gateways. You may adjust the routes in the config file config/indipay.php to disable CSRF on your gateways response routes.

NOTE: You may also use the new VerifyCsrfToken middleware and add the routes in the $except array.

App\Http\Middleware\VerifyCsrfToken::class,

to

App\Http\Middleware\VerifyCsrfMiddleware::class,

Usage

Edit the config/indipay.php. Set the appropriate Gateway parameters. Also set the default gateway to use by setting the gateway key in config file. Then in your code...

 use Softon\Indipay\Facades\Indipay;  

Initiate Purchase Request and Redirect using the default gateway:-

      /* All Required Parameters by your Gateway will differ from gateway to gateway refer the gate manual */
      
      $parameters = [
        'transaction_no' => '1233221223322',
        'amount' => '1200.00',
        'name' => 'Jon Doe',
        'email' => '[email protected]'
      ];
      
      $order = Indipay::prepare($parameters);
      return Indipay::process($order);

Please check for the required parameters in your gateway manual. There is a basic validation in this package to check for it.

You may also use multiple gateways:-

      // gateway = CCAvenue / PayUMoney / EBS / Citrus / InstaMojo / ZapakPay / Paytm / Mocker
      
      $order = Indipay::gateway('Paytm')->prepare($parameters);
      return Indipay::process($order);

Get the Response from the Gateway (Add the Code to the Redirect Url Set in the config file. Also add the response route to the remove_csrf_check config item to remove CSRF check on these routes.):-

 
    public function response(Request $request)
    
    {
        // For default Gateway
        $response = Indipay::response($request);
        
        // For Otherthan Default Gateway
        $response = Indipay::gateway('NameOfGatewayUsedDuringRequest')->response($request);

        dd($response);
    
    }  

The Indipay::response will take care of checking the response for validity as most gateways will add a checksum to detect any tampering of data.

Important point to note is to store the transaction info to a persistant database before proceding to the gateway so that the status can be verified later.

Payment Verification

From version v1.0.12 Indipay has started implementing verify method in some gateways so that the developer can verify the payment in case of pending payments etc.

    $order = Indipay::verify([
        'transaction_no' => '3322344231223'
    ]);

The parameters to be passed, again depends on Gateway used.

Verify Feature Currently Supported in : Paytm, Mocker

indipay's People

Contributors

ajitdas123 avatar jerry4rahul avatar mahavishnup avatar ravimit786 avatar rohitm-in avatar secrethash avatar softon 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

Watchers

 avatar  avatar  avatar  avatar  avatar

indipay's Issues

How to get RSA?

How to get RSA key from php server for integrating with android?
I tried but it sends error
!ERROR!Caller IP not registered/Merchant Not found.

please support paytm wallet.

Thanks for the effort to unit these payment gateways to one place. but i would also like to request for paytm support.

Class Softon\Indipay\Gateways\CCavenueGateway does not exist

Hello,

Thank you for the great plugin.

We are trying to setup CCAvenue payment gateway. But on initializing payment, we get following error.

ReflectionException in Container.php line 734: Class Softon\Indipay\Gateways\CCavenueGateway does not exist in Container.php line 734 at ReflectionClass->__construct('Softon\Indipay\Gateways\CCavenueGateway') in Container.php line 734

I guess issue is with case sensitivity with 'CCavenueGateway' name. File & class name is 'CCAvenueGateway' with capital 'A'. But, I am unable to find location from where 'CCavenueGateway' is getting called.

Older version of Indipay was working fine for CCAvenue.

Regards,
Nilesh G

Got TokenMismatchException in VerifyCsrfMiddleware.php line 16

Hello Sir,

I have followed the guide step by step and integrated the package in my application. However, after processing the payment, I got the TokenMismatchException in VerifyCsrfMiddleware line 16. Though, the transaction is successful and I do receive the payment notification.

Check the below image

screenshot_6

Here's the routes.php file:

Route::post('/store/proceed-to-checkout', 'CheckoutController@proceedToCheckout');
Route::get('/store/thank-you', 'PagesController@getThankYou');

CheckoutController.php

public function proceedToCheckout(Request $request)
{
    $orderCode = Order::latest()->limit(1)->first();
    $newOrderCode = ($orderCode) ? ++$orderCode->order_code : 'ORD-000000001';

    $parameters = [
        'merchant_id' => $request->get('merchant_id'),
        'currency' => $request->get('currency'),
        'redirect_url' => $request->get('redirect_url'),
        'cancel_url' => $request->get('cancel_url'),
        'language' => 'EN',
        'order_id' => $newOrderCode,
        'actionId' => $request->get('actionID'),
        'TxnType' => $request->get('TxnType'),
        'amount' => $request->get('amount'),
        'tid' => time().rand(111,999)
    ];

    return Indipay::purchase($parameters);
}

PagesController.php

public function getThankYou(Request $request)
{
    $ordCode = Session::get('ordCode');

    $response = Indipay::response($request);

    dd($response);

    //return view('version-seven.pages.thank_you', compact('ordCode'));
}

Kernel.php

<?php namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel {

    /**
     * The application's global HTTP middleware stack.
     *
     * @var array
     */
    protected $middleware = [
        'Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode',
        'Illuminate\Cookie\Middleware\EncryptCookies',
        'Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse',
        'Illuminate\Session\Middleware\StartSession',
        'Illuminate\View\Middleware\ShareErrorsFromSession',
        //'App\Http\Middleware\VerifyCsrfToken',
        'App\Http\Middleware\VerifyCsrfMiddleware',
    ];

    /**
     * The application's route middleware.
     *
     * @var array
     */
    protected $routeMiddleware = [
        'auth' => 'App\Http\Middleware\Authenticate',
        'auth.basic' => 'Illuminate\Auth\Middleware\AuthenticateWithBasicAuth',
        'guest' => 'App\Http\Middleware\RedirectIfAuthenticated',
        'admin' => 'App\Http\Middleware\AdminAuthentication',
    ];

}

What could be the error that I must have made ? Can you please help me ?

Thanks in advance.

Got TokenMismatchException in VerifyCsrfMiddleware.php at line 16 laravel 5.4

Hello,
I got following error
image
I am using laravel5.4 version.
Here's my indipay.php

<?php

return [

/*
    |--------------------------------------------------------------------------
    | Indipay Service Config
    |--------------------------------------------------------------------------
    |   gateway = CCAvenue / PayUMoney / EBS / Citrus / InstaMojo
    |   view    = File
    */

    'gateway' => 'CCAvenue',                // Replace with the name of default gateway you want to use

    'testMode'  => false,                   // True for Testing the Gateway [For production false]

    'ccavenue' => [                         // CCAvenue Parameters
        'merchantId'  => env("CCAVENUE_MERCHANT_ID", ''),
        'accessCode'  => env("CCAVENUE_ACCESS_CODE", ''),
        'workingKey' => env("CCAVENUE_WORKING_KEY",''),

        // Should be route address for url() function
        'redirectUrl' => env('CCAVENUE_REDIRECT_URL', ''),
        'cancelUrl' => env('CCAVENUE_CANCEL_URL', ''),

        'currency' => env('CCAVENUE_CURRENCY', 'INR'),
        'language' => env('CCAVENUE_LANGUAGE', 'EN'),
    ],

    'payumoney' => [                         // PayUMoney Parameters
        'merchantKey'  => env('INDIPAY_MERCHANT_KEY', ''),
        'salt'  => env('INDIPAY_SALT', ''),
        'workingKey' => env('INDIPAY_WORKING_KEY', ''),

        // Should be route address for url() function
        'successUrl' => env('INDIPAY_SUCCESS_URL', 'indipay/response'),
        'failureUrl' => env('INDIPAY_FAILURE_URL', 'indipay/response'),
    ],

    'ebs' => [                         // EBS Parameters
        'account_id'  => env('INDIPAY_MERCHANT_ID', ''),
        'secretKey' => env('INDIPAY_WORKING_KEY', ''),

        // Should be route address for url() function
        'return_url' => env('INDIPAY_SUCCESS_URL', 'indipay/response'),
    ],

    'citrus' => [                         // Citrus Parameters
        'vanityUrl'  => env('INDIPAY_CITRUS_VANITY_URL', ''),
        'secretKey' => env('INDIPAY_WORKING_KEY', ''),

        // Should be route address for url() function
        'returnUrl' => env('INDIPAY_SUCCESS_URL', 'indipay/response'),
        'notifyUrl' => env('INDIPAY_SUCCESS_URL', 'indipay/response'),
    ],

    'instamojo' =>  [
        'api_key' => env('INSTAMOJO_API_KEY',''),
        'auth_token' => env('INSTAMOJO_AUTH_TOKEN',''),
        'redirectUrl' => env('INDIPAY_REDIRECT_URL', 'indipay/response'),
    ],

    // Add your response link here. In Laravel 5.2 you may use the api middleware instead of this.
    'remove_csrf_check' => [
        '/order-response'
    ],
];

And Kernel.php

<?php

namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
    /**
     * The application's global HTTP middleware stack.
     *
     * These middleware are run during every request to your application.
     *
     * @var array
     */
    protected $middleware = [
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
    ];

    /**
     * The application's route middleware groups.
     *
     * @var array
     */
    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            // \Illuminate\Session\Middleware\AuthenticateSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            // \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
            \App\Http\Middleware\VerifyCsrfMiddleware::class,
            
        ],

        'api' => [
            'throttle:60,1',
            'bindings',
        ],
    ];

    /**
     * The application's route middleware.
     *
     * These middleware may be assigned to groups or used individually.
     *
     * @var array
     */
    protected $routeMiddleware = [
        'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
    ];
}

Please help me with this. Thanks !

IndipayParametersMissingException in PayUMoneyGateway.php

` public function bookingconfirm(request $request){

         $parameters = [

        'key' => 'RDey6p1q',
        'txnid' => '1233221223322',
        'surl' => 'paymentsuccess',
        'furl' => 'paymentfailure',
        'firstname' => 'massum',
        'email' => '[email protected]',
        'phone' => '8014700382',
        'productinfo' => 'room2',
        'service_provider' => 'payu_paisa',
        'amount' => '100',


  ];

  // gateway = CCAvenue / PayUMoney / EBS / Citrus / InstaMojo

  $order = Indipay::gateway('PayUMoney')->prepare($parameters);
  return Indipay::process($order);


}`

plz help me on the missing parameter

Not Working with PHP latest version (7.1)

its not working with latest version of php i.e. 7.1 i tried with 7.0 and its working fine ,,,this is the error i get with php 7.1 "Function mcrypt_module_open() is deprecated"

What is 'tid' ? Getting `IndipayParametersMissingException` while initiating the purchase in CCAvenue

Hello,

I have installed your package in my application successfully. Now when I initiate the payment process using CCAvenue, I get IndipayParametersMissingException on line 102. When checked with the source code, there is 'tid' => 'required' attribute that has been passed in the checkParameters() method.

So just to avoid that exception, I wrote the following:

'tid' => '1'

in the processing of initiating the transaction method.

Here's my updated controller method:

public function proceedToCheckout(Request $request)
{
    $orderCode = Order::latest()->limit(1)->first();
    $parameters = [
        'merchant_id' => $request->get('merchant_id'),
        'currency' => $request->get('currency'),
        'redirect_url' => $request->get('redirect_url'),
        'cancel_url' => $request->get('cancel_url'),
        'language' => 'EN',
        'order_id' => $orderCode->order_code,
        'actionId' => $request->get('actionID'),
        'TxnType' => $request->get('TxnType'),
        'amount' => $request->get('amount'),

        /* below line when written, throws no error */
        'tid' => '1'
    ];

    return Indipay::purchase($parameters);
}

So the question is, what is tid and what am I suppose to pass as the parameter for tid ?

PayUMoney Integration

I am trying to integrate my payumoney gateway in my laravel application but its showing me error when I am going to make payment. Do I need to get any activation key from Softon/Indipay service provider for activate this API for use? If yes then tell me how I can get that API activation Key?

payumoney

SORRY!
We were unable to process your payment

Checksum Failed

multiple gateway

hello,

how can I use multiple gateway.
so clients may choose Payumoney, EBS or CCAvenue.

as per the client selection, something like -

Indipay::gateway('payumoney');

ZaakPay

Please integrate Mobikwik ZaakPay.

Razor payment

Dear Sir....can u implement razor payment into this package it will be nice

PHPUnit Testing TokenMismatch Exception

After installing this package succesfully and running the test suite, the application blows up with errors:

TokenMismatchException.

After an hour of digging into the code, here's what you need to do..

Open the middleware that comes with this package, i.e., VerifyCsrfMiddleware and inside the handle method has an if statement.

Earlier:

if (
    $this->isReading($request) || 
    $this->excludedRoutes($request) || 
    $this->tokensMatch($request)
) {
    return $this->addCookieToResponse($request, $next($request));
}

There is a missing method here.. That method is runningUnitTests() which is located in \Illuminate\Foundation\Http\Middleware\VerifyCsrfToken file. You need to add it to the if statement, like so..

if (
    $this->isReading($request) || 
    $this->excludedRoutes($request) || 
    $this->tokensMatch($request) || 
    $this->runningUnitTests()
) {
    return $this->addCookieToResponse($request, $next($request));
}

With this minor edit, you can run the entire test suite again.

Silly point.. But should help the new comers who will use this package..

Hope this helps.

"You do not have permission to perform this action."

I had used the below code in my controller

         $parameters = [
          'tid' => '1233221223322',
          'order_id' => '1232212',
          'amount' => '12.00',
          'purpose' => 'Testing',
          'buyer_name' => 'Testing',
          ];

        $order = Indipay::prepare($parameters);
        return Indipay::process($order);`

My output

       Client error: `POST https://www.instamojo.com/api/1.1/payment-requests/` resulted in a `403       
       FORBIDDEN` response:
       {
         "message": "You do not have permission to perform this action.", 
          "success": false
       }

Class Softon\Indipay\Gateways\ccavenueGateway does not exist

I'm getting this error:

(1/1) ReflectionException
Class Softon\Indipay\Gateways\ccavenueGateway does not exist

image

My indipay.php config file has this:

    'gateway' => 'ccavenue',                // Replace with the name of default gateway you want to use

    'testMode'  => true,                   // True for Testing the Gateway [For production false]

    'ccavenue' => [                         // CCAvenue Parameters
        'merchantId'  => #####,
        'accessCode'  => #####,
        'workingKey' => #####,

        // Should be route address for url() function
        'redirectUrl' => env('INDIPAY_REDIRECT_URL', 'indipay/response'),
        'cancelUrl' => env('INDIPAY_CANCEL_URL', 'indipay/response'),

        'currency' => env('INDIPAY_CURRENCY', 'INR'),
        'language' => env('INDIPAY_LANGUAGE', 'EN'),
    ],

It seems this works on my local system (mac) and doesn't work on an ubuntu server. I think it may be a case sensitive file naming issue. It's looking for the class name "ccavenueGateway", however the class that exists is "CCAvenueGateway" in CCAvenueGateway.php file. It makes sense that it works on mac (my filesystem is not case sensitive) and doesn't work on ubuntu (case sensitive?).

Please help.

No hint path defined for [indipay]

Hello Softon
I am getting No hint path defined for [indipay] error in ccavenu payment gateway on my production server. the same code working fine on my demo server. so please help me on this because I am facing this issue on production server.

After return Indipay::process($order) page goes blank

   $parameters = [
      
        'tid' => '1233221223322',
        
        'order_id' => '1232212',
        
        'amount' => '1200.00',
        
      ];
       
      $order = Indipay::gateway('PayUMoney')->prepare($parameters);
    //dd(Indipay::process($order)); displaying output
      return Indipay::process($order);

dd(Indipay::process($order)); displaying output.
But after commenting dd(Indipay::process($order));
page goes blank without any error.

CCAvenue Responce not extrated

Hello Sir, I am use your plugin with laravel its working perfectly with payumone and other but when i use this with ccavenue, payment is successfull but responce not extracetd. please help me how to i extract the responce of ccavenue to get payment status and transiction id

encrypt() and decrypt() is not working for CCAvenue driver since PHP 7.1

The encrypt function and decrypt function is using the hardcoded value of MCRYPT_RIJNDAEL cipher, which is not valid after PHP7.0

So, the alternative solution to using config('app.cipher'); is requested to be implemented. Or I don't know how these functions are used, but can't we simply use encrypt() and decrypt() helper function of Laravel Crypt class?

This needs to be resolved ASAP!

cc: @softon

Error Code: 10001 Invalid Request - Encrypted request invalid/not present.

I followed the exact steps and also made a request to CCAvenue for adding the URL. Later I got new access code as well as working key.
Now I am facing the following error:

Error Code: 10001 Invalid Request - Encrypted request invalid/not present. Don't worry... It happens to the best of us.

What could be wrong?

Payment audit

Hi ,

I am using Indipay package in laravel 5.1, I found it really awesome and easy to integrate module. But I have a query:

In my project its a requirement to track each state of payment, for example, when user click on pay now order will be created and its status will be marked as "Order initiated" and when the request completed I will log the response and marked the order status as "Order Success/Order failure" .

So the problem is I can not log the parameters created by Indipay package just before sending the request. I need to log all of the parameters created by PayUMoney gateway. So how do I achieve this thing. Please help!

Thanks

how to pass customer name, address etc as parameters to ccAvenue

Hello @softon ,

I am trying to Pass customer details to ccavenue as parameter.

Please provide me the parameter name that I can use to include following details:
Customer Name
Customer Address
Customer City
Customer State
Customer Pincode
Customer Mobile
Customer Emailid
Notes (Optional field)

Please provide me with an sample code if possible.
Thanks

Redirect URL and Cancel URL

Hello,

I am just confused about what URL should i listen for in routes.php file, for the redirectUrl and cancelUrl.

'ccavenue' => [                         // CCAvenue Parameters
        'merchantId'  => env('INDIPAY_MERCHANT_ID', '78750'),
        'accessCode'  => env('INDIPAY_ACCESS_CODE', 'AVBO00DH48AH87OBHA'),
        'workingKey' => env('INDIPAY_WORKING_KEY', 'ED18A24791C1C8816FF2EFA59CADE2FA'),

        // **Should be route address for url() function**
        'redirectUrl' => env('INDIPAY_REDIRECT_URL', 'indipay/response'),
        'cancelUrl' => env('INDIPAY_CANCEL_URL', 'indipay/response'),

        'currency' => env('INDIPAY_CURRENCY', 'INR'),
        'language' => env('INDIPAY_LANGUAGE', 'EN'),
    ],

Here you have mentioned that it should be route address for url() function, but i am not able to understand what does that mean.

Everything else seems to work perfectly.

Please let me know what URL should i listen to for redirect and cancel URL.

Should be route address for url() function, is the line i am not able to understand.

Also how can i get the response of payment request made?

Not able to use any gateway other than default one.

Even if I mention gateway other than default one, it is taking default one only. Please let me know what could be the issue.

    return Indipay::process($order); // default
    return Indipay::gateway('ccavenue')->process($order); // others

Usage in Controller gives an error

Hi, Can you please let me know the issue below:

Non-static method Softon\Indipay\Indipay::gateway() should not be called statically, assuming $this from incompatible context

even though you have not made gateway() static, you are calling it statically and even after instantiating the Indipay Class like $order = new Indipay(); it gives error like below

Argument 1 passed to Softon\Indipay\Indipay::__construct() must be an instance of Softon\Indipay\Gateways\PaymentGatewayInterface, none given, called in /var/www/public/avs/app/Http/Controllers/CartController.php on line 128 and defined

Can you help me out how do i pass PaymentGatewayInterface object while insantiating Indipay?

L4.2

Hello, can you tell me how to integrate it with L4.2. I need to integrate CCAVenue.

ebskey is hardcoded into the EBSGateway Class

In the encrypt function of EBSGateway Class, the "ebskey" string is hard coded into the hash that is generated. EBS has changed the key and now this is failing with "Invalid Securehash" error.

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.