Giter Club home page Giter Club logo

shippo-php-client's Introduction

Shippo PHP API wrapper


โš ๏ธ Shippo no longer actively maintains this library
However, you can use it as a starting point and update it for your needs and future changes to our APIs.
You can use our Open API Specification to build your own library using tools like the OpenAPI Generator and Swagger Codegen.


Build Status

Shippo is a shipping API that connects you with multiple shipping carriers (such as USPS, UPS, DHL, Canada Post, Australia Post, UberRUSH and many others) through one interface.

Print a shipping label in 10 mins using our default USPS and DHL Express accounts. No need to register for a carrier account to get started.

Requirements

  • PHP 5.6 or later.

  • Shippo account - free to sign up, free to use the API. Only pay to print a live label, test labels are free.

Installation

Installing using Composer

  • Get Composer

  • Create/append the following to your composer.json file

      {
        "require": {
          "shippo/shippo-php": "1.*"
        }
      }
    
  • Install via:

      composer.phar install
    
  • To use the bindings, either user Composer's autoload:

      require_once('vendor/autoload.php');
    

    Or manually:

      require_once('/path/to/vendor/shippo/shippo-php/lib/Shippo.php');
    

Installing using Laravel

In Laravel you can install the library as normal. Then within you app/Providers/AppServiceProvider.php file's boot() method add the following:

\Shippo::setApiKey(env('SHIPPO_API_KEY'));

To take advantage of configuration caching, you can set a config parameter in config/services.php and retrieve your API key through the configuration.

\Shippo::setApiKey($this->app['config']['services.shippo.key']);

From here you can use the Shippo library anywhere in your application without setting the key when accessing it.

Testing

After installing the dependencies above, the test suite may be run:

    ./vendor/bin/phpunit

You may also run individual tests:

    ./vendor/bin/phpunit AddressTest.php

Getting Started

Simple usage looks like:

    // Replace <API-KEY> with your Shippo API Key
    Shippo::setApiKey("<API-KEY>");
    $address = Shippo_Address::
        create(
            array(
                 'object_purpose' => 'QUOTE',
                 'name' => 'John Smith',
                 'company' => 'Initech',
                 'street1' => '6512 Greene Rd.',
                 'city' => 'Woodridge',
                 'state' => 'IL',
                 'zip' => '60517',
                 'country' => 'US',
                 'phone' => '773 353 2345',
                 'email' => '[email protected]',
                 'metadata' => 'Customer ID 23424'
            ));
            
        var_dump($address);

We've created a number of examples to cover the most common use cases. You can find the sample code files in the examples folder. Some of the use cases we covered include:

Documentation

Please see https://goshippo.com/docs for up-to-date documentation.

About Shippo

Connect with multiple different carriers, get discounted shipping labels, track parcels, and much more with just one integration. You can use your own carrier accounts or take advantage of our discounted rates with the USPS and DHL Express. Using Shippo makes it easy to deal with multiple carrier integrations, rate shopping, tracking and other parts of the shipping workflow. We provide the API and dashboard for all your shipping needs.

Supported Features

The Shippo API provides in depth support of carrier and shipping functionalities. Here are just some of the features we support through the API:

Supported Features

The Shippo API provides in depth support of carrier and shipping functionalities. Here are just some of the features we support through the API:

  • Shipping rates & labels - Docs
  • Tracking for any shipment with just the tracking number - Docs
  • Batch label generation - Docs
  • Multi-piece shipments - Docs
  • Manifests and SCAN forms - Docs
  • Customs declaration and commercial invoicing - Docs
  • Address verification - Docs
  • Consolidator support including:
    • DHL eCommerce
    • UPS Mail Innovations
    • FedEx Smartpost
  • Additional services: cash-on-delivery, certified mail, delivery confirmation, and more - Docs

shippo-php-client's People

Contributors

adriancollinsshippo avatar assislucas avatar bosswissam avatar bryant1410 avatar eduardojuarez avatar garbee avatar guozhen-la avatar honsremind avatar jfriedr avatar jkozlowicz avatar mikhaill avatar mnowik avatar mootrichard avatar mylifeisshan avatar pennadl avatar rbk avatar robin-shippo avatar rummykhan avatar sbeidas avatar thiagorramos avatar vyshakhbabji avatar wmichelin avatar zarlengotoptal 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

shippo-php-client's Issues

Rates at Checkout

Is there a way to use the rates at checkout feature with this lib?

Aramex support

Any chance for fully supporting Aramex any time soon?

Laravel empty values being returned...

Hello, this is my first time using the Shippo API integrated in Laravel...

I am having an issue where all of the Shippo functions I use return empty objects....

For example:

`$address = \Shippo_Address::
create(
array(
'object_purpose' => 'QUOTE',
'name' => 'John Smith',
'company' => 'Initech',
'street1' => '6512 Greene Rd.',
'city' => 'Woodridge',
'state' => 'IL',
'zip' => '60517',
'country' => 'US',
'phone' => '773 353 2345',
'email' => '[email protected]',
'metadata' => 'Customer ID 23424'
));

return  $address;`

There are no errors, the data return from my ShippingController.php to my AJAX call returns empty objects...

This issue happens for all SHIPPO functions...

$shipments = Shippo_Shipment::create(array( 'address_from'=> $from_address, 'address_to'=> $to_address, 'parcels'=> $parcel, 'async'=> true ));
This also returns an empty object...

I followed the instructions and examples very clearly... and nothing is being returned...

I am using a TEST key from shippo... I have included the SHIPPO_TEST_KEY in my config as per instruction.

I am running Laravel 5.4 btw.

Thank you!

Version not changing

Hello,

I want to use Shippo's old API "2016-10-25". so I set the version using "\Shippo::setApiVersion('2016-10-25');". but version not changing.

How to i change the version of API using Code.

Label URL returns empty string

$transaction = Shippo_Transaction::create( Array(
'rate' => $rate->object_id,
'label_file_type' => 'PDF'
));

Returns a blank label_url. I wanted to retrieve the URL of the Label same with what I have in my shippo dashboard.

Please retract version 1.3.1 because breaking changes!

Thanks for adding namespace support ๐Ÿ‘ But...

You added it in 1.3.1, which is totally against best-practices. Because this is a breaking change, it should be reflected in the version number. Especially since you suggest in the readme to add this package with Composer as version '1.*'

So everyone that added this package in the recommended way and does a composer update, has a completely broken product.

I would advice to retract version 1.3.1, and add a new 2.0.0 version with namespacing support.

ssl certificate issue for localhost (127.0.0.1)

I have tried this api library for php on localhost but getting below metioned error.

Fatal error: Uncaught exception 'Shippo_ApiConnectionError' with message 'Unexpected error communicating with Shippo. If this problem persists, let us know by contacting us through our contact form. (Network error [errno 77]: error setting certificate verify locations: CAfile: /opt/lampp/htdocs/magento/shippo/lib/Shippo/../cacert.pem CApath: none )' in /opt/lampp/htdocs/magento/shippo/lib/Shippo/ApiRequestor.php:282 Stack trace: #0 /opt/lampp/htdocs/magento/shippo/lib/Shippo/ApiRequestor.php(250): Shippo_ApiRequestor->handleCurlError(77, 'error setting c...') #1 /opt/lampp/htdocs/magento/shippo/lib/Shippo/ApiRequestor.php(176): Shippo_ApiRequestor->_curlRequest('post', 'https://api.gos...', Array, Array) #2 /opt/lampp/htdocs/magento/shippo/lib/Shippo/ApiRequestor.php(101): Shippo_ApiRequestor->_requestRaw('post', '/v1/customs/dec...', Array) #3 /opt/lampp/htdocs/magento/shippo/lib/Shippo/ApiResource.php(107): Shippo_ApiRequestor->request('post', '/v1/customs/dec...', Array) #4 /opt/lampp/htdocs/magento/shippo/lib/Sh in /opt/lampp/htdocs/magento/shippo/lib/Shippo/ApiRequestor.php on line 282

Incorrect API response

This can be easily replicated in by running the following test and examining the output in the CurlClient:

$pagesize = 1;
$list = Shippo_Parcel::all(array(
'results' => $pagesize,
'page' => '1'
));

The expected output format according to the documentation is:

{
  "next": null,
  "previous": null,
  "results": [
    {
      "object_state": ...
    },
  ]
}

When the page size is 1 the json fragment is:

{
  "next": null,
  "previous": null,
  "results": {
    "object_state": ...
  }

This causes the test to fail in PHP7.4 because the resulting object is not Countable.

Transactions array provided in order details endpoint is incomplete and incorrect.

Transaction array contained in response received by calling /orders/id endpoint.

 "transactions": [
    {
      "object_id":  "****",
      "object_status": "SUCCESS",
      "label_url": "****",
      "tracking_number":  "****",
      "test": true
    }
  ]

Expected shape of transaction object according to docs https://goshippo.com/docs/reference#transactions

{
  "object_state": "VALID",
  "status": "SUCCESS",
  "object_created": "2022-05-06T13:48:08.807Z",
  "object_updated": "2022-05-06T13:48:10.206Z",
  "object_id": "****",
  "object_owner": "****",
  "test": true,
  "rate": "****",
  "tracking_number": "****",
  "tracking_status": "UNKNOWN",
  "eta": null,
  "tracking_url_provider": "https://tools.usps.com/go/TrackConfirmAction_input?origTrackNum=****",
  "label_url": "****",
  "commercial_invoice_url": null,
  "messages": [],
  "order":  "****",
  "metadata": "****",
  "parcel": "****",
  "billing": {
    "payments": []
  },
  "qr_code_url": null
}

Other information that you might find useful:

  • We are marketplace using oauth
  • Order was created by our marketplace on behalf of the vendor, using vendors oauth token, that we got from shippo.
  • Transaction (Shipping label) was not purchased using oauth, vendor purchased that transaction (Shipping label) from their shippo account.

No Rates available "FROM" other countries "TO" other countries as well as TO United States FROM other countries

I am able to do API call and get rates only FROM "United States" TO "other countries" (Example: San Francisco, California (US) to Other countries). [1]

But I am not able to get rates from other countries to other countries such as FROM France TO Finland and so on. [1]

Citations:
[1] I utilized this sample code and modified them

Other Notes:
Similar to this issue #58 , but I am utilizing to view rates for all integrated shipment deliveries internationally "from" as well as "to" all countries and not simply limited to USPS

1.3.1 cannot find `Shippo_Address`

Calling \Shippo\Shippo_Address::create($params); throws:

FatalThrowableError (E_ERROR)
Class 'Shippo_Address' not found

in Object.php.

The problem is that $class should contain the fully qualified namespace as explained here.

Shippo_Shipment::create() fails with live api key.

I'm getting inconsistent results when swapping between live and test api credentials. Specifically I'm seeing 2 issues:

  1. The shipment rates I get with test keys are very intermittent. Within a minute using the exact same request I've gotten the following:
  • Only USPS Results
  • Only FedEx Results
  • Only FedEx "SmartPost" results

Also of note, with test credentials I've never gotten both USPS and FedEx rates back together.

  1. With the exact same code as above, if I use the production key, an exception is thrown saying the parcel argument must not be empty. I'm not specifying a parcel but instead a parcels array per the get-rates-to-show-customer example.

Here's the relevant code โ€“ I've tried to keep this as generic as possible, its mostly pulled straight from your get-rates-to-show-customer example.

Shippo::setApiKey($live or $test keys);
$from_address = array(
    'name' => 'Mr Hippo',
    'street1' => '215 Clayton St.',
    'city' => 'San Francisco',
    'state' => 'CA',
    'zip' => '94117',
    'country' => 'US',
    'phone' => '+1 555 341 9393',
    'email' => '[email protected]',
);
$to_address = array(
    'name' => 'Ms Hippo',
    'street1' => '2920 Zoo Drive',
    'city' => 'San Diego',
    'state' => 'CA',
    'zip' => '92101',
    'country' => 'US',
    'phone' => '+1 555 341 9393',
    'email' => '[email protected]',
);
$parcel = array(
    'length'=> '5',
    'width'=> '5',
    'height'=> '5',
    'distance_unit'=> 'in',
    'weight'=> '2',
    'mass_unit'=> 'lb',
);
$shipment = Shippo_Shipment::create([
    'address_from' => $from_address,
    'to_address' => $to_address,
    'parcels' => [$parcel],
    'async' => false
]);

When running the above with test keys I get the intermittent results I described, and when running with a like key the following exception is thrown:

{
"message": "{\"parcel\": [\"This field is required.\"]}",
"exception": "Shippo_InvalidRequestError",
"file": "vendor/shippo/shippo-php/lib/Shippo/ApiRequestor.php",
"line": 100,
"trace": [
    {
        "file": "vendor/shippo/shippo-php/lib/Shippo/ApiRequestor.php",
        "line": 154,
        "function": "handleApiError",
        "class": "Shippo_ApiRequestor",
        "type": "->"
    },
    {
        "file": "vendor/shippo/shippo-php/lib/Shippo/ApiRequestor.php",
        "line": 59,
        "function": "_interpretResponse",
        "class": "Shippo_ApiRequestor",
        "type": "->"
    },
    {
        "file": "vendor/shippo/shippo-php/lib/Shippo/ApiResource.php",
        "line": 107,
        "function": "request",
        "class": "Shippo_ApiRequestor",
        "type": "->"
    },
    {
        "file": "vendor/shippo/shippo-php/lib/Shippo/Shipment.php",
        "line": 14,
        "function": "_scopedCreate",
        "class": "Shippo_ApiResource",
        "type": "::"
    },
    {
        "file": "app/Http/Controllers/Api/ShipmentController.php",
        "line": 152,
        "function": "create",
        "class": "Shippo_Shipment",
        "type": "::"
    },
    {
        "function": "quote",
        "class": "App\\Http\\Controllers\\Api\\ShipmentController",
        "type": "->"
    }
]
}

Address is_residential expects real boolean

shippo-php-client/lib/Shippo/ApiRequestor.php > _encodeObjects()

boolean convert to string returns this error when passing in an address with 'is_residential' set to Shippo_Shipment::create():

{"address_to": [{"residential": ["'true' value must be either None, True or False."]}]}

Api expects boolean

ETA in API result is off by 23+ hours because of time zone error

Hi,

The UPS tracking page for 1ZY11A540340532092 says (or said):

Scheduled Delivery: Friday, 12/30/2016 (Estimated Delivery Time: 2:15 P.M. - 6:15 P.M.)

Converting the latest datetime in that "Estimated Delivery Time" range to UTC makes it 2016-12-30 23:15.

If you look at https://api.goshippo.com/v1/tracks/ups/1ZY11A540340532092, the ETA says "2016-12-30T00:00:00Z". Since you are using Zulu time, which is UTC, your API should instead display the ETA as 2016-12-30 23:15.

Your API currently seems inaccurate by 23+ hours!

Am I misunderstanding something? I personally can't use an API that could be off by a whole day. I doubt others could either. Thanks for your help and for your cool service.

where to use sync=True when purchasing a label

Hello,

It's not clear where sync=True should be used when purchasing a label.

This is your code example

//Purchase the desired rate. sync=True indicates that the function will wait until the 
//carrier returns a shipping label before it returns
$transaction = Shippo_Transaction::create(array('rate'=> $rate["object_id"]));

so, should it be used in this way? $transaction = Shippo_Transaction::create(array('rate'=> $rate["object_id"], 'sync' => true));

Thanks

Shippo Will not Sync Woocommerce Orders with Litespeed Cache

I have successfully connected shippo to woocommerce. This connection only worked when litespeed cache was turned off. I have attempted to sync orders and they will not sync if litespeed is turned on. (Obviously)

I am seeing if I can discover the solution from the fiddling with the settings, but if I could receive any advice, perhaps a shippo URI to exclude in cache settings that would be very helpful.

I have object caching enabled with memcached as well.

Article on the Object Cache settings in Wordpress
https://blog.litespeedtech.com/2018/02/07/object-cache-support-in-lscache/

I also added goshippo, api.goshippo & app.goshippo URLs in regular (non-object) cache excludes as well.

Thank you

Shipping Rates is empty from_address BD

If I set
$from_address = array(
'name' => 'Mr Hippo2',
'company' => 'Shippo2',
'country' => 'BD',
'city' => 'Dhaka',
// 'zip' => '1000',
);
it doesn't return the Shipping Rates although I manually added a DHL Express career on Shippo:
https://app.goshippo.com/settings/carriers

But if use default career of shippo with $from_address_country US, it works perfectly.
So, how can I get the shipping rates and tracking status with from BD or IN(india)? Any suggestion would be appreciated...

Issue when using PHP 8.2+

When using PHP 8.2+, you get the following message:

Creation of dynamic property Shippo_ApiRequestor::$_apiKey is deprecated in vendor/shippo/shippo-php/lib/Shippo/ApiRequestor.php on line 12.

While it still works (for now), it will stop working in the future. I quickly looked at the module in question and believe that the declaration (on line 7

[Request] Fluent OOP objects

The current API is pretty difficult to have complete accuracy. It would benefit developers greatly if we could build an address object and using fluent setters provide data. For example:

$from_address = [
   'object_purpose' => 'QUOTE',
    'name' => 'Mr Hippo',
    'company' => 'Shippo',
    'street1' => '215 Clayton St.',
    'city' => 'San Francisco',
    'state' => 'CA',
    'zip' => '94117',
    'country' => 'US',
    'phone' => '+1 555 341 9393',
    'email' => '[email protected]',
];

becomes:

$address = new Shippo\Address();
$address
    ->purpose('QUOTE')
    ->name('Mr Hippo')
    ->company('Shippo')
    ->streetOne('215 Clayton St.')
    ->city('San Francisco')
    ->state('CA')
    ->zip('94117')
    ->country('US')
    ->phone('+1 555 341 9393')
    ->email('[email protected]');

This style improves overall accuracy by removing the need on developers to maintain accurate keys since the object's setter methods do that for us. Reducing the surface area for programmer-error. Further methods could be provided on these to help developers know before sending them over the wire if they are capable of having tasks carried out. For example $address->canBeVerified(); will check the data in-memory against a known list of required attributes. If you're missing zip/state/streetOne then you know it can't be verified before it even goes out if that is the developers intention.

OAuth : Transaction details endpoint gives 404.

  • We are marketplace using oauth
  • Our marketplace created order on behalf of vendor using vendors oauth key.
  • Vendor purchased shipping label (transaction) for that order using shippo dashboard using their shippo order.

When we call /transactions/transaction-id endpoint we are getting 404. The transaction id is correct we got that in response of /orders/order-id endpoint.

The problem only occurs when Oauth is used. When we call the same endpoint with vendors shippo token, we get a valid response. In production we cant ask for vendor shippo token.

Shipment Tracking

class Shippo_Track appears to still reference "v1" which generates an error
PHP Fatal error: Uncaught Shippo_ApiError: Moved Permanently

I am using basic auth and a manual curl to get around this but would be great to use the library

Upgrading to namespaces?

This package looks a bit dated to integrate into our app. Are there any plans to upgrade to >= PHP 5.3 and add name spacing?

PHP7.4 array access violation

PHP7.4 now triggers a notice (which is commonly converted into an ErrorException) when accessing non-arrayable types (int, float, etc).

This causes an exception when trying to fetch shipping rates on line 35:

public static function convertShippoObjectToArray($values)
{
$results = array();
foreach ($values as $k => $v) {
// FIXME: this is an encapsulation violation
if ($k[0] == '_') {

Shippo_CarrierAccount::all filter not working when using carrier => dhl_express

This code returns all my carriers including usps, parcelforce and both dhl_express accounts

Shippo_CarrierAccount::all()

These filters returns the expected result:

Shippo_CarrierAccount::all(array('carrier'=> 'usps'));
Shippo_CarrierAccount::all(array('carrier'=> 'parcelforce'));

While this one returns 0 rows

Shippo_CarrierAccount::all(array('carrier'=> 'dhl_express'));

Empty extra array results in API failure

Setting extra to [] results in a JSON encoded array instead of an object. The Shippo API rejects this format with the following message:

{"shipment": [{"extra": ["Invalid format of the 'extra' object. The accepted format is 'extra': {}"]}]}

Perhaps JSON_FORCE_OBJECT or dropping empty extra parameter could be used to resolve this from the PHP library side.

Something changed recently at the API end because until last week the array format was working, but now all of my calls with an empty array fail. I will manually ensure that no empty array is passed to the PHP client, but thought you should be aware.

This is on version 1.4.3

CURLOPT_FOLLOWLOCATION cannot be activated when an open_basedir is set

Line 232 of ApiRequestor.php has the following:

$curlOptions[CURLOPT_FOLLOWLOCATION] = TRUE;

This setting cannot be used in conjunction with open_basedir, which is enabled on some servers for security reasons.

I set this to FALSE and things seemed to work fine with limited testing. Is there any reason this is needed?

The autoloader expected class "Shippo" to be defined in file

What happened in the newest version? I get the following error:

[RuntimeException]
The autoloader expected class "Shippo" to be defined in file "/var/www/vendor/composer/../shippo/shippo-php/lib/Shippo/Shippo.php". The file was found but the class was not in it, the class name or namespace p
robably has a typo.

Create Shipment with Multiple Parcels not working

the following request works if you have one parcel only if multiple parcels added it returns nothing

curl https://api.goshippo.com/shipments/
-H "Authorization: ShippoToken shippo_test_*********************"
-H "Content-Type: application/json"
-d '{
"address_from": {
"name": "Mr. Hippo",
"street1": "215 Clayton St.",
"city": "San Francisco",
"state": "CA",
"zip": "94117",
"country": "US",
"phone": "+1 555 341 9393",
"email": "[email protected]"
},
"address_to": {
"name": "Mrs. Hippo",
"street1": "965 Mission St.",
"city": "San Francisco",
"state": "CA",
"zip": "94105",
"country": "US",
"phone": "+1 555 341 9393",
"email": "[email protected]"
},
"parcels": [
{
"length": "5",
"width": "5",
"height": "5",
"distance_unit": "in",
"weight": "2",
"mass_unit": "lb"
},
{
"length": "10",
"width": "10",
"height": "10",
"distance_unit": "in",
"weight": "2",
"mass_unit": "lb"
}
],
"async": false
}'

Installing Shippo PHP Manually

Is there a way to install the Shippo PHP files manually without Composer or Laravel? I uploaded the files manually, but I get an error when I run the examples: Warning: require_once(/var/www/html/shippo/examples../../vendor/autoload.php): failed to open stream: No such file or directory. I'm not familiar with Composer or Laravel and have not been able to get Composer to work.

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.