Giter Site home page Giter Site logo

intuit / quickbooks-v3-php-sdk Goto Github PK

View Code? Open in Web Editor NEW
238.0 29.0 240.0 6.34 MB

Official PHP SDK for QuickBooks REST API v3.0: https://developer.intuit.com/

License: Apache License 2.0

PHP 91.06% Shell 0.01% HTML 8.61% CSS 0.14% XSLT 0.18%
integration quickbooks-online-php-sdk quickbooks hacktoberfest hacktoberfest2020

quickbooks-v3-php-sdk's Introduction

Payments SDK is now available at: https://github.com/intuit/PHP-Payments-SDK

Rate your SDKYesNo

QuickBooks API PHP SDK

PHP client for connecting to the QuickBooks Online V3 REST API.

To find out our documentation, visit: https://intuit.github.io/QuickBooks-V3-PHP-SDK/

For current known issues and progress for PHP SDK, please refer to the wiki page: https://github.com/intuit/QuickBooks-V3-PHP-SDK/wiki

Create, Update, Read, and Delete Examples: https://github.com/IntuitDeveloper/SampleApp-CRUD-PHP/tree/master/CRUD_Examples

Help: Support
Documentation: Documentation
Continuous Integration: Build status
Latest Stable Version: Latest Stable Version
License: License

quickbooks-v3-php-sdk's People

Contributors

abhilashwebnapp avatar abisalehalliprasan avatar alexjeen avatar becquerel avatar bitsbyjerome avatar bsivalingam avatar challgren avatar dmaksimov avatar emelnychenko avatar evanhsu avatar grawlins avatar hlu2 avatar jacobembree avatar jaydiablo avatar jimmypuckett avatar jtsternberg avatar kevinsmith avatar latik avatar lukereimer avatar michaellatham avatar murilopereirame avatar presscot avatar raistlfiren avatar rkasaraneni20 avatar sharkbit avatar smxdevst avatar ssfinney avatar strangel00p avatar sujitharamadass avatar veritasdigitalis 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

quickbooks-v3-php-sdk's Issues

ServiceContext->UsePlatformServices results in a blank baseserviceURL in $this->context

Edited:

I believe I have found the source of the problem. Please see comment below for what I think is the issue.

context:

I'm not sure if this is me doing something wrong or if the SDK is not working. However I am trying to implement a disconnect from QBO button in the app that I'm working on and after setting up the following

// my other code that contains my keys and stuff above ^^^

$dataServiceConfig = [
    'auth_mode' => 'oauth1',
    'consumerKey' => OAUTH_CONSUMER_KEY,
    'consumerSecret' => OAUTH_CONSUMER_SECRET,
    'accessTokenKey' => $authToken,
    'accessTokenSecret' => $authTokenSecret,
    'QBORealmID' => $realmId,
    'baseUrl' => "https://sandbox-quickbooks.api.intuit.com/"
];

$serviceContext = ServiceContext::ConfigureFromPassedArray($dataServiceConfig);

$platformService = new PlatformService($serviceContext);

// everything from this point on fails and outputs NULL
$Respxml = $platformService->CurrentUser();
var_dump($Respxml);

$Respxml = $platformService->Disconnect();
var_dump($Respxml);

I'm not sure if this is because what i've done and how i've initialized the instance of PlatformService is incorrect or if the PlatformService class itself is broken. so i looked into the logs to see what was happening and this is what i got out of them

RESPONSE URI FOR SEQUENCE ID 01497
==================================
v1/Connection/Disconnect

RESPONSE HEADERS
================


RESPONSE BODY
=============


==================================
v1/user/current

RESPONSE HEADERS
================


RESPONSE BODY
=============


a typical response looks like this for me

RESPONSE URI FOR SEQUENCE ID 01485
==================================
https://sandbox-quickbooks.api.intuit.com/v3/company/__ID_hidden__/query?minorversion=4

RESPONSE HEADERS
================
Server: nginx
Content-Type: application/xml;charset=UTF-8
... some other stuff i've decided to hide bla bla

RESPONSE BODY
=============
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>... the rest of the response goes here


the typical response has a DataService object initiated in this way

$dataServiceConfig = [
    'auth_mode' => 'oauth1',
    'consumerKey' => OAUTH_CONSUMER_KEY,
    'consumerSecret' => OAUTH_CONSUMER_SECRET,
    'accessTokenKey' => $authToken,
    'accessTokenSecret' => $authTokenSecret,
    'QBORealmID' => $realmId,
    'baseUrl' => "https://sandbox-quickbooks.api.intuit.com/"
];

$dataService = DataService::Configure($dataServiceConfig);

Thanks for the help!

(1/1) SdkException cURL error during making API call. cURL Error Number:[60] with error:[SSL certificate problem: self signed certificate in certificate chain]

Good day I just installed the library on laravel using composer and deployed it on my https server.

I just copy pasted the example for Oauth2:

use QuickBooksOnline\API\DataService\DataService;

$dataService = DataService::Configure(array(
         'auth_mode' => 'oauth2',
         'ClientID' => "Q0XG3aA8zb7WQbKURFRISkt3QrWJxgWGS1jRF2l3nYtM6dOw2h",
         'ClientSecret' => "34z5qBRskA161AaKDadGAiY4ojz8TXX9RsSfu0E1",
         'accessTokenKey' => 'eyJlbmMiOiJBMTI4Q0JDLUhTMjU2IiwiYWxnIjoiZGlyIn0..4z4Assj4x1qt8H4DtQco6A.nmV2jTxaDMVdFWEUO16q5qhbd5aD6U-U-RYnSNywqg-HPC_3_jvwpMJU1a1S5X-PgPUy60WvVy_8p1awY7kIoFzTV4IhdFLrZpYtBUGCjcsvjxWeOSgP6oCayBEmCv7zzabtgB6vxU46jQqKX2IXYUGPPtyYO64hrgELFR4SKUK6boZiVnh8z19gnvsReKMmIINA3-NgC6QJqMRp6HWgzCa9RuDN9tCtrAK2dy5xmJRNSNgdv_gyg1bfdX4l4b30fLPzFk31fsTT9NTJq9PuGtdTsvUuCj7Hme6HPldD9TKYRXWU8TKrQQrQWEpdlbPr6F3rhP6IdmCv9t1XH_WzF_1IseRUoYhiTUjubig-j8gzwajIdYQTzpJQKJ92QiAEyt8k40WWg0v69hEC0w7WRBuUE-IJ50xWypqS_P28IWt1G14rovZ97soGOteSik-41g1icR2zxfNhXGq7zO7oU5B8r-ej5Pb52T0MCMktgd6y32bqwo2pcEzblL2bZs7DZ7LDx5peY4TIfGW21crTE6xjhRr7LdqB8K505pRqIOP20eaRgwtGHLZ3bdBt1_negw2AGjc409BM0nLzzmODxr3yo-YdGwkcOjm5QgbGAsrnpoSo9tSpxPHoN0vMRneRdsKCd6CZG5M1OIOMuj7spkm442tvwiAMCx2Fh-STG6fMnhOq7l_f8NW_3kscxtF2.obQxJKjPfi1KlaQQ_OUoNg',
         'refreshTokenKey' => "L011509163184Q0K7DT40SVXhJXAfyoj6B6EbSr3Ty64yVvF5A",
         'QBORealmID' => "123145862616089",
         'baseUrl' => "https://sandbox-quickbooks.api.intuit.com"
        ));
        $dataService->setMinorVersion("9");
        $dataService->disableLog();

        $CompanyInfo = $dataService->getCompanyInfo();
        $error = $dataService->getLastError();
        if ($error != null) {
            echo "The Status code is: " . $error->getHttpStatusCode() . "\n";
            echo "The Helper message is: " . $error->getOAuthHelperError() . "\n";
            echo "The Response message is: " . $error->getResponseBody() . "\n";
            echo "The Intuit Helper message is: IntuitErrorType:{" . $error->getIntuitErrorType() . "} IntuitErrorCode:{" . $error->getIntuitErrorCode() . "} IntuitErrorMessage:{" . $error->getIntuitErrorMessage() . "} IntuitErrorDetail:{" . $error->getIntuitErrorDetail() . "}";
        } 

I just also installed SSL on my server too..

how do I fix this please.

Call to undefined method (...) SyncRestHandler::GetResponse()

vendor/quickbooks/v3-php-sdk/src/PlatformService/PlatformService.php (line 116): Call to undefined method QuickBooksOnline\API\Core\HttpClients\SyncRestHandler::GetResponse()

PlatformService has several calls to GetResponse... I believe they should be sendRequest()

Invalid auth/bad request (got a 400, expected HTTP/1.1 20X or a redirect)

I am getting below error when we create a service type products using API call. This error comes when we call API first time and if I can call same API again then it will work fine. please tell me where I was wrong.
Please help me on this how can i resolve it.

`Invalid auth/bad request (got a 400, expected HTTP/1.1 20X or a redirect)Array
(
    [0] => 400
    [1] => <?xml version="1.0" encoding="UTF-8" standalone="yes"?><FaultInfo xmlns="http://www.intuit.com/sb/cdm/baseexceptionmodel/xsd"><Message>Bad Request</Message><ErrorCode>400</ErrorCode><Cause>CLIENT</Cause></FaultInfo>
    [2] => Array
        (
            [Server] => nginx
            [Content-Type] => application/xml
            [Content-Length] => 215
            [Connection] => close
            [Strict-Transport-Security] => max-age=15552000
            [intuit_tid] => a206578a-7d0d-d8d9-89ed-f6e36510c7c8
            [Vary] => Accept-Encoding
        )

)`

My Code is
$itemObj = new IPPItem();
$itemObj->Name = 'discountAtCorcrm';
$itemObj->PurchaseCost = 0;
$itemObj->UnitPrice = 0;
$itemObj->Taxable = 'false';
$itemObj->SalesTaxIncluded = 'false';
$itemObj->Type = 'Service';
$obj = new IPPReferenceType();
$obj->value = $AccountId;
$itemObj->IncomeAccountRef = $obj;
try{
$resultingCustObj = $dataService->Add($itemObj);
$quickbooks_pid = $resultingCustObj->Id;

} catch (Exception $e){		
	$errors .= "\n".$name." product add exception:";
	$errors .= "Error Message:".$e->getMessage();
}

Disconnect/Reconnect Fails with Error code 22, "Authentication required"

After locally resolving the issue reported in issue #35 I found there is a further issue preventing successful Disconnect/Reconnect calls (or any IPP call that requires the OAuth headers).

When using PlatformService, the service context is overridden to IPP to ensure the correct endpoint is called:

        // Set the service type to IPP by calling a method
        $this->serviceContext->UsePlatformServices();

Issue here is that in SyncRestHandler, the sendRequest() function does not set the required headers for these IPP context calls (only the user agent is set), hence the OAuth credentials being discarded from the request and the resulting Error code 22 "Authentication required":

if (CoreConstants::IntuitServicesTypeQBO ==$this->context->serviceType) {
            // IDS call
            $httpHeaders = array(
                'Authorization' => $AuthorizationHeader,
                'host'          => parse_url($requestUri, PHP_URL_HOST),
                'user-agent'    => CoreConstants::USERAGENT,
                'accept'        => $this->getAcceptContentType($requestParameters->ContentType),
                'connection'    => 'close',
                'content-type'  => $requestParameters->ContentType,
                'content-length'=> strlen($requestBody)
            );

            // Log Request Body to a file
            $this->RequestLogging->LogPlatformRequests($requestBody, $requestUri, $httpHeaders, true);

            if ($requestBody && $this->RequestCompressor) {
                $this->RequestCompressor->Compress($httpHeaders, $requestBody);
            }

            if ($this->ResponseCompressor) {
                $this->ResponseCompressor->PrepareDecompress($httpHeaders);
            }
        } else {
            // IPP call
            $httpHeaders = array('user-agent' => CoreConstants::USERAGENT);
        }

Regards,

Mark

Cannot install via composer

I just tried to install this but got the following error:

 [ErrorException]
 ZipArchive::extractTo(C:\Users\Bastien\SoapSaltsAndScents\SoapsSaltsAndScents/vendor/composer/cb5a4ab7/intuit-Quick
 Books-V3-PHP-SDK-d711124\src\XSD2PHP\test\data\expected\ContactCompany\oasis\names\specification\ubl\schema\xsd\Com
 monAggregateComponents_2/AccountingCustomerParty.php): failed to open stream: No such file or directory

How can I update the TaxRate using PHP SDK

I want to update the TaxRate value of existing TaxRate in Quickbooks Online using PHP SDK. I am not able to do that . Please Help me on this how can i update it.
currently i am doing below scenario ---

function updateTaxRate($taxRateId, $taxRate){
$taxRateArray = $dataService->Query("select * From TaxRate where Id= '$taxRateId'");
$taxRateObject = current($taxRateArray);
$taxRateObject->RateValue = $taxRate;
try{
$resultingTaxRateObj = $dataService->Add($taxRateObject);
}
catch(Exception $e){
echo $e->getMessage();
}
}
 

it throwing below error.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
   <IntuitResponse xmlns="http://schema.intuit.com/finance/v3" time="2017-07-13T02:25:41.779-07:00">
  <Fault type="ValidationFault">
  <Error code="500" element="Operation">
         <Message>Unsupported Operation</Message>
         <Detail>Operation Update is not supported.</Detail>
   </Error>
</Fault>
</IntuitResponse>

Php2Xml should throw an exception if invalid entity is passed ?

I was creating an invoice, and passed DateTime instance, instead of the invoice date as a string. Php2Xml just threw a notice when trying to process the entity. Am I correct to assume that only entities that have IPPIntuitEntity as a parent can be processed ? If so, it would be nice if we can get an actual exception when invalid entity is passed, instead of notice and silent fail

HTML entities

We encountered an issue in Php2Xml.php when it creates a DOM element here with HTML chars. Fix we did:

Old:

$el = $this->dom->createElement($code.":".$propDocs['xmlName'], $value);

Fix:

$el = $this->dom->createElement($code.":".$propDocs['xmlName'], htmlspecialchars($value));

Vendor facade is missing

I have duplicated and modified VendorCredit facade in the meantime, but shouldn't there be a Vendor facade??

Installation Failed when trying to install PHP SDK

@hlu2
I am trying to install PHP SDK through composer and every time i try to run command "composer require quickbooks/v3-php-sdk"
after 100% download i am seeing an error of installation failed.

i have also installed oauth extension and enabled this. (which i know is not required after 3.2.4)

Please see attached screenshots of OAuth and Error
installation_failed
oauth

IPPFault not parsed

It would be nice, if there is an API error to parse the response into an IPPFault. I've tried to use XmlObjectSerializer::Deserialize($response). Looks like on line 239 of XmlObjectSerializer there is code to return null if it encounters a Fault.

Class 'DataService' not found

I install the quickbook sdk in my codeignater project from this command.

$ composer require quickbooks/v3-php-sdk
$ composer update

it create the sdk in the vendor folder

when i call from my controller

$configpath = '../vendor/quickbooks/v3-php-sdk/src/sdk.config';
$dataService = DataService::Configure($configpath);

it return me Fatal error Class 'DataService' not found

JSON Decoding Issue for Non-TaxSerivce API endpoint

On DataService.php file, Line 588:

  $this->verifyOperationAccess($entity, __FUNCTION__);
        if ($this->isJsonOnly($entity)) {
            $this->forceJsonSerializers();
        }

Once Json is used, it never switch back to XML. Causing some issue for later entities.
Will fixed in next release.

Thanks
Hao

API minor version default not compatible with IPPSalesFormsPrefs properties

With API minor version upgraded to v8 in last release, a problem with pulling preferences has cropped up.

It looks like a new parameter was added (EmailCopyToCompany) that isn't yet defined in the IPPSalesFormsPrefs class in the SDK.

Details of new parameter:

https://developer.intuit.com/docs/0100_quickbooks_online/release_notes/quickbooks_api_release_notes#/section_5

Error message:

Property EmailCopyToCompany does not exist. Class QuickBooksOnline\API\Data\IPPSalesFormsPrefs

replace ext-oauth

It would be nice to see this SDK be less dependant on ageing PECL libararies, and more compliant with real-world modern PHP standards such as PSR-4

Recommend replacing ext-oauth with https://github.com/FriendsOfSymfony/oauth2-php as soon as reasonably possible.

Good SDK's don't force users to install extensions, they use composer libraries.

This is not either A) a good SDK B) A well documented SDK.

It's basically just a dirty clone of the .net and java sdk's. Intuit is treating PHP developers as second class citizens. Not OK.

DataService download capabilities

Similar to the issue logged in #43 where uploads specifically reference image files, the DataService class contains 2 "download" functions:

  1. Download -> this appears to just be an alias of FindById at the moment, so makes things a little confusing, since one would perhaps expect that this would be the respective companion to the Upload function, and thus be used to download an Attachable item.

  2. DownloadPDF -> this appears to be a download handler for downloading pdf versions of IPPSalesReceipt, IPPInvoice and IPPEstimate types.

So at present, at a glance, it appears there is no support for downloading Attachables? Can that be added?

Regards,

Mark

OAuth2 Support

Correct me if i am wrong; OAuth2 is not yet supported by this library right?

When can we expect that to work?

Is there an alternate library built for OAuth2 yet for QuickBooks integration?

Reconnect fails due to incomplete changes in commit 12856b6

Unable to run reconnect to replenish expiring oauth access tokens.

Call to Reconnect() function in PlatformService returns:

Call to undefined method QuickBooksOnline\API\Core\HttpClients\SyncRestHandler::GetResponse()

It appears that in commit 12856b6 the function GetResponse() in src/Core/HttpClients/SyncRestHandler.php was renamed to sendRequest(), though only around half of the respective calls to GetResponse() were updated to reflect this (DataService looks good, but PlatformService was missed, as well as a single reference missed in SyncRestHandler too, inside the CallRestService() function).

Regards,

Mark

Error when oauth extension is not loaded

The code still contains references to OAUTH constants and will not work if the oauth extension is not loaded.

I submitted a pull request which fixes this issue

PHP version and coding style

This isn't much of an issue, it is more about general direction of this library/package, but I'm not sure where is a better place to put this. I have been working with QB SDK for past couple weeks, and I will for few more, so I am happy to push few pull requests here and there if I run into anything that helps me (because it could help somebody else too)

However (so far I have made only couple bugfixes and typos and PHPDoc comments), I would like to clear up few things. I will write my suggestions, but I am ok to adhere to decisions @hlu2 or community will agree on.

  1. code style. Currently, library is kind of a mix of all different styles, weird indentation in many places. I would propose using PSR-1 and PSR-2 standards going forward where possible. I understand, that not everything can be updated due to BC breaks (for example method names on DataService like public function Query(...) - changing these to follow PSR would break many apps out there), but in the places where it is possible, I would suggest using PSR as much as possible (while 100% maintaining backwards compatibility of a public methods)

  2. PHP version. Most of the code is PHP 5.3 compatible. However, in composer.json, min. supported PHP version is 5.6.0 and this is even mentioned in docs. Can we use the full 5.6.0 feature set going forward ? Or should we stick to 5.3.0 ? This is a tough call, package would not even install using composer, but people may still download it manually and use it (even though, nobody should be really using php 5.3 nowadays anymore ...). I would recommend allowing at least 5.5 (this by itself would allow some deeper refactoring and making the code more maintainable due to short array syntax, perhaps traits and ::class for class name resolutions, instead of strings). 5.6 seems reasonable to me, since even docs mention it as a requirement.

  3. removing commented code. There are instances where old code that should no longer be active is just commented out. While this makes kind of sense for library not on github (or version controlled in general), I would propose removing all unused code / variables / etc., to make code more readable (commented code rarely makes it back to production anyway, and if there is a need to bring it back, we have git history for that)

I would have more ideas, but I think this is more than enough for start

PHP 7?

This package requires OAuth v1.2.3, which is only available up to php 5.6. Does this work with php 7.x?

difficult to debug 404 issues

Apart from the fact that the API endpoints frequently return HTML despite the "accept" header being set to "application/xml" or "application/json", it really isn't fun trying to figure out why I'm getting a 404.

In my case it was a silly mistake - I was including /v3/ on the end of the API url, and once I dumped the URI from your library I could see it was added twice. It took a damn long time to find this tho.

Better debugging of endpoint issues would be great - and it will probably save you all a lot of time in providing support to people having problems with this SDK.

DataService SendEmail does not attach PDF invoice

The invoice gets emailed and the email references an attached invoice but there is only the link, not an actual PDF attached.
I call something like this:
$qb_client->SendEmail($theInvoice,$customer['email']);

Unable to create expense record with more than 1 ItemBasedExpenseLineDetail line

Unclear whether this is an issue with the SDK, or with the API itself...

I am finding that when using the PurchaseFacade class, creating an expense with a single line with a DetailType of ItemBasedExpenseLineDetail works fine. As soon as I add a 2nd line of the same type (even with the exact same data), the API returns an error, as follows:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<IntuitResponse xmlns="http://schema.intuit.com/finance/v3" time="2017-07-21T05:49:29.312-07:00">
    <Fault type="ValidationFault">
        <Error code="6000" element="">
            <Message>A business validation error has occurred while processing your request</Message>
            <Detail>Business Validation Error: We're sorry, QuickBooks encountered an error while calculating tax. Try reselecting the tax rate or reentering the product/service item and saving the form again. &lt;a href='https://support.qbo.intuit.com/support/help-article.cfm?faq_id=5558&amp;locale=en_GB' target=&quot;_blank&quot; title=&quot;Help&quot;&gt;Please click here for more information&lt;/a&gt;</Detail>
        </Error>
    </Fault>
</IntuitResponse>

Prior to calling the Add function on the DataService, I've captured the state of the object returned by the PurchaseFacade::create function, as follows. in case it helps to debug:

QuickBooksOnline\API\Data\IPPPurchase Object
(
    [AccountRef] => QuickBooksOnline\API\Data\IPPReferenceType Object
        (
            [name] => 
            [type] => 
            [value] => 81
        )

    [PaymentMethodRef] => 
    [PaymentRefNum] => 
    [PaymentType] => QuickBooksOnline\API\Data\IPPPaymentTypeEnum Object
        (
            [value] => Cash
        )

    [CheckPayment] => 
    [CreditCardPayment] => 
    [EntityRef] => QuickBooksOnline\API\Data\IPPReferenceType Object
        (
            [name] => 
            [type] => 
            [value] => 23
        )

    [Credit] => 
    [RemitToAddr] => 
    [TotalAmt] => 
    [Memo] => 
    [PrintStatus] => 
    [GlobalTaxCalculation] => QuickBooksOnline\API\Data\IPPGlobalTaxCalculationEnum Object
        (
            [value] => TaxExcluded
        )

    [PurchaseEx] => 
    [DocNumber] => 
    [TxnDate] => 2017-07-21
    [DepartmentRef] => 
    [CurrencyRef] => 
    [ExchangeRate] => 
    [PrivateNote] => 
    [TxnStatus] => 
    [LinkedTxn] => 
    [Line] => Array
        (
            [0] => QuickBooksOnline\API\Data\IPPLine Object
                (
                    [Id] => 
                    [LineNum] => 
                    [Description] => Employee training off site
                    [Amount] => 10
                    [LinkedTxn] => 
                    [DetailType] => QuickBooksOnline\API\Data\IPPLineDetailTypeEnum Object
                        (
                            [value] => ItemBasedExpenseLineDetail
                        )

                    [PaymentLineDetail] => 
                    [DiscountLineDetail] => 
                    [TaxLineDetail] => 
                    [SalesItemLineDetail] => 
                    [DescriptionLineDetail] => 
                    [ItemBasedExpenseLineDetail] => QuickBooksOnline\API\Data\IPPItemBasedExpenseLineDetail Object
                        (
                            [CustomerRef] => 
                            [BillableStatus] => 
                            [TaxInclusiveAmt] => 
                            [ItemBasedExpenseLineDetailEx] => 
                            [ItemRef] => QuickBooksOnline\API\Data\IPPReferenceType Object
                                (
                                    [name] => 
                                    [type] => 
                                    [value] => 5
                                )

                            [ClassRef] => 
                            [UnitPrice] => 10
                            [RatePercent] => 
                            [PriceLevelRef] => 
                            [MarkupInfo] => 
                            [Qty] => 1
                            [UOMRef] => 
                            [ItemAccountRef] => 
                            [InventorySiteRef] => 
                            [TaxCodeRef] => QuickBooksOnline\API\Data\IPPReferenceType Object
                                (
                                    [name] => 
                                    [type] => 
                                    [value] => 3
                                )

                        )

                    [AccountBasedExpenseLineDetail] => 
                    [DepositLineDetail] => 
                    [PurchaseOrderItemLineDetail] => 
                    [SalesOrderItemLineDetail] => 
                    [ItemReceiptLineDetail] => 
                    [JournalEntryLineDetail] => 
                    [GroupLineDetail] => 
                    [SubTotalLineDetail] => 
                    [TDSLineDetail] => 
                    [CustomField] => 
                    [LineEx] => 
                )

            [1] => QuickBooksOnline\API\Data\IPPLine Object
                (
                    [Id] => 
                    [LineNum] => 
                    [Description] => Employee training off site
                    [Amount] => 10
                    [LinkedTxn] => 
                    [DetailType] => QuickBooksOnline\API\Data\IPPLineDetailTypeEnum Object
                        (
                            [value] => ItemBasedExpenseLineDetail
                        )

                    [PaymentLineDetail] => 
                    [DiscountLineDetail] => 
                    [TaxLineDetail] => 
                    [SalesItemLineDetail] => 
                    [DescriptionLineDetail] => 
                    [ItemBasedExpenseLineDetail] => QuickBooksOnline\API\Data\IPPItemBasedExpenseLineDetail Object
                        (
                            [CustomerRef] => 
                            [BillableStatus] => 
                            [TaxInclusiveAmt] => 
                            [ItemBasedExpenseLineDetailEx] => 
                            [ItemRef] => QuickBooksOnline\API\Data\IPPReferenceType Object
                                (
                                    [name] => 
                                    [type] => 
                                    [value] => 5
                                )

                            [ClassRef] => 
                            [UnitPrice] => 10
                            [RatePercent] => 
                            [PriceLevelRef] => 
                            [MarkupInfo] => 
                            [Qty] => 1
                            [UOMRef] => 
                            [ItemAccountRef] => 
                            [InventorySiteRef] => 
                            [TaxCodeRef] => QuickBooksOnline\API\Data\IPPReferenceType Object
                                (
                                    [name] => 
                                    [type] => 
                                    [value] => 3
                                )

                        )

                    [AccountBasedExpenseLineDetail] => 
                    [DepositLineDetail] => 
                    [PurchaseOrderItemLineDetail] => 
                    [SalesOrderItemLineDetail] => 
                    [ItemReceiptLineDetail] => 
                    [JournalEntryLineDetail] => 
                    [GroupLineDetail] => 
                    [SubTotalLineDetail] => 
                    [TDSLineDetail] => 
                    [CustomField] => 
                    [LineEx] => 
                )

        )

    [TxnTaxDetail] => 
    [TxnSource] => 
    [TaxFormType] => 
    [TaxFormNum] => 
    [TransactionLocationType] => 
    [Id] => 
    [SyncToken] => 
    [MetaData] => 
    [CustomField] => 
    [AttachableRef] => 
    [domain] => 
    [status] => 
    [sparse] => 
)

Regards,

Mark

No method for grabbing access token from authorization code!

I'm surprised this is missing considering you cant access the API without this step.

How are you supposed to exchange the authorization code for the access token?

There is a method for REFRESHING an existing code, which is nice, but the SDK is completely silent on the issue of grabbing the token in the first place.

Consider the following methods:

    public function refreshToken(){
       $theAccessToken = $this->getAccessToken();
       $refreshToken =$theAccessToken->getRefreshToken();
       $refreshTokenEndpoint = CoreConstants::OAUTH2_TOKEN_ENDPOINT_URL;
       $http_header = $this->constructRefreshTokenHeader();
       $requestBody = $this->constructRefreshTokenBody($refreshToken);
       $intuitResponse = $this->curlHttpClient->makeAPICall($refreshTokenEndpoint, CoreConstants::HTTP_POST, $http_header, $requestBody, null, true);
       $this->closeConnection();
       $faultHandler = $intuitResponse->getFaultHandler();
       if(isset($faultHandler)) {
             $this->faultHandler = $faultHandler;
             return null;
       }else{
          $this->accessToken = $this->parseNewAccessTokenFromResponse($intuitResponse->getBody());
          return $this->getAccessToken();
       }
    }

This uses the following method to build the request body:

    private function constructRefreshTokenBody($refresh_token){
        $parameters = array(
          'grant_type' => CoreConstants::OAUTH2_REFRESH_GRANTYPE,
          'refresh_token' => $refresh_token
        );
        return http_build_query($parameters);
    }

As you can see the grant_type is set to 'refresh_token' via the OAUTH2_REFRESH_GRANTYPE constant.

According to the documentation, the following body is required to exchange the authorization code for the access token:

POST https://oauth.platform.intuit.com/oauth2/v1/tokens/bearer HTTP/1.1
Accept: application/json
Authorization: Basic UTM0dVBvRDIwanp2OUdxNXE1dmlMemppcTlwM1d2
    NzRUdDNReGkwZVNTTDhFRWwxb0g6VEh0WEJlR3dheEtZSlVNaFhzeGxma1l
    XaFg3ZlFlRzFtN2szTFRwbw==
Content-Type: application/x-www-form-urlencoded
Host: oauth.platform.intuit.com
Body: grant_type=authorization_code&
code=L3114709614564VSU8JSEiPkXx1xhV8D9mv4xbv6sZJycibMUI&
redirect_uri=https://www.mydemoapp.com/oauth-redirect

So what gives? Why is the PHP SDK silent on such a crucial step? Am I supposed to manually implement this singular call while the rest is handled by the SDK? If so why, because that just feels kinda gross.

If you want, I can just implement it and submit a pull request, but I don't want to go through the trouble if it will be rejected.

Throttle Limits Exceeded

When I am pushing data from my web application to QuickBooks Online using PHP-SDK-V3 and I am getting below errors, can anyone face this error before ,if yes so please help me on this how can i overcome this issue.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<IntuitResponse time="2017-07-30T22:45:22.933-07:00" xmlns="http://schema.intuit.com/finance/v3">
    <Fault type="SERVICE">
        <Error code="3001">
            <Message>message=ThrottleExceeded; errorCode=003001; statusCode=429</Message>
            <Detail>The request limit was reached.  Try again later</Detail>
        </Error>
    </Fault>
</IntuitResponse>

OAuth set-up sample

All current samples use hard coded values for access token key/ secret and realm ID. A sample showing how to request this vital information from QB would be very useful.

DataService FindById Company/CompanyInfo handling is unusual

The DataService FindById code has special handling for Company/CompanyInfo entities. It seems the intention here is to handle the unusual state where the Company/CompanyInfo entity id isn't set as you may expect (i.e. it does not match the realmId, and seems to be set to 1 in most cases).

        elseif ((strtolower('company') == strtolower($urlResource)) ||
            (strtolower('companyinfo') == strtolower($urlResource))
        ) {
            // FindById semantics for CompanyInfo are unusual.  Handle via special case.
            $allEntities = $this->FindAll('Company');
            foreach ($allEntities as $oneCompany) {
                if (0 == strcmp($oneCompany->Id, $entity->Id)) {
                    return $oneCompany;
                }
            }

            return null;
        } else {
            // Normal case
            $uri = implode(CoreConstants::SLASH_CHAR, array('company', $this->serviceContext->realmId, $urlResource, $entityId));
        }

Issue here is with the conditional statement in there looping through the results and checking the entity id...the fact that it's actually checking the id matches the entity id provided renders the code pointless - if the user is aware of the "real" entity id, then there is no need for the "FindAll" workaround, since running the "Normal case" against the companyinfo urlResource would suffice.

My guess is that the ideal scenario here would be to remove the need to pass any id in the case of Company/CompanyInfo types, and have it simply return the one result found when calling FindAll('CompanyInfo')? This is on the assumption that you will only ever have one CompanyInfo record - I may well be wrong here, but all the examples I can find seem to have different approaches to pulling CompanyInfo data, so it's hard to tell.

Regards,

Mark

DataService Upload Encoding

The QuickBooksOnline\API\DataService\DataService class contains an Upload function.

The function appears to work, but has a few minor issues:

  1. Comments/Params/Variables specifically references "image" uploads, though many other MIME types are supported.
  2. Content-Transfer-Encoding is set to base64. Whilst this may come in handy at times, it may be better to avoid this in a production system if not required, due to the 33% network overheads when transmitting binary data as base64.

Regards,

Mark

No way to disable logging

Using the function ServiceContext->disableLog() does nothing as the LoggerBase class takes none of your settings into account. It always uses the CoreConstants::DEFAULT_LOGGINGLOCATION (which is also wrong as it tries to write to /tmp/IdLogsexecutionlog.txt and not /tmp/IdLogs/executionlog.txt like the documentation says). The LoggerBase classs also has no check to see if the user has disabled it before attempting to write to the file.

IPPLine has no external reference field

PROBLEM: There's currently no way to set an external reference (i.e. corresponding line item number in a different application) in the IPPLine class.

DESCRIPTION: The framework doesn't allow matching line items to external "equivalent" line items (i.e. the same line items in a different system than QuickBooks itself). I would say this could be done by reloading the invoice after creating it then cycling through the line items and saving their respective reference back to our system, but there's no way to identify which line item is which unless you compare "like" attributes, which is dicey at best.

PROPOSED SOLUTION: Add an external reference field ("ExternalRef" maybe), or a "MISC" field to hold meta-data. This is what CustomField is for, but it's not usable in QBO.

XML Date is not validated correctly

When the Request is in XML format, there is an bug on QBO for all the date related field. If the date is in the "wrong" format, like "2017/07/21", QBO will not throw an exception. However, It will not be able to convert it to the correct format. It will ignore the date developers append to it and use current date.

I will add a XML validator on the client side to make sure everything is correct.

PHP SDK Error on Mac os

The Status code is: 400 The Helper message is: Invalid auth/bad request (got a 400, expected HTTP/1.1 20X or a redirect)
The Response message is: {"Fault":{"Error":[{"Message":"Error parsing query","Detail":"
QueryParserError: The query provided was empty","code":"4000"}],"type":"ValidationFault"},"time":"2017-04-18T06:05:13.189-07:00"}

Passing array of $object to facade will cause an internal exception

In the facade objects creation, when passing an array of objects to the Create message, the code will break. For example, below code will work:

$lines = array();

for($i= 1; $i <= 3; $i++){
$LineObj = Line::create([
"Id" => $i,
"LineNum" => $i,
"Amount" => 100 * $i,
"DetailType" => "SalesItemLineDetail",
"Description" => "This is the " . $i . " description",
"SalesItemLineDetail" => [
"ItemRef" => [
"value" => "1",
"name" => "Services"
]
]
]);
$lines[] = $LineObj;
}

//Add a new Invoice
$theResourceObj = Invoice::create([
"CustomerRef"=> [
"value"=> "1"
],
"BillAddr" => [
"Line1" => "4555 test dri",
"City" => "Mountain View",
"CountrySubDivisionCode" => "CA",
"PostalCode" => "94089"
]
]);
$theResourceObj->Line = $lines;

but

$lines = array();

for($i= 1; $i <= 3; $i++){
$LineObj = Line::create([
"Id" => $i,
"LineNum" => $i,
"Amount" => 100 * $i,
"DetailType" => "SalesItemLineDetail",
"Description" => "This is the " . $i . " description",
"SalesItemLineDetail" => [
"ItemRef" => [
"value" => "1",
"name" => "Services"
]
]
]);
$lines[] = $LineObj;
}

//Add a new Invoice
$theResourceObj = Invoice::create([
"Line" => $lines,
"CustomerRef"=> [
"value"=> "1"
],
"BillAddr" => [
"Line1" => "4555 test dri",
"City" => "Mountain View",
"CountrySubDivisionCode" => "CA",
"PostalCode" => "94089"
]
]);
will not.

Fix it in the next release

ServiceContext::ConfigureFromPassedArray leaves IppConfiguration->baseUrl->Ipp NULL

Configuring ServiceContext using ServiceContext::ConfigureFromPassedArray() leaves platform services base URL null. So using that ServiceContext to initialize a PlatformService and make a request fails because the URL for IPP is invalid.

This is inconsistent with configuring from sdk.config file which passes an "ipp" value of "https://appcenter.intuit.com/api/" in the examples.

Suggestion:

  1. ServiceContext::ConfigureFromPassedArray should accept an ippBaseUrl value. This is passed to LocalConfigReader::ReadConfigurationFromParameters() which should then set the value in IppConfiguration->BaseUrl->Ipp
  2. Why not default /src/Core/Configuration/BaseUrl.php $ipp property to https://appcenter.intuit.com/api/ ? It doesn't change between sandbox and production anyway.

Setting Customer->PrimaryEmailAddr does not work correctly

I believe this is an issue with the upload process (or maybe a validation error).

I set the PrimaryEmailAddr value, upload the object but the returned object does not have PrimaryEmailAddr set.

print_r of before upload:

QuickBooksOnline\API\Data\IPPCustomer Object
(
    [Taxable] => 
    [BillAddr] => 
    [ShipAddr] => 
    [OtherAddr] => 
    [ContactName] => 
    [AltContactName] => 
    [Notes] => 
    [Job] => 
    [BillWithParent] => 
    [RootCustomerRef] => 
    [ParentRef] => 
    [Level] => 
    [CustomerTypeRef] => 
    [SalesTermRef] => 
    [SalesRepRef] => 
    [TaxGroupCodeRef] => 
    [TaxRateRef] => 
    [PaymentMethodRef] => 
    [CCDetail] => 
    [PriceLevelRef] => 
    [Balance] => 
    [OpenBalanceDate] => 
    [BalanceWithJobs] => 
    [CreditLimit] => 
    [AcctNum] => 
    [CurrencyRef] => 
    [OverDueBalance] => 
    [TotalRevenue] => 
    [TotalExpense] => 
    [PreferredDeliveryMethod] => 
    [ResaleNum] => 
    [JobInfo] => 
    [TDSEnabled] => 
    [CustomerEx] => 
    [SecondaryTaxIdentifier] => 
    [ARAccountRef] => 
    [PrimaryTaxIdentifier] => 
    [IntuitId] => 
    [Organization] => 
    [Title] => 
    [GivenName] => Test
    [MiddleName] => 
    [FamilyName] => User
    [Suffix] => 
    [FullyQualifiedName] => 
    [CompanyName] => Test User Inc
    [DisplayName] => [email protected]
    [PrintOnCheckName] => 
    [UserId] => 
    [Active] => 
    [PrimaryPhone] => 
    [AlternatePhone] => 
    [Mobile] => 
    [Fax] => 
    [PrimaryEmailAddr] => [email protected]
    [WebAddr] => 
    [OtherContactInfo] => 
    [DefaultTaxCodeRef] => 
    [Id] => 
    [SyncToken] => 
    [MetaData] => 
    [CustomField] => 
    [AttachableRef] => 
    [domain] => 
    [status] => 
    [sparse] => 
)

and a print_r of the returned object

QuickBooksOnline\API\Data\IPPCustomer Object
(
    [Taxable] => false
    [BillAddr] => 
    [ShipAddr] => 
    [OtherAddr] => 
    [ContactName] => 
    [AltContactName] => 
    [Notes] => 
    [Job] => false
    [BillWithParent] => false
    [RootCustomerRef] => 
    [ParentRef] => 
    [Level] => 
    [CustomerTypeRef] => 
    [SalesTermRef] => 
    [SalesRepRef] => 
    [TaxGroupCodeRef] => 
    [TaxRateRef] => 
    [PaymentMethodRef] => 
    [CCDetail] => 
    [PriceLevelRef] => 
    [Balance] => 0
    [OpenBalanceDate] => 
    [BalanceWithJobs] => 0
    [CreditLimit] => 
    [AcctNum] => 
    [CurrencyRef] => GBP
    [OverDueBalance] => 
    [TotalRevenue] => 
    [TotalExpense] => 
    [PreferredDeliveryMethod] => None
    [ResaleNum] => 
    [JobInfo] => 
    [TDSEnabled] => 
    [CustomerEx] => 
    [SecondaryTaxIdentifier] => 
    [ARAccountRef] => 
    [PrimaryTaxIdentifier] => 
    [IntuitId] => 
    [Organization] => 
    [Title] => 
    [GivenName] => Test
    [MiddleName] => 
    [FamilyName] => User
    [Suffix] => 
    [FullyQualifiedName] => [email protected]
    [CompanyName] => Test User Inc
    [DisplayName] => [email protected]
    [PrintOnCheckName] => Test User Inc
    [UserId] => 
    [Active] => true
    [PrimaryPhone] => 
    [AlternatePhone] => 
    [Mobile] => 
    [Fax] => 
    [PrimaryEmailAddr] => 
    [WebAddr] => 
    [OtherContactInfo] => 
    [DefaultTaxCodeRef] => 
    [Id] => 82
    [SyncToken] => 0
    [MetaData] => QuickBooksOnline\API\Data\IPPModificationMetaData Object
        (
            [CreatedByRef] => 
            [CreateTime] => 2017-06-01T08:22:10-07:00
            [LastModifiedByRef] => 
            [LastUpdatedTime] => 2017-06-01T08:22:10-07:00
            [LastChangedInQB] => 
            [Synchronized] => 
        )

    [CustomField] => 
    [AttachableRef] => 
    [domain] => 
    [status] => 
    [sparse] => 
)

revoke access method?

Hi

I am having a hard time locating the OAuth2PlatformClient class with revokeToken() mentioned in the documentation as the proper way to disconnect an Oauth2 connection. Am I missing something? Any help appreciated.

Documentation:

"To revoke the access or refresh tokens and invalidate access, use the revokeToken() method in the OAuth2PlatformClient class. The following example revokes the Refresh token:

//Revoke the token
$client->revokeOAuth2AccessTokens($accessToken, $refreshToken);

/Core/HttpClients/FaultHandler triggers fatal error

message being passed to parseResponse:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><FaultInfo xmlns="http://www.intuit.com/sb/cdm/baseexceptionmodel/xsd"><Message>Bad Request</Message><ErrorCode>400</ErrorCode><Cause>CLIENT</Cause></FaultInfo>

Warning: .../vendor/quickbooks/v3-php-sdk/src/Core/HttpClients/FaultHandler.php (line 119): QuickBooksOnline\API\Core\HttpClients\FaultHandler::parseResponse(): Node no longer exists
Fatal Error: .../vendor/quickbooks/v3-php-sdk/src/Core/HttpClients/FaultHandler.php (line 124): Call to a member function attributes() on null

caused by attempting to update preferences

$prefs = $dataService->FindAll('Preferences');
// prefs is an array of QuickBooksOnline\API\Data\IPPPreferences objects (length: 1)
$prefs = $prefs[0];
$dataService->Update($prefs);

How does one update preferences via the SDK?

Edit: 2017-08-01:
for what it's worth, the request body generated by the SDK also fails in the API explorer
https://developer.intuit.com/v2/apiexplorer?apiname=V3QBO#?id=Preferences

Php2Xml breaks in Zend

Php2Xml constructor checks if \Zend_Registry class exists (it does in Zend 1), and then tries to use \Zend_Registry::get('logger'). This however throws and exception with message No entry is registered for key 'logger' if the logger is not registered.

I already created a PR for this issue

#15

Facade Class Does not handle primitive type data

For using Facade class to create Object, the value assigned to each field can only be either a)a string or integer or b) a complex object type matching the type of the field, it cannot be boolean value, however.
An Item created using like this will not work:
$item = Item::create([
"Name" => "1ParentRef_Inventory",
"Description"=> "Sales for it would be good",
"Active"=> true,
"SubItem"=> true,
"ParentRef"=> [
"value"=> "1",
"name"=> "Services"
],
"Taxable"=> true,
"UnitPrice"=> 10,
"Type"=> "Inventory",
"IncomeAccountRef"=> [
"value"=> "79",
"name"=> "Sales of Product Income"
],
"PurchaseDesc"=> "Purchase information",
"PurchaseCost"=> 10,
"ExpenseAccountRef"=> [
"value"=> "80",
"name"=>"Cost of Goods Sold"
],
"AssetAccountRef"=> [
"value"=> "81",
"name"=> "Inventory Asset"
],
"TrackQtyOnHand"=> true,
"QtyOnHand"=> 10,
"InvStartDate"=> "2017-07-27",
"domain"=> "QBO"
]);
The request will be:
<ns0:Item xmlns:ns0="http://schema.intuit.com/finance/v3" domain="QBO">
ns0:Name1223ParentRef_Inventory</ns0:Name>
ns0:DescriptionSales for it would be good</ns0:Description>
ns0:Active/
ns0:SubItem/
<ns0:ParentRef name="Services">1</ns0:ParentRef>
ns0:Taxable/
ns0:UnitPrice10</ns0:UnitPrice>
ns0:TypeInventory</ns0:Type>
<ns0:IncomeAccountRef name="Sales of Product Income">79</ns0:IncomeAccountRef>
ns0:PurchaseDescPurchase information</ns0:PurchaseDesc>
ns0:PurchaseCost10</ns0:PurchaseCost>
<ns0:ExpenseAccountRef name="Cost of Goods Sold">80</ns0:ExpenseAccountRef>
<ns0:AssetAccountRef name="Inventory Asset">81</ns0:AssetAccountRef>
ns0:TrackQtyOnHand/
ns0:QtyOnHand10</ns0:QtyOnHand>
ns0:InvStartDate2017-07-27</ns0:InvStartDate>
</ns0:Item>

It needs to be like this:
$item = Item::create([
"Name" => "1ParentRef_Inventory",
"Description"=> "Sales for it would be good",
"Active"=> "true",
"SubItem"=> "true",
"ParentRef"=> [
"value"=> "1",
"name"=> "Services"
],
"Taxable"=> "true",
"UnitPrice"=> "10",
"Type"=> "Inventory",
"IncomeAccountRef"=> [
"value"=> "79",
"name"=> "Sales of Product Income"
],
"PurchaseDesc"=> "Purchase information",
"PurchaseCost"=> "10",
"ExpenseAccountRef"=> [
"value"=> "80",
"name"=>"Cost of Goods Sold"
],
"AssetAccountRef"=> [
"value"=> "81",
"name"=> "Inventory Asset"
],
"TrackQtyOnHand"=> "true",
"QtyOnHand"=> "10",
"InvStartDate"=> "2017-07-27",
"domain"=> "QBO"
]);

Composer Versioning

Hi guys, we're developing a client services portal on behalf of a client that will tie into your API and serve some custom reports to their clientele. My question is simply about composer and your versioning... I don't see any official "Releases" or tags, but I see that the current version is 2.6.

For obvious reasons it's important to be able to test a new version before pushing it to production, but without release tags, I can't do that. Am I missing something, or, are you able to use tagging to tag your releases so we can properly test future releases before pushing to our production branch.

Thanks.

Kevin.

DataService->Query() has unused params

here's the docblock and function signature for the Query method

    /**
     * Retrieves specified entities based passed page number and page size and query
     *
     * @param string $query Query to issue
     * @param int $pageNumber Starting page number
     * @param int $pageSize Page size
     * @return array Returns an array of entities fulfilling the query.
     */
    public function Query($query, $pageNumber = 0, $pageSize = 500)

$pageNumber and $pageSize are UNUSED... passing values does absolutely nothing
(there's no func_get_args() type call to grab these param values either)

if someone wants to specify page & pagesize, they need to specify it in the query
ie: STARTPOSITION 11 MAXRESULTS 10

unrelated: only being able to pass 30 entities in a batch request seems pretty weak.

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.